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;
 }