From: Josef 'Jeff' Sipek Date: Tue, 14 Jan 2020 22:27:37 +0000 (-0500) Subject: lib-storage: Move mail autoexpunge loop into a helper function X-Git-Tag: 2.3.10~45 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2934323c2eb3cb3a26967428398f89f59da5cb73;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Move mail autoexpunge loop into a helper function This makes the next commit easier. --- diff --git a/src/lib-storage/mail-autoexpunge.c b/src/lib-storage/mail-autoexpunge.c index 11740c3c2d..2373f54036 100644 --- a/src/lib-storage/mail-autoexpunge.c +++ b/src/lib-storage/mail-autoexpunge.c @@ -43,50 +43,22 @@ mailbox_autoexpunge_lock(struct mail_user *user, struct file_lock **lock) } static int -mailbox_autoexpunge(struct mailbox *box, unsigned int interval_time, - unsigned int max_mails, unsigned int *expunged_count) +mailbox_autoexpunge_batch(struct mailbox *box, + const unsigned int interval_time, + const unsigned int max_mails, + const time_t expire_time, + unsigned int *expunged_count) { struct mailbox_transaction_context *t; struct mail *mail; - struct mailbox_metadata metadata; const struct mail_index_header *hdr; - struct mailbox_status status; uint32_t seq; - time_t timestamp, expire_time, last_rename_stamp = 0; + time_t timestamp, last_rename_stamp = 0; const void *data; size_t size; unsigned int count = 0; int ret = 0; - if ((unsigned int)ioloop_time < interval_time) - expire_time = 0; - else - expire_time = ioloop_time - interval_time; - - /* first try to check quickly from mailbox list index if we should - bother opening this mailbox. */ - if (mailbox_get_status(box, STATUS_MESSAGES, &status) < 0) { - if (mailbox_get_last_mail_error(box) == MAIL_ERROR_NOTFOUND) { - /* autocreated mailbox doesn't exist yet */ - return 0; - } - return -1; - } - if (interval_time == 0 && status.messages <= max_mails) - return 0; - - if (max_mails == 0 || status.messages <= max_mails) { - if (mailbox_get_metadata(box, MAILBOX_METADATA_FIRST_SAVE_DATE, - &metadata) < 0) - return -1; - if (metadata.first_save_date == (time_t)-1 || - metadata.first_save_date > expire_time) - return 0; - } - - if (mailbox_sync(box, MAILBOX_SYNC_FLAG_FAST) < 0) - return -1; - mail_index_get_header_ext(box->view, box->box_last_rename_stamp_ext_id, &data, &size); @@ -132,6 +104,47 @@ mailbox_autoexpunge(struct mailbox *box, unsigned int interval_time, return ret; } +static int +mailbox_autoexpunge(struct mailbox *box, unsigned int interval_time, + unsigned int max_mails, unsigned int *expunged_count) +{ + struct mailbox_metadata metadata; + struct mailbox_status status; + time_t expire_time; + + if ((unsigned int)ioloop_time < interval_time) + expire_time = 0; + else + expire_time = ioloop_time - interval_time; + + /* first try to check quickly from mailbox list index if we should + bother opening this mailbox. */ + if (mailbox_get_status(box, STATUS_MESSAGES, &status) < 0) { + if (mailbox_get_last_mail_error(box) == MAIL_ERROR_NOTFOUND) { + /* autocreated mailbox doesn't exist yet */ + return 0; + } + return -1; + } + if (interval_time == 0 && status.messages <= max_mails) + return 0; + + if (max_mails == 0 || status.messages <= max_mails) { + if (mailbox_get_metadata(box, MAILBOX_METADATA_FIRST_SAVE_DATE, + &metadata) < 0) + return -1; + if (metadata.first_save_date == (time_t)-1 || + metadata.first_save_date > expire_time) + return 0; + } + + if (mailbox_sync(box, MAILBOX_SYNC_FLAG_FAST) < 0) + return -1; + + return mailbox_autoexpunge_batch(box, interval_time, max_mails, + expire_time, expunged_count); +} + static void mailbox_autoexpunge_set(struct mail_namespace *ns, const char *vname, unsigned int autoexpunge,