From: Timo Sirainen Date: Sun, 12 Oct 2008 11:40:57 +0000 (+0300) Subject: Virtual mailboxes: If CRC32 of the search strings changes, rebuild the mailbox. X-Git-Tag: 1.2.alpha3~47 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7e209b78ca757294dbbc15604c88673b3a6b0c39;p=thirdparty%2Fdovecot%2Fcore.git Virtual mailboxes: If CRC32 of the search strings changes, rebuild the mailbox. --HG-- branch : HEAD --- diff --git a/src/plugins/virtual/virtual-config.c b/src/plugins/virtual/virtual-config.c index 90e4da2785..771a9902a5 100644 --- a/src/plugins/virtual/virtual-config.c +++ b/src/plugins/virtual/virtual-config.c @@ -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_parse_context *ctx, const char **error_r) 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_mailbox *mbox) 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 --git a/src/plugins/virtual/virtual-storage.h b/src/plugins/virtual/virtual-storage.h index 59a3be21d6..e57c027ba1 100644 --- a/src/plugins/virtual/virtual-storage.h +++ b/src/plugins/virtual/virtual-storage.h @@ -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 --git a/src/plugins/virtual/virtual-sync.c b/src/plugins/virtual/virtual-sync.c index 49472003bd..4bdd009b5e 100644 --- a/src/plugins/virtual/virtual-sync.c +++ b/src/plugins/virtual/virtual-sync.c @@ -153,7 +153,8 @@ static bool virtual_sync_ext_header_read(struct virtual_sync_context *ctx) 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_rewrite(struct virtual_sync_context *ctx) 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));