Mercurial > dovecot > original-hg > dovecot-1.2
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));