changeset 7655:ec49260ed4ee HEAD

SEARCH UPDATE: Convert seqsets in saved results to uidsets so that they can be matched correctly later if messages are expunged.
author Timo Sirainen <tss@iki.fi>
date Sat, 07 Jun 2008 01:35:02 +0300
parents 1004a3555a03
children eb0f45d0c9f2
files src/lib-storage/mail-search.c src/lib-storage/mail-search.h src/lib-storage/mailbox-search-result.c
diffstat 3 files changed, 42 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/mail-search.c	Sat Jun 07 01:34:16 2008 +0300
+++ b/src/lib-storage/mail-search.c	Sat Jun 07 01:35:02 2008 +0300
@@ -133,6 +133,45 @@
 	mail_search_args_deinit_sub(args, args->args);
 }
 
+static void mail_search_args_seq2uid_sub(struct mail_search_args *args,
+					 struct mail_search_arg *arg,
+					 ARRAY_TYPE(seq_range) *uids)
+{
+	for (; arg != NULL; arg = arg->next) {
+		switch (arg->type) {
+		case SEARCH_SEQSET:
+			array_clear(uids);
+			mailbox_get_uid_range(args->box,
+					      &arg->value.seqset, uids);
+
+			/* replace sequences with UIDs in the existing array.
+			   this way it's possible to switch between uidsets and
+			   seqsets constantly without leaking memory */
+			arg->type = SEARCH_UIDSET;
+			array_clear(&arg->value.seqset);
+			array_append_array(&arg->value.seqset, uids);
+			break;
+		case SEARCH_SUB:
+		case SEARCH_OR:
+			mail_search_args_seq2uid_sub(args, arg->value.subargs,
+						     uids);
+			break;
+		default:
+			break;
+		}
+	}
+}
+
+void mail_search_args_seq2uid(struct mail_search_args *args)
+{
+	T_BEGIN {
+		ARRAY_TYPE(seq_range) uids;
+
+		t_array_init(&uids, 128);
+		mail_search_args_seq2uid_sub(args, args->args, &uids);
+	} T_END;
+}
+
 void mail_search_args_ref(struct mail_search_args *args)
 {
 	i_assert(args->refcount > 0);
--- a/src/lib-storage/mail-search.h	Sat Jun 07 01:34:16 2008 +0300
+++ b/src/lib-storage/mail-search.h	Sat Jun 07 01:35:02 2008 +0300
@@ -109,6 +109,8 @@
 			   const ARRAY_TYPE(seq_range) *search_saved_uidset);
 /* Free keywords. The args can initialized afterwards again if needed. */
 void mail_search_args_deinit(struct mail_search_args *args);
+/* Convert sequence sets in args to UIDs. */
+void mail_search_args_seq2uid(struct mail_search_args *args);
 
 void mail_search_args_ref(struct mail_search_args *args);
 void mail_search_args_unref(struct mail_search_args **args);
--- a/src/lib-storage/mailbox-search-result.c	Sat Jun 07 01:34:16 2008 +0300
+++ b/src/lib-storage/mailbox-search-result.c	Sat Jun 07 01:35:02 2008 +0300
@@ -89,6 +89,7 @@
 		i_array_init(&result->removed_uids, 32);
 		i_array_init(&result->added_uids, 32);
 	}
+	mail_search_args_seq2uid(result->search_args);
 }
 
 void mailbox_search_results_initial_done(struct mail_search_context *ctx)