changeset 9044:720560d19f5b HEAD

virtual: Fixed handling multiple mailboxes using the same search args.
author Timo Sirainen <tss@iki.fi>
date Sun, 17 May 2009 18:29:35 -0400
parents ef33393452f7
children 1e9bb18eb439
files src/plugins/virtual/virtual-config.c src/plugins/virtual/virtual-storage.c src/plugins/virtual/virtual-sync.c
diffstat 3 files changed, 18 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/plugins/virtual/virtual-config.c	Sun May 17 18:28:55 2009 -0400
+++ b/src/plugins/virtual/virtual-config.c	Sun May 17 18:29:35 2009 -0400
@@ -291,6 +291,20 @@
 	return mailbox_list_iter_deinit(&iter);
 }
 
+static void virtual_config_search_args_dup(struct virtual_mailbox *mbox)
+{
+	struct virtual_backend_box *const *bboxes;
+	struct mail_search_args *old_args;
+	unsigned int i, count;
+
+	bboxes = array_get_modifiable(&mbox->backend_boxes, &count);
+	for (i = 0; i < count; i++) {
+		old_args = bboxes[i]->search_args;
+		bboxes[i]->search_args = mail_search_args_dup(old_args);
+		mail_search_args_unref(&old_args);
+	}
+}
+
 int virtual_config_read(struct virtual_mailbox *mbox)
 {
 	struct mail_user *user = mbox->storage->storage.ns->user;
@@ -356,6 +370,8 @@
 					  "%s: No mailboxes defined", path);
 		ret = -1;
 	}
+	if (ret == 0)
+		virtual_config_search_args_dup(mbox);
 	i_stream_unref(&ctx.input);
 	(void)close(fd);
 	return ret;
--- a/src/plugins/virtual/virtual-storage.c	Sun May 17 18:28:55 2009 -0400
+++ b/src/plugins/virtual/virtual-storage.c	Sun May 17 18:29:35 2009 -0400
@@ -230,6 +230,8 @@
 		}
 		i_array_init(&bboxes[i]->uids, 64);
 		i_array_init(&bboxes[i]->sync_pending_removes, 64);
+		mail_search_args_init(bboxes[i]->search_args, bboxes[i]->box,
+				      FALSE, NULL);
 	}
 	if (i == count)
 		return 0;
--- a/src/plugins/virtual/virtual-sync.c	Sun May 17 18:28:55 2009 -0400
+++ b/src/plugins/virtual/virtual-sync.c	Sun May 17 18:29:35 2009 -0400
@@ -469,7 +469,6 @@
 	ret = mailbox_search_deinit(&search_ctx);
 	mail_free(&mail);
 
-	mail_search_args_deinit(bbox->search_args);
 	(void)mailbox_transaction_commit(&trans);
 	return ret;
 }
@@ -912,8 +911,6 @@
 				 &status) < 0)
 			return -1;
 
-		mail_search_args_init(bbox->search_args, bbox->box,
-				      FALSE, NULL);
 		virtual_backend_box_sync_mail_set(bbox);
 		if (status.uidvalidity != bbox->sync_uid_validity) {
 			/* UID validity changed since last sync (or this is