Mercurial > dovecot > original-hg > dovecot-1.2
changeset 7132:a1d1f7c9671e HEAD
Reverted fix for dropping expunged messages from flag updates. It's more
common that the UID range was actually meant to include the expunged
message.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 07 Jan 2008 07:34:08 +0200 |
parents | 0355a4603e80 |
children | e0115302e68e |
files | src/lib-index/mail-index-sync-keywords.c src/lib-index/mail-index-sync-private.h src/lib-index/mail-index-sync-update.c src/lib-index/mail-index-view-sync.c |
diffstat | 4 files changed, 32 insertions(+), 100 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-index-sync-keywords.c Sun Jan 06 16:29:19 2008 +0200 +++ b/src/lib-index/mail-index-sync-keywords.c Mon Jan 07 07:34:08 2008 +0200 @@ -191,19 +191,23 @@ i_assert(*keyword_idx_r / CHAR_BIT < ext->record_size); } -static void +static int keywords_update_records(struct mail_index_sync_map_ctx *ctx, const struct mail_index_ext *ext, unsigned int keyword_idx, enum modify_type type, - uint32_t seq1, uint32_t seq2) + uint32_t uid1, uint32_t uid2) { struct mail_index_view *view = ctx->view; struct mail_index_record *rec; unsigned char *data, data_mask; unsigned int data_offset; + uint32_t seq1, seq2; i_assert(keyword_idx != (unsigned int)-1); + if (!mail_index_lookup_seq_range(view, uid1, uid2, &seq1, &seq2)) + return 1; + mail_index_sync_write_seq_update(ctx, seq1, seq2); data_offset = keyword_idx / CHAR_BIT; @@ -233,6 +237,7 @@ default: i_unreached(); } + return 1; } int mail_index_sync_keywords(struct mail_index_sync_map_ctx *ctx, @@ -243,10 +248,9 @@ const char *keyword_name; const struct mail_index_ext *ext; const uint32_t *uid, *end; - struct sync_uid_range_iter iter; - uint32_t seq1, seq2; uint32_t seqset_offset, ext_map_idx; unsigned int keyword_idx; + int ret; seqset_offset = sizeof(*rec) + rec->name_size; if ((seqset_offset % 4) != 0) @@ -289,11 +293,12 @@ } while (uid+2 <= end) { - sync_uid_range_iter_init(&iter, ctx, uid[0], uid[1]); - while (sync_uid_range_iter_next(&iter, &seq1, &seq2)) { - keywords_update_records(ctx, ext, keyword_idx, - rec->modify_type, seq1, seq2); - } + ret = keywords_update_records(ctx, ext, keyword_idx, + rec->modify_type, + uid[0], uid[1]); + if (ret <= 0) + return ret; + uid += 2; } @@ -309,7 +314,6 @@ struct mail_index_record *rec; const struct mail_index_ext *ext; const struct mail_transaction_keyword_reset *end; - struct sync_uid_range_iter iter; uint32_t ext_map_idx, seq1, seq2; if (!mail_index_map_lookup_ext(map, "keywords", &ext_map_idx)) { @@ -320,14 +324,15 @@ ext = array_idx(&map->extensions, ext_map_idx); end = CONST_PTR_OFFSET(r, hdr->size); for (; r != end; r++) { - sync_uid_range_iter_init(&iter, ctx, r->uid1, r->uid2); - while (sync_uid_range_iter_next(&iter, &seq1, &seq2)) { - mail_index_sync_write_seq_update(ctx, seq1, seq2); - for (seq1--; seq1 < seq2; seq1++) { - rec = MAIL_INDEX_MAP_IDX(map, seq1); - memset(PTR_OFFSET(rec, ext->record_offset), - 0, ext->record_size); - } + if (!mail_index_lookup_seq_range(ctx->view, r->uid1, r->uid2, + &seq1, &seq2)) + continue; + + mail_index_sync_write_seq_update(ctx, seq1, seq2); + for (seq1--; seq1 < seq2; seq1++) { + rec = MAIL_INDEX_MAP_IDX(map, seq1); + memset(PTR_OFFSET(rec, ext->record_offset), + 0, ext->record_size); } } return 1;
--- a/src/lib-index/mail-index-sync-private.h Sun Jan 06 16:29:19 2008 +0200 +++ b/src/lib-index/mail-index-sync-private.h Mon Jan 07 07:34:08 2008 +0200 @@ -8,11 +8,6 @@ }; ARRAY_DEFINE_TYPE(uid_range, struct uid_range); -struct sync_uid_range_iter { - struct mail_index_sync_map_ctx *ctx; - uint32_t seq1, seq2; -}; - struct mail_index_sync_list { const ARRAY_TYPE(uid_range) *array; unsigned int idx; @@ -57,12 +52,6 @@ int mail_index_sync_map(struct mail_index_map **map, enum mail_index_sync_handler_type type, bool force); -void sync_uid_range_iter_init(struct sync_uid_range_iter *iter, - struct mail_index_sync_map_ctx *ctx, - uint32_t uid1, uint32_t uid2); -bool sync_uid_range_iter_next(struct sync_uid_range_iter *iter, - uint32_t *seq1_r, uint32_t *seq2_r); - int mail_index_sync_record(struct mail_index_sync_map_ctx *ctx, const struct mail_transaction_header *hdr, const void *data);
--- a/src/lib-index/mail-index-sync-update.c Sun Jan 06 16:29:19 2008 +0200 +++ b/src/lib-index/mail-index-sync-update.c Mon Jan 07 07:34:08 2008 +0200 @@ -88,55 +88,6 @@ return ctx->view->map; } -void sync_uid_range_iter_init(struct sync_uid_range_iter *iter, - struct mail_index_sync_map_ctx *ctx, - uint32_t uid1, uint32_t uid2) -{ - memset(iter, 0, sizeof(*iter)); - iter->ctx = ctx; - if (!mail_index_lookup_seq_range(ctx->view, uid1, uid2, - &iter->seq1, &iter->seq2)) - iter->seq1 = 1; -} - -bool sync_uid_range_iter_next(struct sync_uid_range_iter *iter, - uint32_t *seq1_r, uint32_t *seq2_r) -{ - struct mail_index_view *view; - uint32_t seq; - - if (iter->seq1 > iter->seq2) - return FALSE; - - if (iter->ctx->type != MAIL_INDEX_SYNC_HANDLER_VIEW) { - *seq1_r = iter->seq1; - *seq2_r = iter->seq2; - iter->seq1 = iter->seq2 + 1; - return TRUE; - } - view = iter->ctx->view; - - /* with views we have to drop expunged messages from the range. - first skip over any expunged messages from the beginning of the - range. */ - for (seq = iter->seq1; seq <= iter->seq2; seq++) { - if (!mail_index_is_expunged(view, seq)) - break; - } - if (seq > iter->seq2) - return FALSE; - *seq1_r = seq; - - /* go forward until we find the first expunged message */ - for (seq++; seq <= iter->seq2; seq++) { - if (mail_index_is_expunged(view, seq)) - break; - } - *seq2_r = seq - 1; - iter->seq1 = seq; - return TRUE; -} - static int mail_index_header_update_counts(struct mail_index_header *hdr, uint8_t old_flags, uint8_t new_flags, @@ -387,14 +338,16 @@ return 1; } -static void sync_flag_update_range(struct mail_index_sync_map_ctx *ctx, - const struct mail_transaction_flag_update *u, - uint32_t seq1, uint32_t seq2) +static int sync_flag_update(const struct mail_transaction_flag_update *u, + struct mail_index_sync_map_ctx *ctx) { struct mail_index_view *view = ctx->view; struct mail_index_record *rec; uint8_t flag_mask, old_flags; - uint32_t idx; + uint32_t idx, seq1, seq2; + + if (!mail_index_lookup_seq_range(view, u->uid1, u->uid2, &seq1, &seq2)) + return 1; mail_index_sync_write_seq_update(ctx, seq1, seq2); @@ -424,17 +377,6 @@ rec->flags, TRUE); } } -} - -static int sync_flag_update(const struct mail_transaction_flag_update *u, - struct mail_index_sync_map_ctx *ctx) -{ - struct sync_uid_range_iter iter; - uint32_t seq1, seq2; - - sync_uid_range_iter_init(&iter, ctx, u->uid1, u->uid2); - while (sync_uid_range_iter_next(&iter, &seq1, &seq2)) - sync_flag_update_range(ctx, u, seq1, seq2); return 1; }
--- a/src/lib-index/mail-index-view-sync.c Sun Jan 06 16:29:19 2008 +0200 +++ b/src/lib-index/mail-index-view-sync.c Mon Jan 07 07:34:08 2008 +0200 @@ -309,6 +309,8 @@ ctx->expunges = expunges; ctx->finish_min_msg_count = reset || quick_sync ? 0 : view->map->hdr.messages_count - expunge_count; + mail_index_sync_map_init(&ctx->sync_map_ctx, view, + MAIL_INDEX_SYNC_HANDLER_VIEW); if (reset && view->map->hdr.messages_count > 0 && (flags & MAIL_INDEX_VIEW_SYNC_FLAG_FIX_INCONSISTENT) == 0) { @@ -358,11 +360,6 @@ } } - if (ctx->sync_map_update) { - mail_index_sync_map_init(&ctx->sync_map_ctx, view, - MAIL_INDEX_SYNC_HANDLER_VIEW); - } - #ifdef DEBUG mail_index_map_check(view->map); #endif @@ -689,8 +686,7 @@ view->map->hdr.log_file_tail_offset = 0; } - if (ctx->sync_map_update) - mail_index_sync_map_deinit(&ctx->sync_map_ctx); + mail_index_sync_map_deinit(&ctx->sync_map_ctx); mail_index_view_sync_clean_log_syncs(ctx->view); #ifdef DEBUG