diff src/imap/imap-fetch.c @ 7642:077bb84e9e77 HEAD

Make mail_search_args an independent structure that can be used for multiple separate searches.
author Timo Sirainen <tss@iki.fi>
date Wed, 04 Jun 2008 00:51:58 +0300
parents 03146f02403f
children f8a0e11566c8
line wrap: on
line diff
--- a/src/imap/imap-fetch.c	Sun Mar 16 12:10:57 2008 +0200
+++ b/src/imap/imap-fetch.c	Wed Jun 04 00:51:58 2008 +0300
@@ -9,7 +9,6 @@
 #include "message-send.h"
 #include "message-size.h"
 #include "imap-date.h"
-#include "mail-search.h"
 #include "mail-search-build.h"
 #include "commands.h"
 #include "imap-fetch.h"
@@ -113,14 +112,14 @@
 {
 	struct mail_search_arg *search_arg;
 
-	search_arg = p_new(ctx->cmd->pool, struct mail_search_arg, 1);
+	search_arg = p_new(ctx->search_args->pool, struct mail_search_arg, 1);
 	search_arg->type = SEARCH_MODSEQ;
 	search_arg->value.modseq =
 		p_new(ctx->cmd->pool, struct mail_search_modseq, 1);
 	search_arg->value.modseq->modseq = modseq;
 
-	search_arg->next = ctx->search_args->next;
-	ctx->search_args->next = search_arg;
+	search_arg->next = ctx->search_args->args->next;
+	ctx->search_args->args->next = search_arg;
 
 	return imap_fetch_init_handler(ctx, "MODSEQ", NULL);
 }
@@ -200,7 +199,7 @@
 				 ARRAY_TYPE(seq_range) *expunges)
 {
 	struct mailbox_transaction_context *trans;
-	struct mail_search_arg search_arg;
+	struct mail_search_args *search_args;
 	struct mail_search_context *search_ctx;
 	struct mail *mail;
 	const struct seq_range *uid_range;
@@ -215,14 +214,17 @@
 	next_uid = uid_range[0].seq1;
 
 	/* search UIDs in given range */
-	memset(&search_arg, 0, sizeof(search_arg));
-	search_arg.type = SEARCH_UIDSET;
-	i_array_init(&search_arg.value.seqset, array_count(uids));
-	array_append_array(&search_arg.value.seqset, uids);
+	search_args = mail_search_build_init();
+	search_args->args = p_new(search_args->pool, struct mail_search_arg, 1);
+	search_args->args->type = SEARCH_UIDSET;
+	i_array_init(&search_args->args->value.seqset, array_count(uids));
+	array_append_array(&search_args->args->value.seqset, uids);
 
 	trans = mailbox_transaction_begin(ctx->box, 0);
 	mail = mail_alloc(trans, 0, NULL);
-	search_ctx = mailbox_search_init(trans, NULL, &search_arg, NULL);
+	search_ctx = mailbox_search_init(trans, search_args, NULL);
+	mail_search_args_unref(&search_args);
+
 	while (mailbox_search_next(search_ctx, mail) > 0) {
 		if (mail->uid == next_uid) {
 			if (next_uid < uid_range[i].seq2)
@@ -279,7 +281,7 @@
 static int
 imap_fetch_send_vanished(struct imap_fetch_context *ctx)
 {
-	const struct mail_search_arg *uidarg = ctx->search_args;
+	const struct mail_search_arg *uidarg = ctx->search_args->args;
 	const struct mail_search_arg *modseqarg = uidarg->next;
 	const ARRAY_TYPE(seq_range) *uids = &uidarg->value.seqset;
 	uint64_t modseq = modseqarg->value.modseq->modseq;
@@ -352,7 +354,7 @@
 	mail_search_args_init(ctx->search_args, ctx->box, TRUE,
 			      &ctx->cmd->client->search_saved_uidset);
 	ctx->search_ctx =
-		mailbox_search_init(ctx->trans, NULL, ctx->search_args, NULL);
+		mailbox_search_init(ctx->trans, ctx->search_args, NULL);
 	return 0;
 }