changeset 7464:4dc5542f58aa HEAD

Fixes to handling recent flags with UIDVALIDITY changing.
author Timo Sirainen <tss@iki.fi>
date Fri, 25 Apr 2008 02:10:36 +0300
parents d1bd08d468d0
children 6c6af734f284
files src/lib-storage/index/index-sync.c src/lib-storage/index/maildir/maildir-sync-index.c
diffstat 2 files changed, 11 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/index-sync.c	Fri Apr 25 01:49:39 2008 +0300
+++ b/src/lib-storage/index/index-sync.c	Fri Apr 25 02:10:36 2008 +0300
@@ -66,7 +66,8 @@
 void index_mailbox_reset_uidvalidity(struct index_mailbox *ibox)
 {
 	/* can't trust the currently cached recent flags anymore */
-	array_clear(&ibox->recent_flags);
+	if (array_is_created(&ibox->recent_flags))
+		array_clear(&ibox->recent_flags);
 	ibox->recent_flags_count = 0;
 	ibox->recent_flags_prev_uid = 0;
 }
--- a/src/lib-storage/index/maildir/maildir-sync-index.c	Fri Apr 25 01:49:39 2008 +0300
+++ b/src/lib-storage/index/maildir/maildir-sync-index.c	Fri Apr 25 02:10:36 2008 +0300
@@ -272,6 +272,7 @@
 	const char *filename;
 	ARRAY_TYPE(keyword_indexes) idx_keywords;
 	uint32_t uid_validity, next_uid, hdr_next_uid, first_recent_uid;
+	uint32_t first_uid;
 	unsigned int changes = 0;
 	int ret = 0;
 	bool expunged, full_rescan = FALSE;
@@ -279,6 +280,7 @@
 	i_assert(!mbox->syncing_commit);
 	i_assert(maildir_uidlist_is_locked(mbox->uidlist));
 
+	first_uid = 1;
 	hdr = mail_index_get_header(view);
 	uid_validity = maildir_uidlist_get_uid_validity(mbox->uidlist);
 	if (uid_validity != hdr->uid_validity &&
@@ -292,6 +294,7 @@
 		index_mailbox_reset_uidvalidity(&mbox->ibox);
 		maildir_uidlist_set_next_uid(mbox->uidlist, 1, TRUE);
 
+		first_uid = hdr->messages_count + 1;
 		memset(&empty_hdr, 0, sizeof(empty_hdr));
 		empty_hdr.next_uid = 1;
 		hdr = &empty_hdr;
@@ -439,8 +442,13 @@
 	   appended messages. */
 	view2 = mail_index_transaction_open_updated_view(trans);
 	if (mail_index_lookup_seq_range(view2, first_recent_uid, (uint32_t)-1,
-					&seq, &seq2))
+					&seq, &seq2) && seq2 >= first_uid) {
+		if (seq < first_uid) {
+			/* UIDVALIDITY changed, skip over the old messages */
+			seq = first_uid;
+		}
 		index_mailbox_set_recent_seq(&mbox->ibox, view2, seq, seq2);
+	}
 	mail_index_view_close(&view2);
 
 	if (ctx->uidlist_sync_ctx != NULL) {