dovecot-1.2: Mail copying API changed to be based on save API. T...
dovecot at dovecot.org
dovecot at dovecot.org
Fri Feb 6 19:49:54 EET 2009
details: http://hg.dovecot.org/dovecot-1.2/rev/68db63cc32b3
changeset: 8726:68db63cc32b3
user: Timo Sirainen <tss at iki.fi>
date: Fri Feb 06 12:49:46 2009 -0500
description:
Mail copying API changed to be based on save API. This allows extending it easily in future.
diffstat:
15 files changed, 90 insertions(+), 93 deletions(-)
src/deliver/deliver.c | 5 ++
src/imap/cmd-copy.c | 9 ++++-
src/lib-storage/index/maildir/maildir-copy.c | 23 ++++++-------
src/lib-storage/index/maildir/maildir-storage.h | 4 --
src/lib-storage/mail-copy.c | 40 +++++++++++------------
src/lib-storage/mail-copy.h | 4 --
src/lib-storage/mail-storage-private.h | 5 --
src/lib-storage/mail-storage.c | 11 +++---
src/lib-storage/mail-storage.h | 9 +----
src/plugins/acl/acl-mailbox.c | 15 ++++----
src/plugins/convert/convert-storage.c | 7 ++--
src/plugins/expire/expire-plugin.c | 14 +++-----
src/plugins/mail-log/mail-log-plugin.c | 16 ++++-----
src/plugins/mbox-snarf/mbox-snarf-plugin.c | 5 +-
src/plugins/quota/quota-storage.c | 16 ++++-----
diffs (truncated from 416 to 300 lines):
diff -r c7142c9ac3c1 -r 68db63cc32b3 src/deliver/deliver.c
--- a/src/deliver/deliver.c Fri Feb 06 12:48:38 2009 -0500
+++ b/src/deliver/deliver.c Fri Feb 06 12:49:46 2009 -0500
@@ -204,6 +204,7 @@ int deliver_save(struct mail_namespace *
{
struct mailbox *box;
struct mailbox_transaction_context *t;
+ struct mail_save_context *save_ctx;
struct mail_keywords *kw;
enum mail_error error;
const char *mailbox_name;
@@ -237,7 +238,9 @@ int deliver_save(struct mail_namespace *
kw = str_array_length(keywords) == 0 ? NULL :
mailbox_keywords_create_valid(box, keywords);
- if (mailbox_copy(t, mail, flags, kw, NULL) < 0)
+ save_ctx = mailbox_save_alloc(t);
+ mailbox_save_set_flags(save_ctx, flags, kw);
+ if (mailbox_copy(&save_ctx, mail) < 0)
ret = -1;
mailbox_keywords_free(box, &kw);
diff -r c7142c9ac3c1 -r 68db63cc32b3 src/imap/cmd-copy.c
--- a/src/imap/cmd-copy.c Fri Feb 06 12:48:38 2009 -0500
+++ b/src/imap/cmd-copy.c Fri Feb 06 12:49:46 2009 -0500
@@ -35,6 +35,7 @@ static int fetch_and_copy(struct client
{
struct mail_search_context *search_ctx;
struct mailbox_transaction_context *src_trans;
+ struct mail_save_context *save_ctx;
struct mail_keywords *keywords;
const char *const *keywords_list;
struct mail *mail;
@@ -64,8 +65,12 @@ static int fetch_and_copy(struct client
keywords_list = mail_get_keywords(mail);
keywords = str_array_length(keywords_list) == 0 ? NULL :
mailbox_keywords_create_valid(destbox, keywords_list);
- if (mailbox_copy(t, mail, mail_get_flags(mail),
- keywords, NULL) < 0)
+
+ save_ctx = mailbox_save_alloc(t);
+ mailbox_save_set_flags(save_ctx, mail_get_flags(mail),
+ keywords);
+
+ if (mailbox_copy(&save_ctx, mail) < 0)
ret = mail->expunged ? 0 : -1;
mailbox_keywords_free(destbox, &keywords);
diff -r c7142c9ac3c1 -r 68db63cc32b3 src/lib-storage/index/maildir/maildir-copy.c
--- a/src/lib-storage/index/maildir/maildir-copy.c Fri Feb 06 12:48:38 2009 -0500
+++ b/src/lib-storage/index/maildir/maildir-copy.c Fri Feb 06 12:49:46 2009 -0500
@@ -259,29 +259,28 @@ maildir_compatible_file_modes(struct mai
box1->file_create_gid == box2->file_create_gid;
}
-int maildir_copy(struct mailbox_transaction_context *_t, struct mail *mail,
- enum mail_flags flags, struct mail_keywords *keywords,
- struct mail *dest_mail)
+int maildir_copy(struct mail_save_context *ctx, struct mail *mail)
{
struct maildir_transaction_context *t =
- (struct maildir_transaction_context *)_t;
+ (struct maildir_transaction_context *)ctx->transaction;
struct maildir_mailbox *mbox = (struct maildir_mailbox *)t->ictx.ibox;
int ret;
if (mbox->storage->copy_with_hardlinks &&
maildir_compatible_file_modes(&mbox->ibox.box, mail->box)) {
T_BEGIN {
- ret = maildir_copy_hardlink(t, mail, flags,
- keywords, dest_mail);
+ ret = maildir_copy_hardlink(t, mail, ctx->flags,
+ ctx->keywords,
+ ctx->dest_mail);
} T_END;
- if (ret > 0)
- return 0;
- if (ret < 0)
- return -1;
+ if (ret != 0) {
+ index_save_context_free(ctx);
+ return ret > 0 ? 0 : -1;
+ }
/* non-fatal hardlinking failure, try the slow way */
}
- return mail_storage_copy(_t, mail, flags, keywords, dest_mail);
-}
+ return mail_storage_copy(ctx, mail);
+}
diff -r c7142c9ac3c1 -r 68db63cc32b3 src/lib-storage/index/maildir/maildir-storage.h
--- a/src/lib-storage/index/maildir/maildir-storage.h Fri Feb 06 12:48:38 2009 -0500
+++ b/src/lib-storage/index/maildir/maildir-storage.h Fri Feb 06 12:49:46 2009 -0500
@@ -148,9 +148,7 @@ void maildir_transaction_save_commit_pos
void maildir_transaction_save_commit_post(struct maildir_save_context *ctx);
void maildir_transaction_save_rollback(struct maildir_save_context *ctx);
-int maildir_copy(struct mailbox_transaction_context *t, struct mail *mail,
- enum mail_flags flags, struct mail_keywords *keywords,
- struct mail *dest_mail);
+int maildir_copy(struct mail_save_context *ctx, struct mail *mail);
int maildir_transaction_copy_commit(struct maildir_copy_context *ctx);
void maildir_transaction_copy_rollback(struct maildir_copy_context *ctx);
diff -r c7142c9ac3c1 -r 68db63cc32b3 src/lib-storage/mail-copy.c
--- a/src/lib-storage/mail-copy.c Fri Feb 06 12:48:38 2009 -0500
+++ b/src/lib-storage/mail-copy.c Fri Feb 06 12:49:46 2009 -0500
@@ -5,33 +5,33 @@
#include "mail-storage-private.h"
#include "mail-copy.h"
-int mail_storage_copy(struct mailbox_transaction_context *t, struct mail *mail,
- enum mail_flags flags, struct mail_keywords *keywords,
- struct mail *dest_mail)
+int mail_storage_copy(struct mail_save_context *ctx, struct mail *mail)
{
- struct mail_save_context *ctx;
struct istream *input;
const char *from_envelope, *guid;
time_t received_date;
if (mail_get_stream(mail, NULL, NULL, &input) < 0)
return -1;
- if (mail_get_received_date(mail, &received_date) < 0)
- return -1;
- if (mail_get_special(mail, MAIL_FETCH_FROM_ENVELOPE,
- &from_envelope) < 0)
- return -1;
- if (mail_get_special(mail, MAIL_FETCH_GUID, &guid) < 0)
- return -1;
- ctx = mailbox_save_alloc(t);
- mailbox_save_set_flags(ctx, flags, keywords);
- mailbox_save_set_received_date(ctx, received_date, 0);
- if (*from_envelope != '\0')
- mailbox_save_set_from_envelope(ctx, from_envelope);
- if (*guid != '\0')
- mailbox_save_set_guid(ctx, guid);
- mailbox_save_set_dest_mail(ctx, dest_mail);
+ if (ctx->received_date == (time_t)-1) {
+ if (mail_get_received_date(mail, &received_date) < 0)
+ return -1;
+ mailbox_save_set_received_date(ctx, received_date, 0);
+ }
+ if (ctx->from_envelope == NULL) {
+ if (mail_get_special(mail, MAIL_FETCH_FROM_ENVELOPE,
+ &from_envelope) < 0)
+ return -1;
+ if (*from_envelope != '\0')
+ mailbox_save_set_from_envelope(ctx, from_envelope);
+ }
+ if (ctx->guid == NULL) {
+ if (mail_get_special(mail, MAIL_FETCH_GUID, &guid) < 0)
+ return -1;
+ if (*guid != '\0')
+ mailbox_save_set_guid(ctx, guid);
+ }
if (mailbox_save_begin(&ctx, input) < 0)
return -1;
@@ -42,7 +42,7 @@ int mail_storage_copy(struct mailbox_tra
} while (i_stream_read(input) != -1);
if (input->stream_errno != 0) {
- mail_storage_set_critical(t->box->storage,
+ mail_storage_set_critical(ctx->transaction->box->storage,
"copy: i_stream_read() failed: %m");
mailbox_save_cancel(&ctx);
return -1;
diff -r c7142c9ac3c1 -r 68db63cc32b3 src/lib-storage/mail-copy.h
--- a/src/lib-storage/mail-copy.h Fri Feb 06 12:48:38 2009 -0500
+++ b/src/lib-storage/mail-copy.h Fri Feb 06 12:49:46 2009 -0500
@@ -1,8 +1,6 @@
#ifndef MAIL_COPY_H
#define MAIL_COPY_H
-int mail_storage_copy(struct mailbox_transaction_context *t, struct mail *mail,
- enum mail_flags flags, struct mail_keywords *keywords,
- struct mail *dest_mail);
+int mail_storage_copy(struct mail_save_context *ctx, struct mail *mail);
#endif
diff -r c7142c9ac3c1 -r 68db63cc32b3 src/lib-storage/mail-storage-private.h
--- a/src/lib-storage/mail-storage-private.h Fri Feb 06 12:48:38 2009 -0500
+++ b/src/lib-storage/mail-storage-private.h Fri Feb 06 12:49:46 2009 -0500
@@ -176,10 +176,7 @@ struct mailbox_vfuncs {
int (*save_continue)(struct mail_save_context *ctx);
int (*save_finish)(struct mail_save_context *ctx);
void (*save_cancel)(struct mail_save_context *ctx);
-
- int (*copy)(struct mailbox_transaction_context *t, struct mail *mail,
- enum mail_flags flags, struct mail_keywords *keywords,
- struct mail *dest_mail);
+ int (*copy)(struct mail_save_context *ctx, struct mail *mail);
bool (*is_inconsistent)(struct mailbox *box);
};
diff -r c7142c9ac3c1 -r 68db63cc32b3 src/lib-storage/mail-storage.c
--- a/src/lib-storage/mail-storage.c Fri Feb 06 12:48:38 2009 -0500
+++ b/src/lib-storage/mail-storage.c Fri Feb 06 12:49:46 2009 -0500
@@ -915,11 +915,12 @@ void mailbox_save_cancel(struct mail_sav
ctx->transaction->box->v.save_cancel(ctx);
}
-int mailbox_copy(struct mailbox_transaction_context *t, struct mail *mail,
- enum mail_flags flags, struct mail_keywords *keywords,
- struct mail *dest_mail)
-{
- return t->box->v.copy(t, mail, flags, keywords, dest_mail);
+int mailbox_copy(struct mail_save_context **_ctx, struct mail *mail)
+{
+ struct mail_save_context *ctx = *_ctx;
+
+ *_ctx = NULL;
+ return ctx->transaction->box->v.copy(ctx, mail);
}
bool mailbox_is_inconsistent(struct mailbox *box)
diff -r c7142c9ac3c1 -r 68db63cc32b3 src/lib-storage/mail-storage.h
--- a/src/lib-storage/mail-storage.h Fri Feb 06 12:48:38 2009 -0500
+++ b/src/lib-storage/mail-storage.h Fri Feb 06 12:49:46 2009 -0500
@@ -527,12 +527,9 @@ int mailbox_save_finish(struct mail_save
int mailbox_save_finish(struct mail_save_context **ctx);
void mailbox_save_cancel(struct mail_save_context **ctx);
-/* Copy given message. If dest_mail is non-NULL, the copied message can be
- accessed using it. Note that setting it non-NULL may require mailbox
- syncing, so don't give give it unless you need it. */
-int mailbox_copy(struct mailbox_transaction_context *t, struct mail *mail,
- enum mail_flags flags, struct mail_keywords *keywords,
- struct mail *dest_mail);
+/* Copy the given message. You'll need to specify the flags etc. using the
+ mailbox_save_*() functions. */
+int mailbox_copy(struct mail_save_context **ctx, struct mail *mail);
/* Returns TRUE if mailbox is now in inconsistent state, meaning that
the message IDs etc. may have changed - only way to recover this
diff -r c7142c9ac3c1 -r 68db63cc32b3 src/plugins/acl/acl-mailbox.c
--- a/src/plugins/acl/acl-mailbox.c Fri Feb 06 12:48:38 2009 -0500
+++ b/src/plugins/acl/acl-mailbox.c Fri Feb 06 12:49:46 2009 -0500
@@ -287,10 +287,9 @@ acl_save_begin(struct mail_save_context
}
static int
-acl_copy(struct mailbox_transaction_context *t, struct mail *mail,
- enum mail_flags flags, struct mail_keywords *keywords,
- struct mail *dest_mail)
-{
+acl_copy(struct mail_save_context *ctx, struct mail *mail)
+{
+ struct mailbox_transaction_context *t = ctx->transaction;
struct acl_mailbox *abox = ACL_CONTEXT(t->box);
enum acl_storage_rights save_right;
@@ -298,10 +297,10 @@ acl_copy(struct mailbox_transaction_cont
ACL_STORAGE_RIGHT_POST : ACL_STORAGE_RIGHT_INSERT;
if (acl_mailbox_right_lookup(t->box, save_right) <= 0)
return -1;
- if (acl_save_get_flags(t->box, &flags, &keywords) < 0)
- return -1;
-
- return abox->module_ctx.super.copy(t, mail, flags, keywords, dest_mail);
+ if (acl_save_get_flags(t->box, &ctx->flags, &ctx->keywords) < 0)
+ return -1;
+
+ return abox->module_ctx.super.copy(ctx, mail);
}
static int
diff -r c7142c9ac3c1 -r 68db63cc32b3 src/plugins/convert/convert-storage.c
--- a/src/plugins/convert/convert-storage.c Fri Feb 06 12:48:38 2009 -0500
+++ b/src/plugins/convert/convert-storage.c Fri Feb 06 12:49:46 2009 -0500
@@ -34,6 +34,7 @@ static int mailbox_copy_mails(struct mai
{
struct mail_search_context *ctx;
struct mailbox_transaction_context *src_trans, *dest_trans;
+ struct mail_save_context *save_ctx;
struct mail *mail;
struct mail_search_args *search_args;
int ret = 0;
@@ -72,8 +73,10 @@ static int mailbox_copy_mails(struct mai
keywords = str_array_length(keywords_list) == 0 ? NULL :
mailbox_keywords_create_valid(destbox, keywords_list);
- ret = mailbox_copy(dest_trans, mail, mail_get_flags(mail),
- keywords, NULL);
+ save_ctx = mailbox_save_alloc(dest_trans);
+ mailbox_save_set_flags(save_ctx, mail_get_flags(mail),
+ keywords);
+ ret = mailbox_copy(&save_ctx, mail);
mailbox_keywords_free(destbox, &keywords);
if (ret < 0) {
*error_r = storage_error(destbox->storage);
diff -r c7142c9ac3c1 -r 68db63cc32b3 src/plugins/expire/expire-plugin.c
--- a/src/plugins/expire/expire-plugin.c Fri Feb 06 12:48:38 2009 -0500
+++ b/src/plugins/expire/expire-plugin.c Fri Feb 06 12:49:46 2009 -0500
@@ -213,16 +213,14 @@ static int expire_save_finish(struct mai
}
More information about the dovecot-cvs
mailing list