Mercurial > dovecot > original-hg > dovecot-1.2
changeset 5722:9c53047d3b2c HEAD
Changed mail_index_view_sync_begin() to take enum mail_index_view_sync_type.
This limits how the view can be synced, but we couldn't handle before more
than the 3 useful cases anyway.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 13 Jun 2007 21:51:15 +0300 |
parents | 18d7a680ffae |
children | ad695be143ff |
files | src/lib-index/mail-index-view-sync.c src/lib-index/mail-index.h src/lib-storage/index/index-sync.c src/lib-storage/list/index-mailbox-list.c |
diffstat | 4 files changed, 35 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-index-view-sync.c Wed Jun 13 21:35:14 2007 +0300 +++ b/src/lib-index/mail-index-view-sync.c Wed Jun 13 21:51:15 2007 +0300 @@ -246,7 +246,7 @@ array_count(&view->syncs_done) == 0)) int mail_index_view_sync_begin(struct mail_index_view *view, - enum mail_index_sync_type sync_mask, + enum mail_index_view_sync_type sync_type, struct mail_index_view_sync_ctx **ctx_r) { struct mail_index_view_sync_ctx *ctx; @@ -254,29 +254,32 @@ enum mail_transaction_type log_get_mask, visible_mask; ARRAY_TYPE(seq_range) expunges = ARRAY_INIT; - /* We must sync flags as long as view is mmap()ed, as the flags may - have already changed under us. */ - i_assert((sync_mask & MAIL_INDEX_VIEW_VISIBLE_FLAGS_MASK) == - MAIL_INDEX_VIEW_VISIBLE_FLAGS_MASK); - /* Currently we're not handling correctly expunges + no-appends case */ - i_assert((sync_mask & MAIL_INDEX_SYNC_TYPE_EXPUNGE) == 0 || - (sync_mask & MAIL_INDEX_SYNC_TYPE_APPEND) != 0); - i_assert(!view->syncing); i_assert(view->transactions == 0); if (mail_index_view_lock_head(view) < 0) return -1; - if ((sync_mask & MAIL_INDEX_SYNC_TYPE_EXPUNGE) != 0) { + if (sync_type == MAIL_INDEX_VIEW_SYNC_TYPE_ALL) { /* get list of all expunges first */ if (view_sync_get_expunges(view, &expunges) < 0) return -1; } /* only flags, appends and expunges can be left to be synced later */ - visible_mask = mail_transaction_type_mask_get(sync_mask); - i_assert((visible_mask & ~MAIL_TRANSACTION_VISIBLE_SYNC_MASK) == 0); + switch (sync_type) { + case MAIL_INDEX_VIEW_SYNC_TYPE_ALL: + visible_mask = MAIL_TRANSACTION_VISIBLE_SYNC_MASK; + break; + case MAIL_INDEX_VIEW_SYNC_TYPE_NOAPPENDS_NOEXPUNGES: + visible_mask = MAIL_TRANSACTION_VISIBLE_SYNC_MASK & + ~(MAIL_TRANSACTION_EXPUNGE | MAIL_TRANSACTION_APPEND); + break; + case MAIL_INDEX_VIEW_SYNC_TYPE_NOEXPUNGES: + visible_mask = MAIL_TRANSACTION_VISIBLE_SYNC_MASK & + ~MAIL_TRANSACTION_EXPUNGE; + break; + } /* we want to also get non-visible changes. especially because we use the returned skipped-flag in mail_transaction_log_view_next() to @@ -296,8 +299,7 @@ mail_index_sync_map_init(&ctx->sync_map_ctx, view, MAIL_INDEX_SYNC_HANDLER_VIEW); - if ((sync_mask & MAIL_INDEX_SYNC_TYPE_EXPUNGE) != 0 && - (sync_mask & MAIL_INDEX_SYNC_TYPE_APPEND) != 0) { + if (sync_type == MAIL_INDEX_VIEW_SYNC_TYPE_ALL) { view->sync_new_map = view->index->map; view->sync_new_map->refcount++;
--- a/src/lib-index/mail-index.h Wed Jun 13 21:35:14 2007 +0300 +++ b/src/lib-index/mail-index.h Wed Jun 13 21:51:15 2007 +0300 @@ -107,7 +107,15 @@ MAIL_INDEX_SYNC_TYPE_KEYWORD_REMOVE = 0x10, MAIL_INDEX_SYNC_TYPE_KEYWORD_RESET = 0x20 }; -#define MAIL_INDEX_SYNC_MASK_ALL 0xff + +enum mail_index_view_sync_type { + /* Sync everything */ + MAIL_INDEX_VIEW_SYNC_TYPE_ALL, + /* Don't sync appends or expunges */ + MAIL_INDEX_VIEW_SYNC_TYPE_NOAPPENDS_NOEXPUNGES, + /* Don't sync expunges */ + MAIL_INDEX_VIEW_SYNC_TYPE_NOEXPUNGES +}; struct mail_index_sync_rec { uint32_t uid1, uid2; @@ -257,7 +265,7 @@ will be marked inconsistent. Only sync_mask type records are synchronized. */ int mail_index_view_sync_begin(struct mail_index_view *view, - enum mail_index_sync_type sync_mask, + enum mail_index_view_sync_type sync_type, struct mail_index_view_sync_ctx **ctx_r); /* Returns -1 if error, 0 if sync is finished, 1 if record was filled. */ int mail_index_view_sync_next(struct mail_index_view_sync_ctx *ctx,
--- a/src/lib-storage/index/index-sync.c Wed Jun 13 21:35:14 2007 +0300 +++ b/src/lib-storage/index/index-sync.c Wed Jun 13 21:51:15 2007 +0300 @@ -135,7 +135,7 @@ { struct index_mailbox *ibox = (struct index_mailbox *)box; struct index_mailbox_sync_context *ctx; - enum mail_index_sync_type sync_mask; + enum mail_index_view_sync_type sync_type; ctx = i_new(struct index_mailbox_sync_context, 1); ctx->ctx.box = box; @@ -148,13 +148,14 @@ ctx->messages_count = mail_index_view_get_messages_count(ibox->view); - sync_mask = MAIL_INDEX_SYNC_MASK_ALL; - if ((flags & MAILBOX_SYNC_FLAG_NO_EXPUNGES) != 0) - sync_mask &= ~MAIL_INDEX_SYNC_TYPE_EXPUNGE; if ((flags & MAILBOX_SYNC_FLAG_NO_NEWMAIL) != 0) - sync_mask &= ~MAIL_INDEX_SYNC_TYPE_APPEND; + sync_type = MAIL_INDEX_VIEW_SYNC_TYPE_NOAPPENDS_NOEXPUNGES; + else if ((flags & MAILBOX_SYNC_FLAG_NO_EXPUNGES) != 0) + sync_type = MAIL_INDEX_VIEW_SYNC_TYPE_NOEXPUNGES; + else + sync_type = MAIL_INDEX_VIEW_SYNC_TYPE_ALL; - if (mail_index_view_sync_begin(ibox->view, sync_mask, + if (mail_index_view_sync_begin(ibox->view, sync_type, &ctx->sync_ctx) < 0) { mail_storage_set_index_error(ibox); ctx->failed = TRUE;
--- a/src/lib-storage/list/index-mailbox-list.c Wed Jun 13 21:35:14 2007 +0300 +++ b/src/lib-storage/list/index-mailbox-list.c Wed Jun 13 21:51:15 2007 +0300 @@ -29,7 +29,8 @@ struct mail_index_view_sync_rec sync_rec; int ret; - if (mail_index_view_sync_begin(ctx->mail_view, MAIL_INDEX_SYNC_MASK_ALL, + if (mail_index_view_sync_begin(ctx->mail_view, + MAIL_INDEX_VIEW_SYNC_TYPE_ALL, &sync_ctx) < 0) { mailbox_list_set_internal_error(ctx->ctx.list); return -1;