Mercurial > dovecot > core-2.2
changeset 9631:ee69a1de3b30 HEAD
Several fixes to mailbox_get_expunges().
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 15 Jul 2009 14:12:29 -0400 |
parents | bbaa7a30b6cb |
children | 85064a01ddfd |
files | src/lib-storage/index/index-fetch.c |
diffstat | 1 files changed, 21 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/index-fetch.c Wed Jul 15 12:59:17 2009 -0400 +++ b/src/lib-storage/index/index-fetch.c Wed Jul 15 14:12:29 2009 -0400 @@ -50,7 +50,7 @@ end = src + src_size / sizeof(*src); for (; src != end; src++) { - for (uid = src->uid1; uid < src->uid2; uid++) { + for (uid = src->uid1; uid <= src->uid2; uid++) { if (seq_range_exists(uids_filter, uid)) { expunge = array_append_space(expunges); expunge->uid = uid; @@ -87,9 +87,10 @@ struct mail_transaction_log_view *log_view; const struct mail_transaction_header *thdr; const void *tdata; - uint32_t log_seq; + uint32_t log_seq, tail_seq = 0; uoff_t log_offset; bool reset; + int ret; if (!mail_index_modseq_get_next_log_offset(ibox->view, prev_modseq, &log_seq, &log_offset)) @@ -102,20 +103,31 @@ } log_view = mail_transaction_log_view_open(ibox->index->log); - if (mail_transaction_log_view_set(log_view, log_seq, log_offset, - ibox->view->log_file_head_seq, - ibox->view->log_file_head_offset, - &reset) <= 0) { + ret = mail_transaction_log_view_set(log_view, log_seq, log_offset, + ibox->view->log_file_head_seq, + ibox->view->log_file_head_offset, + &reset); + if (ret == 0) { + mail_transaction_log_get_tail(ibox->index->log, &tail_seq); + i_assert(tail_seq > log_seq); + ret = mail_transaction_log_view_set(log_view, tail_seq, 0, + ibox->view->log_file_head_seq, + ibox->view->log_file_head_offset, + &reset); + i_assert(ret != 0); + } + if (ret <= 0) { mail_transaction_log_view_close(&log_view); return FALSE; } - while (mail_transaction_log_view_next(log_view, &thdr, &tdata) > 0) { + while ((ret = mail_transaction_log_view_next(log_view, + &thdr, &tdata)) > 0) { if ((thdr->type & MAIL_TRANSACTION_EXTERNAL) == 0) { /* skip expunge requests */ continue; } - switch (thdr->type) { + switch (thdr->type & MAIL_TRANSACTION_TYPE_MASK) { case MAIL_TRANSACTION_EXPUNGE: add_expunges(expunges, tdata, thdr->size, uids_filter); break; @@ -127,5 +139,5 @@ } mail_transaction_log_view_close(&log_view); - return TRUE; + return ret < 0 || tail_seq != 0 ? FALSE : TRUE; }