dovecot-2.0: Several fixes to mailbox_get_expunges().

dovecot at dovecot.org dovecot at dovecot.org
Wed Jul 15 21:13:07 EEST 2009


details:   http://hg.dovecot.org/dovecot-2.0/rev/ee69a1de3b30
changeset: 9631:ee69a1de3b30
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Jul 15 14:12:29 2009 -0400
description:
Several fixes to mailbox_get_expunges().

diffstat:

1 file changed, 21 insertions(+), 9 deletions(-)
src/lib-storage/index/index-fetch.c |   30 +++++++++++++++++++++---------

diffs (69 lines):

diff -r bbaa7a30b6cb -r ee69a1de3b30 src/lib-storage/index/index-fetch.c
--- 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 @@ add_expunges(ARRAY_TYPE(mailbox_expunge_
 
 	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 @@ bool index_storage_get_expunges(struct m
 	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 @@ bool index_storage_get_expunges(struct m
 	}
 
 	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 @@ bool index_storage_get_expunges(struct m
 	}
 
 	mail_transaction_log_view_close(&log_view);
-	return TRUE;
+	return ret < 0 || tail_seq != 0 ? FALSE : TRUE;
 }


More information about the dovecot-cvs mailing list