dovecot-1.2: Virtual mailboxes: If CRC32 of the search strings c...

dovecot at dovecot.org dovecot at dovecot.org
Sun Oct 12 14:48:22 EEST 2008


details:   http://hg.dovecot.org/dovecot-1.2/rev/eb320fbb87f0
changeset: 8268:eb320fbb87f0
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Oct 12 14:40:57 2008 +0300
description:
Virtual mailboxes: If CRC32 of the search strings changes, rebuild the mailbox.

diffstat:

3 files changed, 11 insertions(+), 2 deletions(-)
src/plugins/virtual/virtual-config.c  |    4 ++++
src/plugins/virtual/virtual-storage.h |    5 ++++-
src/plugins/virtual/virtual-sync.c    |    4 +++-

diffs (71 lines):

diff -r 3d2736ece94a -r eb320fbb87f0 src/plugins/virtual/virtual-config.c
--- 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 @@ virtual_config_add_rule(struct virtual_p
 		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 virtual_config_read(struct virtual_m
 	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);
diff -r 3d2736ece94a -r eb320fbb87f0 src/plugins/virtual/virtual-storage.h
--- 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 @@ struct virtual_mail_index_header {
 	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 @@ struct virtual_mailbox {
 	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;
diff -r 3d2736ece94a -r eb320fbb87f0 src/plugins/virtual/virtual-sync.c
--- 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 @@ static bool virtual_sync_ext_header_read
 
 	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 @@ static void virtual_sync_ext_header_rewr
 	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));


More information about the dovecot-cvs mailing list