Mercurial > dovecot > core-2.2
changeset 3641:3de464cb604f HEAD
Added flags and keywords parameters to mailbox_copy() in case they're wanted
to be changed while copying.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 07 Oct 2005 12:34:04 +0300 |
parents | e06617e148fc |
children | aab106e80c3c |
files | src/imap/cmd-copy.c src/lib-storage/index/maildir/maildir-copy.c src/lib-storage/index/maildir/maildir-storage.h src/lib-storage/mail-copy.c src/lib-storage/mail-copy.h src/lib-storage/mail-storage-private.h src/lib-storage/mail-storage.c src/lib-storage/mail-storage.h |
diffstat | 8 files changed, 32 insertions(+), 28 deletions(-) [+] |
line wrap: on
line diff
--- a/src/imap/cmd-copy.c Wed Oct 05 22:44:05 2005 +0300 +++ b/src/imap/cmd-copy.c Fri Oct 07 12:34:04 2005 +0300 @@ -11,6 +11,8 @@ { struct mail_search_context *search_ctx; struct mailbox_transaction_context *src_trans; + struct mail_keywords *keywords; + const char *const *keywords_list; struct mail *mail; int ret; @@ -20,15 +22,19 @@ mail = mail_alloc(src_trans, MAIL_FETCH_STREAM_HEADER | MAIL_FETCH_STREAM_BODY, NULL); ret = 1; - while (mailbox_search_next(search_ctx, mail) > 0) { + while (mailbox_search_next(search_ctx, mail) > 0 && ret > 0) { if (mail->expunged) { ret = 0; break; } - if (mailbox_copy(t, mail, NULL) < 0) { + + keywords_list = mail_get_keywords(mail); + keywords = strarray_length(keywords_list) == 0 ? NULL : + mailbox_keywords_create(t, keywords_list); + if (mailbox_copy(t, mail, mail_get_flags(mail), + keywords, NULL) < 0) ret = -1; - break; - } + mailbox_keywords_free(t, keywords); } mail_free(mail);
--- a/src/lib-storage/index/maildir/maildir-copy.c Wed Oct 05 22:44:05 2005 +0300 +++ b/src/lib-storage/index/maildir/maildir-copy.c Fri Oct 07 12:34:04 2005 +0300 @@ -55,31 +55,28 @@ return 1; } -static int maildir_copy_hardlink(struct mail *mail, - struct maildir_copy_context *ctx) +static int +maildir_copy_hardlink(struct mail *mail, + enum mail_flags flags, struct mail_keywords *keywords, + struct maildir_copy_context *ctx) { struct index_mail *imail = (struct index_mail *)mail; struct maildir_mailbox *mbox = (struct maildir_mailbox *)imail->ibox; struct hardlink_ctx do_ctx; struct rollback *rb; - enum mail_flags flags; - const char *const *keywords; const char *dest_fname; - array_t ARRAY_DEFINE(keywords_arr, const char *); - unsigned int count; + array_t ARRAY_DEFINE(keywords_arr, unsigned int); - flags = mail_get_flags(mail); - keywords = mail_get_keywords(mail); dest_fname = maildir_generate_tmp_filename(&ioloop_timeval); - count = strarray_length(keywords); - if (count > 0) { + if (keywords->count > 0) { ARRAY_CREATE(&keywords_arr, pool_datastack_create(), - const char *, count); - array_append(&keywords_arr, keywords, count); + unsigned int, keywords->count); + array_append(&keywords_arr, keywords->idx, keywords->count); } dest_fname = maildir_filename_set_flags(NULL, // FIXME: !!! - dest_fname, flags, count != 0 ? + dest_fname, flags, + keywords->count != 0 ? &keywords_arr : NULL); memset(&do_ctx, 0, sizeof(do_ctx)); @@ -137,6 +134,7 @@ } int maildir_copy(struct mailbox_transaction_context *_t, struct mail *mail, + enum mail_flags flags, struct mail_keywords *keywords, struct mail *dest_mail) { struct maildir_transaction_context *t = @@ -153,7 +151,7 @@ mail->box->storage == STORAGE(ctx->mbox->storage)) { // FIXME: handle dest_mail t_push(); - ret = maildir_copy_hardlink(mail, ctx); + ret = maildir_copy_hardlink(mail, flags, keywords, ctx); t_pop(); if (ret > 0) @@ -164,5 +162,5 @@ /* non-fatal hardlinking failure, try the slow way */ } - return mail_storage_copy(_t, mail, dest_mail); + return mail_storage_copy(_t, mail, flags, keywords, dest_mail); }
--- a/src/lib-storage/index/maildir/maildir-storage.h Wed Oct 05 22:44:05 2005 +0300 +++ b/src/lib-storage/index/maildir/maildir-storage.h Fri Oct 07 12:34:04 2005 +0300 @@ -126,6 +126,7 @@ 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_transaction_copy_commit(struct maildir_copy_context *ctx); void maildir_transaction_copy_rollback(struct maildir_copy_context *ctx);
--- a/src/lib-storage/mail-copy.c Wed Oct 05 22:44:05 2005 +0300 +++ b/src/lib-storage/mail-copy.c Fri Oct 07 12:34:04 2005 +0300 @@ -6,12 +6,12 @@ #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) { struct mail_save_context *ctx; struct istream *input; - struct mail_keywords *keywords; - const char *from_envelope, *const *keywords_list; + const char *from_envelope; input = mail_get_stream(mail, NULL, NULL); if (input == NULL) @@ -19,14 +19,9 @@ from_envelope = mail_get_special(mail, MAIL_FETCH_FROM_ENVELOPE); - keywords_list = mail_get_keywords(mail); - keywords = keywords_list == NULL ? NULL : - mailbox_keywords_create(t, keywords_list); - ctx = mailbox_save_init(t, mail_get_flags(mail), keywords, + ctx = mailbox_save_init(t, flags, keywords, mail_get_received_date(mail), 0, from_envelope, input, dest_mail != NULL); - if (keywords != NULL) - mailbox_keywords_free(t, keywords); while (i_stream_read(input) != -1) { if (mailbox_save_continue(ctx) < 0)
--- a/src/lib-storage/mail-copy.h Wed Oct 05 22:44:05 2005 +0300 +++ b/src/lib-storage/mail-copy.h Fri Oct 07 12:34:04 2005 +0300 @@ -2,6 +2,7 @@ #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); #endif
--- a/src/lib-storage/mail-storage-private.h Wed Oct 05 22:44:05 2005 +0300 +++ b/src/lib-storage/mail-storage-private.h Fri Oct 07 12:34:04 2005 +0300 @@ -143,6 +143,7 @@ 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 (*is_inconsistent)(struct mailbox *box);
--- a/src/lib-storage/mail-storage.c Wed Oct 05 22:44:05 2005 +0300 +++ b/src/lib-storage/mail-storage.c Fri Oct 07 12:34:04 2005 +0300 @@ -454,9 +454,10 @@ } 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, dest_mail); + return t->box->v.copy(t, mail, flags, keywords, dest_mail); } int mailbox_is_inconsistent(struct mailbox *box)
--- a/src/lib-storage/mail-storage.h Wed Oct 05 22:44:05 2005 +0300 +++ b/src/lib-storage/mail-storage.h Fri Oct 07 12:34:04 2005 +0300 @@ -395,6 +395,7 @@ 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); /* Returns TRUE if mailbox is now in inconsistent state, meaning that