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