dovecot-1.2: lib-storage: Use mailbox_status() to get number of ...

dovecot at dovecot.org dovecot at dovecot.org
Sat Feb 6 02:13:55 EET 2010


details:   http://hg.dovecot.org/dovecot-1.2/rev/ef3b30b24c7c
changeset: 9540:ef3b30b24c7c
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Feb 06 02:13:42 2010 +0200
description:
lib-storage: Use mailbox_status() to get number of messages in search code.
This doesn't really change anything, except makes it possible for plugins to
hide some messages.

diffstat:

1 file changed, 40 insertions(+), 36 deletions(-)
src/lib-storage/index/index-search.c |   76 +++++++++++++++++-----------------

diffs (231 lines):

diff -r 0454fde95cbf -r ef3b30b24c7c src/lib-storage/index/index-search.c
--- a/src/lib-storage/index/index-search.c	Sat Feb 06 00:38:04 2010 +0200
+++ b/src/lib-storage/index/index-search.c	Sat Feb 06 02:13:42 2010 +0200
@@ -79,7 +79,7 @@ static const enum message_header_parser_
 static const enum message_header_parser_flags hdr_parser_flags =
 	MESSAGE_HEADER_PARSER_FLAG_CLEAN_ONELINE;
 
-static void search_parse_msgset_args(const struct mail_index_header *hdr,
+static void search_parse_msgset_args(unsigned int messages_count,
 				     struct mail_search_arg *args,
 				     uint32_t *seq1_r, uint32_t *seq2_r);
 
@@ -664,13 +664,13 @@ static int search_arg_match_text(struct 
 	return ret;
 }
 
-static bool search_msgset_fix_limits(const struct mail_index_header *hdr,
+static bool search_msgset_fix_limits(unsigned int messages_count,
 				     ARRAY_TYPE(seq_range) *seqset, bool not)
 {
 	struct seq_range *range;
 	unsigned int count;
 
-	i_assert(hdr->messages_count > 0);
+	i_assert(messages_count > 0);
 
 	range = array_get_modifiable(seqset, &count);
 	if (count > 0) {
@@ -678,10 +678,10 @@ static bool search_msgset_fix_limits(con
 		if (range[count-1].seq2 == (uint32_t)-1) {
 			/* "*" used, make sure the last message is in the range
 			   (e.g. with count+1:* we still want to include it) */
-			seq_range_array_add(seqset, 0, hdr->messages_count);
+			seq_range_array_add(seqset, 0, messages_count);
 		}
 		/* remove all non-existing messages */
-		seq_range_array_remove_range(seqset, hdr->messages_count + 1,
+		seq_range_array_remove_range(seqset, messages_count + 1,
 					     (uint32_t)-1);
 	}
 	if (!not)
@@ -690,11 +690,11 @@ static bool search_msgset_fix_limits(con
 		/* if all messages are in the range, it can't match */
 		range = array_get_modifiable(seqset, &count);
 		return range[0].seq1 != 1 ||
-			range[count-1].seq2 != hdr->messages_count;
-	}
-}
-
-static void search_msgset_fix(const struct mail_index_header *hdr,
+			range[count-1].seq2 != messages_count;
+	}
+}
+
+static void search_msgset_fix(unsigned int messages_count,
 			      ARRAY_TYPE(seq_range) *seqset,
 			      uint32_t *seq1_r, uint32_t *seq2_r, bool not)
 {
@@ -702,7 +702,7 @@ static void search_msgset_fix(const stru
 	unsigned int count;
 	uint32_t min_seq, max_seq;
 
-	if (!search_msgset_fix_limits(hdr, seqset, not)) {
+	if (!search_msgset_fix_limits(messages_count, seqset, not)) {
 		*seq1_r = (uint32_t)-1;
 		*seq2_r = 0;
 		return;
@@ -714,8 +714,8 @@ static void search_msgset_fix(const stru
 		max_seq = range[count-1].seq2;
 	} else {
 		min_seq = range[0].seq1 > 1 ? 1 : range[0].seq2 + 1;
-		max_seq = range[count-1].seq2 < hdr->messages_count ?
-			hdr->messages_count : range[count-1].seq1 - 1;
+		max_seq = range[count-1].seq2 < messages_count ?
+			messages_count : range[count-1].seq1 - 1;
 		if (min_seq > max_seq) {
 			*seq1_r = (uint32_t)-1;
 			*seq2_r = 0;
@@ -729,28 +729,30 @@ static void search_msgset_fix(const stru
 		*seq2_r = max_seq;
 }
 
-static void search_or_parse_msgset_args(const struct mail_index_header *hdr,
+static void search_or_parse_msgset_args(unsigned int messages_count,
 					struct mail_search_arg *args,
 					uint32_t *seq1_r, uint32_t *seq2_r)
 {
 	uint32_t seq1, seq2, min_seq1 = 0, max_seq2 = 0;
 
 	for (; args != NULL; args = args->next) {
-		seq1 = 1; seq2 = hdr->messages_count;
+		seq1 = 1; seq2 = messages_count;
 
 		switch (args->type) {
 		case SEARCH_SUB:
 			i_assert(!args->not);
-			search_parse_msgset_args(hdr, args->value.subargs,
+			search_parse_msgset_args(messages_count,
+						 args->value.subargs,
 						 &seq1, &seq2);
 			break;
 		case SEARCH_OR:
 			i_assert(!args->not);
-			search_or_parse_msgset_args(hdr, args->value.subargs,
+			search_or_parse_msgset_args(messages_count,
+						    args->value.subargs,
 						    &seq1, &seq2);
 			break;
 		case SEARCH_SEQSET:
-			search_msgset_fix(hdr, &args->value.seqset,
+			search_msgset_fix(messages_count, &args->value.seqset,
 					  &seq1, &seq2, args->not);
 			break;
 		default:
@@ -775,7 +777,7 @@ static void search_or_parse_msgset_args(
 		*seq2_r = max_seq2;
 }
 
-static void search_parse_msgset_args(const struct mail_index_header *hdr,
+static void search_parse_msgset_args(unsigned int messages_count,
 				     struct mail_search_arg *args,
 				     uint32_t *seq1_r, uint32_t *seq2_r)
 {
@@ -783,18 +785,20 @@ static void search_parse_msgset_args(con
 		switch (args->type) {
 		case SEARCH_SUB:
 			i_assert(!args->not);
-			search_parse_msgset_args(hdr, args->value.subargs,
+			search_parse_msgset_args(messages_count,
+						 args->value.subargs,
 						 seq1_r, seq2_r);
 			break;
 		case SEARCH_OR:
 			/* go through our children and use the widest seqset
 			   range */
 			i_assert(!args->not);
-			search_or_parse_msgset_args(hdr, args->value.subargs,
+			search_or_parse_msgset_args(messages_count,
+						    args->value.subargs,
 						    seq1_r, seq2_r);
 			break;
 		case SEARCH_SEQSET:
-			search_msgset_fix(hdr, &args->value.seqset,
+			search_msgset_fix(messages_count, &args->value.seqset,
 					  seq1_r, seq2_r, args->not);
 			break;
 		default:
@@ -818,10 +822,12 @@ static void search_limit_lowwater(struct
 }
 
 static bool search_limit_by_flags(struct index_search_context *ctx,
-				  const struct mail_index_header *hdr,
 				  struct mail_search_arg *args,
 				  uint32_t *seq1, uint32_t *seq2)
 {
+	const struct mail_index_header *hdr;
+
+	hdr = mail_index_get_header(ctx->view);
 	for (; args != NULL; args = args->next) {
 		if (args->type != SEARCH_FLAGS) {
 			if (args->type == SEARCH_ALL) {
@@ -873,12 +879,10 @@ static bool search_limit_by_flags(struct
 }
 
 static void search_get_seqset(struct index_search_context *ctx,
+			      unsigned int messages_count,
 			      struct mail_search_arg *args)
 {
-        const struct mail_index_header *hdr;
-
-	hdr = mail_index_get_header(ctx->view);
-	if (hdr->messages_count == 0) {
+	if (messages_count == 0) {
 		/* no messages, don't check sequence ranges. although we could
 		   give error message then for FETCH, we shouldn't do it for
 		   UID FETCH. */
@@ -888,12 +892,12 @@ static void search_get_seqset(struct ind
 	}
 
 	ctx->seq1 = 1;
-	ctx->seq2 = hdr->messages_count;
-
-	search_parse_msgset_args(hdr, args, &ctx->seq1, &ctx->seq2);
+	ctx->seq2 = messages_count;
+
+	search_parse_msgset_args(messages_count, args, &ctx->seq1, &ctx->seq2);
 	if (ctx->seq1 == 0) {
 		ctx->seq1 = 1;
-		ctx->seq2 = hdr->messages_count;
+		ctx->seq2 = messages_count;
 	}
 	if (ctx->seq1 > ctx->seq2) {
 		/* no matches */
@@ -901,7 +905,7 @@ static void search_get_seqset(struct ind
 	}
 
 	/* UNSEEN and DELETED in root search level may limit the range */
-	if (!search_limit_by_flags(ctx, hdr, args, &ctx->seq1, &ctx->seq2)) {
+	if (!search_limit_by_flags(ctx, args, &ctx->seq1, &ctx->seq2)) {
 		/* no matches */
 		ctx->seq1 = 1;
 		ctx->seq2 = 0;
@@ -1009,7 +1013,7 @@ index_storage_search_init(struct mailbox
 	struct index_transaction_context *t =
 		(struct index_transaction_context *)_t;
 	struct index_search_context *ctx;
-	const struct mail_index_header *hdr;
+	struct mailbox_status status;
 
 	ctx = i_new(struct index_search_context, 1);
 	ctx->mail_ctx.transaction = _t;
@@ -1021,8 +1025,8 @@ index_storage_search_init(struct mailbox
 	if (gettimeofday(&ctx->last_nonblock_timeval, NULL) < 0)
 		i_fatal("gettimeofday() failed: %m");
 
-	hdr = mail_index_get_header(t->ibox->view);
-	ctx->mail_ctx.progress_max = hdr->messages_count;
+	mailbox_get_status(_t->box, STATUS_MESSAGES, &status);
+	ctx->mail_ctx.progress_max = status.messages;
 
 	i_array_init(&ctx->mail_ctx.results, 5);
 	array_create(&ctx->mail_ctx.module_contexts, default_pool,
@@ -1036,7 +1040,7 @@ index_storage_search_init(struct mailbox
 			ctx->failed = TRUE;
 	}
 
-	search_get_seqset(ctx, args->args);
+	search_get_seqset(ctx, status.messages, args->args);
 	(void)mail_search_args_foreach(args->args, search_init_arg, ctx);
 
 	/* Need to reset results for match_always cases */


More information about the dovecot-cvs mailing list