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