From 3f99d19bf3361a4b0952e4e3ad64d4d6988de469 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Mon, 13 Jul 2009 19:42:01 -0400 Subject: [PATCH] Mail index view syncs: Simplify code for getting list of expunges. --HG-- branch : HEAD --- src/lib-index/mail-index-view-sync.c | 88 +++++----------------------- 1 file changed, 16 insertions(+), 72 deletions(-) diff --git a/src/lib-index/mail-index-view-sync.c b/src/lib-index/mail-index-view-sync.c index 80c1ff1a2c..5044c74204 100644 --- a/src/lib-index/mail-index-view-sync.c +++ b/src/lib-index/mail-index-view-sync.c @@ -41,71 +41,6 @@ struct mail_index_view_sync_ctx { unsigned int hidden:1; }; -static int -mail_transaction_log_sort_expunges(ARRAY_TYPE(seq_range) *expunges, - const struct seq_range *src, size_t src_size) -{ - /* Note that all the sequences are actually still UIDs at this point */ - const struct seq_range *src_end; - struct seq_range *dest, new_exp; - unsigned int first, i, dest_count; - - i_assert(src_size % sizeof(*src) == 0); - - /* @UNSAFE */ - dest = array_get_modifiable(expunges, &dest_count); - if (dest_count == 0) { - array_append(expunges, src, src_size / sizeof(*src)); - return 0; - } - - src_end = CONST_PTR_OFFSET(src, src_size); - for (i = 0; src != src_end; src++) { - /* src[] must be sorted. */ - if (src->seq1 > src->seq2 || - (src+1 != src_end && src->seq2 >= src[1].seq1)) - return -1; - - for (; i < dest_count; i++) { - if (src->seq1 < dest[i].seq1) - break; - } - - new_exp = *src; - - first = i; - while (i < dest_count && src->seq2 >= dest[i].seq1-1) { - /* we can/must merge with next record */ - if (new_exp.seq2 < dest[i].seq2) - new_exp.seq2 = dest[i].seq2; - i++; - } - - if (first > 0 && new_exp.seq1 <= dest[first-1].seq2+1) { - /* continue previous record */ - if (dest[first-1].seq2 < new_exp.seq2) - dest[first-1].seq2 = new_exp.seq2; - } else if (i == first) { - array_insert(expunges, i, &new_exp, 1); - i++; first++; - - dest = array_get_modifiable(expunges, &dest_count); - } else { - /* use next record */ - dest[first] = new_exp; - first++; - } - - if (i > first) { - array_delete(expunges, first, i - first); - - dest = array_get_modifiable(expunges, &dest_count); - i = first; - } - } - return 0; -} - static int view_sync_set_log_view_range(struct mail_index_view *view, bool sync_expunges, bool *reset_r) @@ -175,6 +110,19 @@ view_sync_expunges2seqs(struct mail_index_view_sync_ctx *ctx) return expunge_count; } +static void +view_sync_add_expunge_range(ARRAY_TYPE(seq_range) *dest, + const struct seq_range *src, size_t src_size) +{ + unsigned int i, src_count; + + i_assert(src_size % sizeof(*src) == 0); + + src_count = src_size / sizeof(*src); + for (i = 0; i < src_count; i++) + seq_range_array_add_range(dest, src[i].seq1, src[i].seq2); +} + static int view_sync_get_expunges(struct mail_index_view_sync_ctx *ctx, unsigned int *expunge_count_r) @@ -186,7 +134,8 @@ view_sync_get_expunges(struct mail_index_view_sync_ctx *ctx, /* get a list of expunge transactions. there may be some that we have already synced, but it doesn't matter because they'll get dropped - out when converting to sequences */ + out when converting to sequences. the uid ranges' validity has + already been verified, so we can use them directly. */ mail_transaction_log_view_mark(view->log_view); while ((ret = mail_transaction_log_view_next(view->log_view, &hdr, &data)) > 0) { @@ -197,12 +146,7 @@ view_sync_get_expunges(struct mail_index_view_sync_ctx *ctx, continue; } - if (mail_transaction_log_sort_expunges(&ctx->expunges, data, - hdr->size) < 0) { - mail_transaction_log_view_set_corrupted(view->log_view, - "Corrupted expunge record"); - return -1; - } + view_sync_add_expunge_range(&ctx->expunges, data, hdr->size); } mail_transaction_log_view_rewind(view->log_view); -- 2.47.3