changeset 8268:eb320fbb87f0 HEAD

Virtual mailboxes: If CRC32 of the search strings changes, rebuild the mailbox.
author Timo Sirainen <tss@iki.fi>
date Sun, 12 Oct 2008 14:40:57 +0300
parents 3d2736ece94a
children 399bf5883beb
files src/plugins/virtual/virtual-config.c src/plugins/virtual/virtual-storage.h src/plugins/virtual/virtual-sync.c
diffstat 3 files changed, 11 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/plugins/virtual/virtual-config.c	Sun Oct 12 14:40:08 2008 +0300
+++ b/src/plugins/virtual/virtual-config.c	Sun Oct 12 14:40:57 2008 +0300
@@ -2,6 +2,7 @@
 
 #include "lib.h"
 #include "array.h"
+#include "crc32.h"
 #include "istream.h"
 #include "str.h"
 #include "imap-parser.h"
@@ -64,6 +65,8 @@
 		return 0;
 	}
 
+	ctx->mbox->search_args_crc32 =
+		crc32_str_more(ctx->mbox->search_args_crc32, str_c(ctx->rule));
 	search_args = virtual_search_args_parse(ctx->rule, error_r);
 	str_truncate(ctx->rule, 0);
 	if (search_args == NULL) {
@@ -201,6 +204,7 @@
 	int fd, ret = 0;
 
 	i_array_init(&mbox->backend_boxes, 8);
+	mbox->search_args_crc32 = (uint32_t)-1;
 
 	path = t_strconcat(mbox->path, "/"VIRTUAL_CONFIG_FNAME, NULL);
 	fd = open(path, O_RDWR);
--- a/src/plugins/virtual/virtual-storage.h	Sun Oct 12 14:40:08 2008 +0300
+++ b/src/plugins/virtual/virtual-storage.h	Sun Oct 12 14:40:57 2008 +0300
@@ -19,7 +19,9 @@
 	uint32_t mailbox_count;
 	/* Highest used mailbox ID. IDs are never reused. */
 	uint32_t highest_mailbox_id;
-	uint32_t unused_padding;
+	/* CRC32 of all the search parameters. If it changes, the mailbox is
+	   rebuilt. */
+	uint32_t search_args_crc32;
 };
 
 struct virtual_mail_index_mailbox_record {
@@ -96,6 +98,7 @@
 	uint32_t prev_uid_validity;
 	uint32_t prev_change_counter;
 	uint32_t highest_mailbox_id;
+	uint32_t search_args_crc32;
 
 	/* Mailboxes this virtual mailbox consists of, sorted by mailbox_id */
 	ARRAY_TYPE(virtual_backend_box) backend_boxes;
--- a/src/plugins/virtual/virtual-sync.c	Sun Oct 12 14:40:08 2008 +0300
+++ b/src/plugins/virtual/virtual-sync.c	Sun Oct 12 14:40:57 2008 +0300
@@ -153,7 +153,8 @@
 
 	ctx->mbox->sync_initialized = TRUE;
 	ctx->mbox->prev_uid_validity = hdr->uid_validity;
-	if (ext_hdr == NULL) {
+	if (ext_hdr == NULL ||
+	    ctx->mbox->search_args_crc32 != ext_hdr->search_args_crc32) {
 		mailboxes = NULL;
 		ext_name_offset = 0;
 		ext_mailbox_count = 0;
@@ -254,6 +255,7 @@
 	ext_hdr.change_counter = ++ctx->mbox->prev_change_counter;
 	ext_hdr.mailbox_count = count;
 	ext_hdr.highest_mailbox_id = ctx->mbox->highest_mailbox_id;
+	ext_hdr.search_args_crc32 = ctx->mbox->search_args_crc32;
 
 	buf = buffer_create_dynamic(pool_datastack_create(), name_pos + 256);
 	buffer_append(buf, &ext_hdr, sizeof(ext_hdr));