Mercurial > dovecot > core-2.2
changeset 11852:bb2c6be5be5c
mdbox: Small code cleanup.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 19 Jul 2010 13:01:40 +0100 |
parents | 39b33769614b |
children | 1e0916e4700c |
files | src/lib-storage/index/dbox-multi/mdbox-save.c |
diffstat | 1 files changed, 39 insertions(+), 33 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/dbox-multi/mdbox-save.c Mon Jul 19 12:43:02 2010 +0100 +++ b/src/lib-storage/index/dbox-multi/mdbox-save.c Mon Jul 19 13:01:40 2010 +0100 @@ -242,11 +242,45 @@ (void)mdbox_save_finish(_ctx); } +static void +mdbox_save_set_map_uids(struct mdbox_save_context *ctx, + uint32_t first_map_uid, uint32_t last_map_uid) +{ + struct mdbox_mailbox *mbox = ctx->mbox; + struct mail_index_view *view = ctx->ctx.ctx.transaction->view; + const struct mdbox_mail_index_record *old_rec; + struct mdbox_mail_index_record rec; + const struct dbox_save_mail *mails; + unsigned int i, count; + const void *data; + bool expunged; + uint32_t next_map_uid = first_map_uid; + + mdbox_update_header(mbox, ctx->ctx.trans, NULL); + + memset(&rec, 0, sizeof(rec)); + rec.save_date = ioloop_time; + mails = array_get(&ctx->mails, &count); + for (i = 0; i < count; i++) { + mail_index_lookup_ext(view, mails[i].seq, mbox->ext_id, + &data, &expunged); + old_rec = data; + if (old_rec != NULL && old_rec->map_uid != 0) { + /* message was copied. keep the existing map uid */ + continue; + } + + rec.map_uid = next_map_uid++; + mail_index_update_ext(ctx->ctx.trans, mails[i].seq, + mbox->ext_id, &rec, NULL); + } + i_assert(next_map_uid == last_map_uid + 1); +} + int mdbox_transaction_save_commit_pre(struct mail_save_context *_ctx) { struct mdbox_save_context *ctx = (struct mdbox_save_context *)_ctx; struct mailbox_transaction_context *_t = _ctx->transaction; - struct mdbox_mailbox *mbox = ctx->mbox; const struct mail_index_header *hdr; uint32_t first_map_uid, last_map_uid; @@ -261,8 +295,8 @@ return -1; } - /* map is now locked. lock the mailbox after it to avoid deadlocks. */ - if (mdbox_sync_begin(mbox, MDBOX_SYNC_FLAG_NO_PURGE | + /* lock the mailbox after map to avoid deadlocks. */ + if (mdbox_sync_begin(ctx->mbox, MDBOX_SYNC_FLAG_NO_PURGE | MDBOX_SYNC_FLAG_FORCE | MDBOX_SYNC_FLAG_FSYNC, ctx->atomic, &ctx->sync_ctx) < 0) { @@ -276,36 +310,8 @@ &_t->changes->saved_uids); /* save map UIDs to mailbox index */ - if (first_map_uid != 0) { - const struct mdbox_mail_index_record *old_rec; - struct mdbox_mail_index_record rec; - const struct dbox_save_mail *mails; - unsigned int i, count; - const void *data; - bool expunged; - uint32_t next_map_uid = first_map_uid; - - mdbox_update_header(mbox, ctx->ctx.trans, NULL); - - memset(&rec, 0, sizeof(rec)); - rec.save_date = ioloop_time; - mails = array_get(&ctx->mails, &count); - for (i = 0; i < count; i++) { - mail_index_lookup_ext(_t->view, mails[i].seq, - mbox->ext_id, &data, &expunged); - old_rec = data; - if (old_rec != NULL && old_rec->map_uid != 0) { - /* message was copied. keep the existing - map uid */ - continue; - } - - rec.map_uid = next_map_uid++; - mail_index_update_ext(ctx->ctx.trans, mails[i].seq, - mbox->ext_id, &rec, NULL); - } - i_assert(next_map_uid == last_map_uid + 1); - } + if (first_map_uid != 0) + mdbox_save_set_map_uids(ctx, first_map_uid, last_map_uid); /* increase map's refcount for copied mails */ if (array_is_created(&ctx->copy_map_uids)) {