From: Timo Sirainen Date: Thu, 6 Aug 2009 00:01:34 +0000 (-0400) Subject: lib-index: Added mail_index_update_highest_modseq(). X-Git-Tag: 2.0.alpha1~327 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4b89231f4ec9cc69f4aea715e1d34f405c7e317d;p=thirdparty%2Fdovecot%2Fcore.git lib-index: Added mail_index_update_highest_modseq(). --HG-- branch : HEAD --- diff --git a/src/lib-index/mail-index-sync-update.c b/src/lib-index/mail-index-sync-update.c index f60cb43d81..370ff99f39 100644 --- a/src/lib-index/mail-index-sync-update.c +++ b/src/lib-index/mail-index-sync-update.c @@ -325,14 +325,17 @@ sync_modseq_update(struct mail_index_sync_map_ctx *ctx, end = CONST_PTR_OFFSET(u, size); for (; u < end; u++) { - if (!mail_index_lookup_seq(view, u->uid, &seq)) + if (u->uid == 0) + seq = 0; + else if (!mail_index_lookup_seq(view, u->uid, &seq)) continue; min_modseq = ((uint64_t)u->modseq_high32 >> 32) | u->modseq_low32; if (highest_modseq < min_modseq) highest_modseq = min_modseq; - if (mail_index_modseq_set(view, seq, min_modseq) < 0) { + if (seq != 0 && + mail_index_modseq_set(view, seq, min_modseq) < 0) { mail_index_sync_set_corrupted(ctx, "modseqs updated before they were enabled"); return -1; diff --git a/src/lib-index/mail-index-transaction-finish.c b/src/lib-index/mail-index-transaction-finish.c index 6a2e53438f..bd570fb72a 100644 --- a/src/lib-index/mail-index-transaction-finish.c +++ b/src/lib-index/mail-index-transaction-finish.c @@ -342,5 +342,9 @@ int mail_index_transaction_finish(struct mail_index_transaction *t) /* finally convert all sequences to UIDs before we write them, but after we've checked and removed conflicts */ mail_index_transaction_convert_to_uids(t); + + /* and kind of ugly way to update highest modseq */ + if (t->min_highest_modseq != 0) + mail_index_update_modseq(t, 0, t->min_highest_modseq); return 0; } diff --git a/src/lib-index/mail-index-transaction-private.h b/src/lib-index/mail-index-transaction-private.h index 19d4e51e2f..a0cd0af78a 100644 --- a/src/lib-index/mail-index-transaction-private.h +++ b/src/lib-index/mail-index-transaction-private.h @@ -68,6 +68,7 @@ struct mail_index_transaction { struct mail_index_transaction_keyword_update); ARRAY_TYPE(seq_range) keyword_resets; + uint64_t min_highest_modseq; uint64_t max_modseq; ARRAY_TYPE(seq_range) *conflict_seqs; diff --git a/src/lib-index/mail-index-transaction-update.c b/src/lib-index/mail-index-transaction-update.c index 490055c1a2..9c7076fa60 100644 --- a/src/lib-index/mail-index-transaction-update.c +++ b/src/lib-index/mail-index-transaction-update.c @@ -91,6 +91,7 @@ void mail_index_transaction_reset_v(struct mail_index_transaction *t) t->last_update_idx = 0; t->min_flagupdate_seq = 0; t->max_flagupdate_seq = 0; + t->min_highest_modseq = 0; memset(t->pre_hdr_mask, 0, sizeof(t->pre_hdr_mask)); memset(t->post_hdr_mask, 0, sizeof(t->post_hdr_mask)); @@ -114,7 +115,8 @@ void mail_index_transaction_set_log_updates(struct mail_index_transaction *t) array_is_created(&t->expunges) || array_is_created(&t->keyword_resets) || array_is_created(&t->keyword_updates) || - t->pre_hdr_changed || t->post_hdr_changed; + t->pre_hdr_changed || t->post_hdr_changed || + t->min_highest_modseq != 0; } void mail_index_update_day_headers(struct mail_index_transaction *t) @@ -268,6 +270,17 @@ void mail_index_update_modseq(struct mail_index_transaction *t, uint32_t seq, u->uid = seq; u->modseq_low32 = min_modseq & 0xffffffff; u->modseq_high32 = min_modseq >> 32; + + t->log_updates = TRUE; +} + +void mail_index_update_highest_modseq(struct mail_index_transaction *t, + uint64_t min_modseq) +{ + if (t->min_highest_modseq < min_modseq) + t->min_highest_modseq = min_modseq; + + t->log_updates = TRUE; } static void diff --git a/src/lib-index/mail-index.h b/src/lib-index/mail-index.h index 65ae7a0830..8bbfe8bf39 100644 --- a/src/lib-index/mail-index.h +++ b/src/lib-index/mail-index.h @@ -426,6 +426,9 @@ void mail_index_update_flags_range(struct mail_index_transaction *t, /* Update message's modseq to be at least min_modseq. */ void mail_index_update_modseq(struct mail_index_transaction *t, uint32_t seq, uint64_t min_modseq); +/* Update highest modseq to be at least min_modseq. */ +void mail_index_update_highest_modseq(struct mail_index_transaction *t, + uint64_t min_modseq); /* Reset the index before committing this transaction. This is usually done only when UIDVALIDITY changes. */ void mail_index_reset(struct mail_index_transaction *t); diff --git a/src/lib-index/test-mail-index-transaction-finish.c b/src/lib-index/test-mail-index-transaction-finish.c index ddd18e5749..491da830c5 100644 --- a/src/lib-index/test-mail-index-transaction-finish.c +++ b/src/lib-index/test-mail-index-transaction-finish.c @@ -27,6 +27,8 @@ bool mail_index_cancel_keyword_updates(struct mail_index_transaction *t ATTR_UNU void mail_index_transaction_sort_appends(struct mail_index_transaction *t ATTR_UNUSED) {} int mail_index_map(struct mail_index *index ATTR_UNUSED, enum mail_index_sync_handler_type type ATTR_UNUSED) { return 1; } +void mail_index_update_modseq(struct mail_index_transaction *t ATTR_UNUSED, uint32_t seq ATTR_UNUSED, + uint64_t min_modseq ATTR_UNUSED) {} const struct mail_index_record * mail_index_lookup(struct mail_index_view *view ATTR_UNUSED, uint32_t seq)