Mercurial > dovecot > core-2.2
changeset 2031:28d715a903e1 HEAD
Expunge fix
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 17 May 2004 19:31:25 +0300 |
parents | 4e331341d603 |
children | 1138c7abb360 |
files | src/lib-index/mail-transaction-util.c |
diffstat | 1 files changed, 8 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-transaction-util.c Mon May 17 16:08:09 2004 +0300 +++ b/src/lib-index/mail-transaction-util.c Mon May 17 19:31:25 2004 +0300 @@ -130,7 +130,7 @@ const struct mail_transaction_expunge *src_end; struct mail_transaction_expunge *dest; struct mail_transaction_expunge new_exp; - uint32_t cur_seq, prev_seq, expunges_before, count; + uint32_t expunges_before, count; size_t first, i, dest_count; i_assert(src_buf_size % sizeof(*src) == 0); @@ -140,19 +140,17 @@ dest = buffer_get_modifyable_data(expunges_buf, &dest_count); dest_count /= sizeof(*dest); - cur_seq = prev_seq = 1; expunges_before = 0; + expunges_before = 0; for (i = 0; src != src_end; src++) { /* src[] must be sorted. */ i_assert(src+1 == src_end || src->seq1 < src[1].seq1); for (; i < dest_count; i++) { - count = dest[i].seq1 - prev_seq; - if (cur_seq + count > src->seq1) + if (src->seq1 + expunges_before < dest[i].seq1) break; - cur_seq += count; + i_assert(src->uid2 > dest[i].uid1); expunges_before += dest[i].seq2 - dest[i].seq1 + 1; - prev_seq = dest[i].seq2+1; } new_exp = *src; @@ -167,8 +165,11 @@ /* we can/must merge with next record */ count = dest[i].seq2 - dest[i].seq1 + 1; expunges_before += count; + new_exp.seq2 += count; - new_exp.uid2 = dest[i].uid2; + if (new_exp.seq2 == dest[i].seq2) + new_exp.uid2 = dest[i].uid2; + i_assert(new_exp.uid2 >= dest[i].uid2); i++; }