dovecot-1.2: Search result update handling code cleanups.

dovecot at dovecot.org dovecot at dovecot.org
Wed Jun 18 05:57:59 EEST 2008


details:   http://hg.dovecot.org/dovecot-1.2/rev/38bdfafa655c
changeset: 7887:38bdfafa655c
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Jun 18 04:34:46 2008 +0300
description:
Search result update handling code cleanups.

diffstat:

3 files changed, 63 insertions(+), 57 deletions(-)
src/lib-storage/index/index-sync-private.h |    4 -
src/lib-storage/index/index-sync-search.c  |   74 +++++++++++++++-------------
src/lib-storage/index/index-sync.c         |   42 +++++++--------

diffs (227 lines):

diff -r d12fc53f71be -r 38bdfafa655c src/lib-storage/index/index-sync-private.h
--- a/src/lib-storage/index/index-sync-private.h	Wed Jun 18 05:19:56 2008 +0300
+++ b/src/lib-storage/index/index-sync-private.h	Wed Jun 18 04:34:46 2008 +0300
@@ -10,9 +10,9 @@ struct index_mailbox_sync_context {
 	uint32_t messages_count;
 
 	ARRAY_TYPE(seq_range) flag_updates;
-	ARRAY_TYPE(seq_range) modseq_updates;
+	ARRAY_TYPE(seq_range) hidden_updates;
 	const ARRAY_TYPE(seq_range) *expunges;
-	unsigned int flag_update_idx, modseq_update_idx, expunge_pos;
+	unsigned int flag_update_idx, hidden_update_idx, expunge_pos;
 
 	bool failed;
 };
diff -r d12fc53f71be -r 38bdfafa655c src/lib-storage/index/index-sync-search.c
--- a/src/lib-storage/index/index-sync-search.c	Wed Jun 18 05:19:56 2008 +0300
+++ b/src/lib-storage/index/index-sync-search.c	Wed Jun 18 04:34:46 2008 +0300
@@ -112,52 +112,56 @@ search_result_update_search(struct mail_
 	return ret;
 }
 
-static int
-search_result_update_existing(struct index_mailbox_sync_context *ctx,
-			      struct mail_search_result *result)
+static bool
+search_result_merge_changes(struct index_mailbox_sync_context *ctx,
+			    struct mail_search_result *result,
+			    ARRAY_TYPE(seq_range) *changes)
 {
 	/* @UNSAFE */
-	const ARRAY_TYPE(seq_range) *merge_ranges[2];
-	ARRAY_TYPE(seq_range) changes;
-	struct mail_search_arg search_arg;
-	unsigned int i, count, merge_count = 0;
-	int ret;
-
-	/* get the changes we're interested in */
-	if ((result->args_have_flags || result->args_have_keywords) &&
-	    array_is_created(&ctx->flag_updates))
-		merge_ranges[merge_count++] = &ctx->flag_updates;
-	if (result->args_have_modseq && array_is_created(&ctx->modseq_updates))
-		merge_ranges[merge_count++] = &ctx->modseq_updates;
-	i_assert(merge_count < N_ELEMENTS(merge_ranges));
-
-	for (i = 0, count = 0; i < merge_count; i++)
-		count += array_count(merge_ranges[i]);
+	unsigned int count;
+
+	if (!result->args_have_flags && !result->args_have_keywords &&
+	    !result->args_have_modseq) {
+		/* search result doesn't care about flag changes */
+		return FALSE;
+	}
+	count = array_count(&ctx->flag_updates) +
+		array_count(&ctx->hidden_updates);
 	if (count == 0) {
 		/* no changes */
-		return 0;
+		return FALSE;
 	}
 
 	/* merge the changed sequences */
-	t_array_init(&changes, count);
-	for (i = 0; i < merge_count; i++)
-		seq_range_array_merge(&changes, merge_ranges[i]);
+	t_array_init(changes, count);
+	seq_range_array_merge(changes, &ctx->flag_updates);
+	seq_range_array_merge(changes, &ctx->hidden_updates);
+	return TRUE;
+}
+
+static int
+search_result_update_existing(struct mail_search_result *result,
+			      const ARRAY_TYPE(seq_range) *changes)
+{
+	struct mail_search_arg search_arg;
+	int ret;
 
 	/* add a temporary search parameter to limit the search only to
 	   the changed messages */
 	memset(&search_arg, 0, sizeof(search_arg));
 	search_arg.type = SEARCH_SEQSET;
-	search_arg.value.seqset = changes;
+	search_arg.value.seqset = *changes;
 	search_arg.next = result->search_args->args;
 	result->search_args->args = &search_arg;
-	ret = search_result_update_search(result, &changes);
+	ret = search_result_update_search(result, changes);
 	i_assert(result->search_args->args == &search_arg);
 	result->search_args->args = search_arg.next;
 	return ret;
 }
 
 static int
-search_result_update_appends(struct index_mailbox_sync_context *ctx,
+search_result_update_appends(struct mail_index_view *view,
+			     unsigned int old_messages_count,
 			     struct mail_search_result *result)
 {
 	struct mailbox_transaction_context *t;
@@ -167,8 +171,8 @@ search_result_update_appends(struct inde
 	uint32_t message_count;
 	int ret;
 
-	message_count = mail_index_view_get_messages_count(ctx->ibox->view);
-	if (ctx->messages_count == message_count) {
+	message_count = mail_index_view_get_messages_count(view);
+	if (old_messages_count == message_count) {
 		/* no new messages */
 		return 0;
 	}
@@ -179,7 +183,7 @@ search_result_update_appends(struct inde
 	search_arg.type = SEARCH_SEQSET;
 	t_array_init(&search_arg.value.seqset, 1);
 	seq_range_array_add_range(&search_arg.value.seqset,
-				  ctx->messages_count + 1, message_count);
+				  old_messages_count + 1, message_count);
 	search_arg.next = result->search_args->args;
 	result->search_args->args = &search_arg;
 
@@ -205,13 +209,19 @@ search_result_update(struct index_mailbo
 search_result_update(struct index_mailbox_sync_context *ctx,
 		     struct mail_search_result *result)
 {
-	if ((result->flags & MAILBOX_SEARCH_RESULT_FLAG_UPDATE) == 0)
+	if ((result->flags & MAILBOX_SEARCH_RESULT_FLAG_UPDATE) == 0) {
+		/* not an updateable search result */
 		return;
+	}
 
 	T_BEGIN {
-		(void)search_result_update_existing(ctx, result);
+		ARRAY_TYPE(seq_range) changes;
+
+		if (search_result_merge_changes(ctx, result, &changes))
+			(void)search_result_update_existing(result, &changes);
 	} T_END;
-	(void)search_result_update_appends(ctx, result);
+	(void)search_result_update_appends(ctx->ibox->view, ctx->messages_count,
+					   result);
 }
 
 void index_sync_search_results_update(struct index_mailbox_sync_context *ctx)
diff -r d12fc53f71be -r 38bdfafa655c src/lib-storage/index/index-sync.c
--- a/src/lib-storage/index/index-sync.c	Wed Jun 18 05:19:56 2008 +0300
+++ b/src/lib-storage/index/index-sync.c	Wed Jun 18 04:34:46 2008 +0300
@@ -108,8 +108,7 @@ static void index_view_sync_recs_get(str
 	uint32_t seq1, seq2;
 
 	i_array_init(&ctx->flag_updates, 128);
-	if ((ctx->ibox->box.enabled_features & MAILBOX_FEATURE_CONDSTORE) != 0)
-		i_array_init(&ctx->modseq_updates, 32);
+	i_array_init(&ctx->hidden_updates, 32);
 	while (mail_index_view_sync_next(ctx->sync_ctx, &sync_rec)) {
 		switch (sync_rec.type) {
 		case MAIL_INDEX_VIEW_SYNC_TYPE_FLAGS:
@@ -122,28 +121,24 @@ static void index_view_sync_recs_get(str
 			if (!sync_rec.hidden) {
 				seq_range_array_add_range(&ctx->flag_updates,
 							  seq1, seq2);
-			} else if (array_is_created(&ctx->modseq_updates)) {
-				seq_range_array_add_range(&ctx->modseq_updates,
+			} else if (array_is_created(&ctx->hidden_updates)) {
+				seq_range_array_add_range(&ctx->hidden_updates,
 							  seq1, seq2);
 			}
 			break;
 		}
 	}
 
-	/* remove expunged messages from flag/modseq updates */
+	/* remove expunged messages from flag updates */
 	if (ctx->expunges != NULL) {
 		seq_range_array_remove_seq_range(&ctx->flag_updates,
 						 ctx->expunges);
-		if (array_is_created(&ctx->modseq_updates)) {
-			seq_range_array_remove_seq_range(&ctx->modseq_updates,
-							 ctx->expunges);
-		}
-	}
-	/* remove flag updates from modseq updates */
-	if (array_is_created(&ctx->modseq_updates)) {
-		seq_range_array_remove_seq_range(&ctx->modseq_updates,
-						 &ctx->flag_updates);
-	}
+		seq_range_array_remove_seq_range(&ctx->hidden_updates,
+						 ctx->expunges);
+	}
+	/* remove flag updates from hidden updates */
+	seq_range_array_remove_seq_range(&ctx->hidden_updates,
+					 &ctx->flag_updates);
 }
 
 struct mailbox_sync_context *
@@ -228,13 +223,14 @@ bool index_mailbox_sync_next(struct mail
 		ctx->flag_update_idx++;
 		return TRUE;
 	}
-	if (array_is_created(&ctx->modseq_updates)) {
-		range = array_get(&ctx->modseq_updates, &count);
-		if (ctx->modseq_update_idx < count) {
+	if ((_ctx->box->enabled_features & MAILBOX_FEATURE_CONDSTORE) != 0) {
+		/* hidden flag changes' MODSEQs still need to be returned */
+		range = array_get(&ctx->hidden_updates, &count);
+		if (ctx->hidden_update_idx < count) {
 			sync_rec_r->type = MAILBOX_SYNC_TYPE_MODSEQ;
-			sync_rec_r->seq1 = range[ctx->modseq_update_idx].seq1;
-			sync_rec_r->seq2 = range[ctx->modseq_update_idx].seq2;
-			ctx->modseq_update_idx++;
+			sync_rec_r->seq1 = range[ctx->hidden_update_idx].seq1;
+			sync_rec_r->seq2 = range[ctx->hidden_update_idx].seq2;
+			ctx->hidden_update_idx++;
 			return TRUE;
 		}
 	}
@@ -351,8 +347,8 @@ int index_mailbox_sync_deinit(struct mai
 
 	if (array_is_created(&ctx->flag_updates))
 		array_free(&ctx->flag_updates);
-	if (array_is_created(&ctx->modseq_updates))
-		array_free(&ctx->modseq_updates);
+	if (array_is_created(&ctx->hidden_updates))
+		array_free(&ctx->hidden_updates);
 	i_free(ctx);
 	return ret;
 }


More information about the dovecot-cvs mailing list