[dovecot-cvs] dovecot: Changed mail_index_view_sync_begin() to take enum mail_...
dovecot at dovecot.org
dovecot at dovecot.org
Wed Jun 13 21:51:18 EEST 2007
details: http://hg.dovecot.org/dovecot/rev/9c53047d3b2c
changeset: 5722:9c53047d3b2c
user: Timo Sirainen <tss at iki.fi>
date: Wed Jun 13 21:51:15 2007 +0300
description:
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.
diffstat:
4 files changed, 36 insertions(+), 24 deletions(-)
src/lib-index/mail-index-view-sync.c | 30 +++++++++++++++--------------
src/lib-index/mail-index.h | 12 +++++++++--
src/lib-storage/index/index-sync.c | 15 +++++++-------
src/lib-storage/list/index-mailbox-list.c | 3 +-
diffs (141 lines):
diff -r 18d7a680ffae -r 9c53047d3b2c src/lib-index/mail-index-view-sync.c
--- 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 @@ static void mail_index_view_check(struct
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 @@ int mail_index_view_sync_begin(struct ma
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 @@ int mail_index_view_sync_begin(struct ma
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++;
diff -r 18d7a680ffae -r 9c53047d3b2c src/lib-index/mail-index.h
--- 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 @@ enum mail_index_sync_type {
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 @@ int mail_index_fsck(struct mail_index *i
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,
diff -r 18d7a680ffae -r 9c53047d3b2c src/lib-storage/index/index-sync.c
--- 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 @@ index_mailbox_sync_init(struct mailbox *
{
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 @@ index_mailbox_sync_init(struct mailbox *
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;
-
- if (mail_index_view_sync_begin(ibox->view, sync_mask,
+ 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_type,
&ctx->sync_ctx) < 0) {
mail_storage_set_index_error(ibox);
ctx->failed = TRUE;
diff -r 18d7a680ffae -r 9c53047d3b2c src/lib-storage/list/index-mailbox-list.c
--- 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 @@ index_mailbox_view_sync(struct index_mai
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;
More information about the dovecot-cvs
mailing list