changeset 7463:d1bd08d468d0 HEAD

Reset cached \Recent flags if UIDVALIDITY changes, because we were using UIDs in the cache.
author Timo Sirainen <tss@iki.fi>
date Fri, 25 Apr 2008 01:49:39 +0300
parents 068f6eefc62b
children 4dc5542f58aa
files src/lib-storage/index/dbox/dbox-sync-rebuild.c src/lib-storage/index/index-storage.h src/lib-storage/index/index-sync.c src/lib-storage/index/maildir/maildir-sync-index.c src/lib-storage/index/mbox/mbox-sync.c
diffstat 5 files changed, 12 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/dbox/dbox-sync-rebuild.c	Fri Apr 25 01:31:05 2008 +0300
+++ b/src/lib-storage/index/dbox/dbox-sync-rebuild.c	Fri Apr 25 01:49:39 2008 +0300
@@ -413,6 +413,7 @@
 					MAIL_INDEX_TRANSACTION_FLAG_EXTERNAL);
 	i_array_init(&ctx.maildir_new_files, 8);
 	mail_index_reset(ctx.trans);
+	index_mailbox_reset_uidvalidity(&mbox->ibox);
 	mail_index_ext_lookup(mbox->ibox.index, "cache", &ctx.cache_ext_id);
 
 	if ((ret = dbox_sync_index_rebuild_ctx(&ctx)) < 0)
--- a/src/lib-storage/index/index-storage.h	Fri Apr 25 01:31:05 2008 +0300
+++ b/src/lib-storage/index/index-storage.h	Fri Apr 25 01:49:39 2008 +0300
@@ -121,6 +121,7 @@
 				  uint32_t seq1, uint32_t seq2);
 bool index_mailbox_is_recent(struct index_mailbox *ibox, uint32_t uid);
 unsigned int index_mailbox_get_recent_count(struct index_mailbox *ibox);
+void index_mailbox_reset_uidvalidity(struct index_mailbox *ibox);
 
 void index_mailbox_check_add(struct index_mailbox *ibox,
 			     const char *path);
--- a/src/lib-storage/index/index-sync.c	Fri Apr 25 01:31:05 2008 +0300
+++ b/src/lib-storage/index/index-sync.c	Fri Apr 25 01:49:39 2008 +0300
@@ -63,6 +63,14 @@
 		seq_range_exists(&ibox->recent_flags, uid);
 }
 
+void index_mailbox_reset_uidvalidity(struct index_mailbox *ibox)
+{
+	/* can't trust the currently cached recent flags anymore */
+	array_clear(&ibox->recent_flags);
+	ibox->recent_flags_count = 0;
+	ibox->recent_flags_prev_uid = 0;
+}
+
 unsigned int index_mailbox_get_recent_count(struct index_mailbox *ibox)
 {
 	const struct mail_index_header *hdr;
--- a/src/lib-storage/index/maildir/maildir-sync-index.c	Fri Apr 25 01:31:05 2008 +0300
+++ b/src/lib-storage/index/maildir/maildir-sync-index.c	Fri Apr 25 01:49:39 2008 +0300
@@ -289,6 +289,7 @@
 		i_warning("Maildir %s: UIDVALIDITY changed (%u -> %u)",
 			  mbox->path, hdr->uid_validity, uid_validity);
 		mail_index_reset(trans);
+		index_mailbox_reset_uidvalidity(&mbox->ibox);
 		maildir_uidlist_set_next_uid(mbox->uidlist, 1, TRUE);
 
 		memset(&empty_hdr, 0, sizeof(empty_hdr));
--- a/src/lib-storage/index/mbox/mbox-sync.c	Fri Apr 25 01:31:05 2008 +0300
+++ b/src/lib-storage/index/mbox/mbox-sync.c	Fri Apr 25 01:49:39 2008 +0300
@@ -1441,6 +1441,7 @@
 		mail_index_reset(sync_ctx->t);
 		sync_ctx->reset_hdr.next_uid = 1;
 		sync_ctx->hdr = &sync_ctx->reset_hdr;
+		index_mailbox_reset_uidvalidity(&sync_ctx->mbox->ibox);
 	}
 
 	sync_ctx->prev_msg_uid = 0;