changeset 3829:78692225c2ab HEAD

Hidden transaction changes weren't hiding everything. This resulted STORE +FLAGS.SILENT not being silent always.
author Timo Sirainen <tss@iki.fi>
date Fri, 06 Jan 2006 21:12:03 +0200
parents eba704899933
children 385139d2b082
files src/lib-index/mail-transaction-log-append.c
diffstat 1 files changed, 31 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-index/mail-transaction-log-append.c	Fri Jan 06 20:57:05 2006 +0200
+++ b/src/lib-index/mail-transaction-log-append.c	Fri Jan 06 21:12:03 2006 +0200
@@ -294,6 +294,11 @@
 	if ((hdr_buf->used % 4) != 0)
 		buffer_append_zero(hdr_buf, 4 - (hdr_buf->used % 4));
 
+	if (t->hide_transaction) {
+		mail_index_view_add_synced_transaction(t->view,
+			file->hdr.file_seq, file->sync_offset);
+	}
+
 	return log_append_buffer(file, buffer, hdr_buf,
 				 MAIL_TRANSACTION_KEYWORD_UPDATE, t->external);
 }
@@ -346,8 +351,9 @@
 	struct mail_transaction_log_file *file;
 	struct mail_index_header idx_hdr;
 	uoff_t append_offset;
+	unsigned int old_log_syncs_pos;
 	unsigned int lock_id;
-	int ret, visibility_changes = FALSE;
+	int ret;
 
 	index = mail_index_view_get_index(view);
 	log = index->log;
@@ -409,6 +415,9 @@
 	file->first_append_size = 0;
 	append_offset = file->sync_offset;
 
+	old_log_syncs_pos = !array_is_created(&view->log_syncs) ? 0 :
+		array_count(&view->log_syncs);
+
 	ret = 0;
 
 	/* send all extension introductions and resizes before appends
@@ -422,12 +431,18 @@
 					t->external);
 	}
 	if (array_is_created(&t->appends) && ret == 0) {
-                visibility_changes = TRUE;
+		if (t->hide_transaction) {
+			mail_index_view_add_synced_transaction(view,
+				file->hdr.file_seq, file->sync_offset);
+		}
 		ret = log_append_buffer(file, t->appends.buffer, NULL,
 					MAIL_TRANSACTION_APPEND, t->external);
 	}
 	if (array_is_created(&t->updates) && ret == 0) {
-                visibility_changes = TRUE;
+		if (t->hide_transaction) {
+			mail_index_view_add_synced_transaction(view,
+				file->hdr.file_seq, file->sync_offset);
+		}
 		ret = log_append_buffer(file, t->updates.buffer, NULL,
 					MAIL_TRANSACTION_FLAG_UPDATE,
 					t->external);
@@ -438,19 +453,19 @@
 
 	/* keyword resets before updates */
 	if (array_is_created(&t->keyword_resets) && ret == 0) {
-                visibility_changes = TRUE;
+		if (t->hide_transaction) {
+			mail_index_view_add_synced_transaction(view,
+				file->hdr.file_seq, file->sync_offset);
+		}
 		ret = log_append_buffer(file, t->keyword_resets.buffer, NULL,
 					MAIL_TRANSACTION_KEYWORD_RESET,
 					t->external);
 	}
-	if (array_is_created(&t->keyword_updates) && ret == 0) {
-                visibility_changes = TRUE;
+	if (array_is_created(&t->keyword_updates) && ret == 0)
 		ret = log_append_keyword_updates(file, t);
-	}
 
 	if (array_is_created(&t->expunges) && ret == 0) {
 		/* Expunges cannot be hidden */
-		visibility_changes = FALSE;
 		ret = log_append_buffer(file, t->expunges.buffer, NULL,
 					MAIL_TRANSACTION_EXPUNGE, t->external);
 	}
@@ -466,13 +481,6 @@
 					t->external);
 	}
 
-	if (ret == 0 && visibility_changes && t->hide_transaction) {
-		/* There are non-expunge changes that change the view, and
-		   we want them hidden. */
-		mail_index_view_add_synced_transaction(view, file->hdr.file_seq,
-						       append_offset);
-	}
-
 	if (!MAIL_TRANSACTION_LOG_FILE_IN_MEMORY(file)) {
 		if (ret == 0 && file->first_append_size != 0) {
 			/* synced - rewrite first record's header */
@@ -485,8 +493,15 @@
 		}
 	}
 
-	if (ret < 0)
+	if (ret < 0) {
+		if (array_is_created(&view->log_syncs)) {
+			/* revert changes to log_syncs */
+			array_delete(&view->log_syncs, old_log_syncs_pos,
+				     array_count(&view->log_syncs) -
+				     old_log_syncs_pos);
+		}
 		file->sync_offset = append_offset;
+	}
 
 	*log_file_seq_r = file->hdr.file_seq;
 	*log_file_offset_r = file->sync_offset;