Mercurial > dovecot > original-hg > dovecot-1.2
changeset 7423:bd54359bfb3a HEAD
If first message is expunged from expire_altmove mailbox, don't update dict.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 16 Mar 2008 12:28:58 +0200 |
parents | ae746a73e51e |
children | a2bc615e026d |
files | src/plugins/expire/expire-env.c src/plugins/expire/expire-env.h src/plugins/expire/expire-plugin.c |
diffstat | 3 files changed, 28 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/src/plugins/expire/expire-env.c Sun Mar 16 12:10:51 2008 +0200 +++ b/src/plugins/expire/expire-env.c Sun Mar 16 12:28:58 2008 +0200 @@ -105,10 +105,17 @@ return expunge_min > 0 || altmove_min > 0; } -unsigned int expire_box_find_min_secs(struct expire_env *env, const char *name) +unsigned int expire_box_find_min_secs(struct expire_env *env, const char *name, + bool *altmove_r) { unsigned int secs1, secs2; (void)expire_box_find(env, name, &secs1, &secs2); - return secs1 < secs2 && secs1 != 0 ? secs1 : secs2; + if (secs1 < secs2 && secs1 != 0) { + *altmove_r = FALSE; + return secs1; + } else { + *altmove_r = TRUE; + return secs2; + } }
--- a/src/plugins/expire/expire-env.h Sun Mar 16 12:10:51 2008 +0200 +++ b/src/plugins/expire/expire-env.h Sun Mar 16 12:28:58 2008 +0200 @@ -10,6 +10,7 @@ unsigned int *expunge_secs_r, unsigned int *altmove_secs_r); -unsigned int expire_box_find_min_secs(struct expire_env *env, const char *name); +unsigned int expire_box_find_min_secs(struct expire_env *env, const char *name, + bool *altmove_r); #endif
--- a/src/plugins/expire/expire-plugin.c Sun Mar 16 12:10:51 2008 +0200 +++ b/src/plugins/expire/expire-plugin.c Sun Mar 16 12:28:58 2008 +0200 @@ -29,6 +29,7 @@ struct expire_mailbox { union mailbox_module_context module_ctx; time_t expire_secs; + unsigned int altmove:1; }; struct expire_transaction_context { @@ -78,16 +79,16 @@ for (seq = 2; seq <= hdr->messages_count; seq++) { if (!mail_index_is_expunged(view, seq)) { mail_set_seq(mail, seq); - if (mail_get_save_date(mail, stamp_r) == 0) { - mail_free(&mail); - return; - } + if (mail_get_save_date(mail, stamp_r) == 0) + break; } } mail_free(&mail); - /* everything expunged */ - *stamp_r = 0; + if (seq > hdr->messages_count) { + /* everything expunged */ + *stamp_r = 0; + } } static int @@ -103,7 +104,9 @@ bool update_dict = FALSE; int ret; - if (xt->first_expunged) { + if (xpr_box->altmove) { + /* only moving mails - don't update the move stamps */ + } else if (xt->first_expunged) { /* first mail expunged. dict needs updating. */ first_nonexpunged_timestamp(t, &new_stamp); update_dict = TRUE; @@ -219,7 +222,8 @@ copy(t, mail, flags, keywords, dest_mail); } -static void mailbox_expire_hook(struct mailbox *box, time_t expire_secs) +static void +mailbox_expire_hook(struct mailbox *box, time_t expire_secs, bool altmove) { struct expire_mailbox *xpr_box; @@ -233,6 +237,7 @@ box->v.save_finish = expire_save_finish; box->v.copy = expire_copy; + xpr_box->altmove = altmove; xpr_box->expire_secs = expire_secs; MODULE_CONTEXT_SET(box, expire_storage_module, xpr_box); @@ -247,15 +252,17 @@ struct mailbox *box; string_t *vname; unsigned int secs; + bool altmove; box = xpr_storage->super.mailbox_open(storage, name, input, flags); if (box != NULL) { vname = t_str_new(128); (void)mail_namespace_get_vname(storage->ns, vname, name); - secs = expire_box_find_min_secs(expire.env, str_c(vname)); + secs = expire_box_find_min_secs(expire.env, str_c(vname), + &altmove); if (secs != 0) - mailbox_expire_hook(box, secs); + mailbox_expire_hook(box, secs, altmove); } return box; }