]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Virtual mailboxes: If CRC32 of the search strings changes, rebuild the mailbox.
authorTimo Sirainen <tss@iki.fi>
Sun, 12 Oct 2008 11:40:57 +0000 (14:40 +0300)
committerTimo Sirainen <tss@iki.fi>
Sun, 12 Oct 2008 11:40:57 +0000 (14:40 +0300)
--HG--
branch : HEAD

src/plugins/virtual/virtual-config.c
src/plugins/virtual/virtual-storage.h
src/plugins/virtual/virtual-sync.c

index 90e4da27852be218e026943048bafcff3809b0c8..771a9902a582713715deec46b85187cc00d0a163 100644 (file)
@@ -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);
index 59a3be21d6ecbfc76af7d468908ce53786c22950..e57c027ba1c5e037fa5e452ad69739791e21d1d7 100644 (file)
@@ -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;
index 49472003bd3127a6431dc36769ee6a0d2003997e..4bdd009b5e6d7a32455ba72eb38851e7a5cf2089 100644 (file)
@@ -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));