changeset 21530:c337e4fe88e5

lib-index: Add MAIL_INDEX_OPEN_FLAG_NO_DIRTY This way mailbox format backends that don't need dirty flags can use them for other purposes.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Wed, 08 Feb 2017 12:03:30 +0200
parents cb58131424be
children a326cf8a579a
files src/lib-index/mail-index-sync-update.c src/lib-index/mail-index-sync.c src/lib-index/mail-index.h
diffstat 3 files changed, 21 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-index/mail-index-sync-update.c	Fri Feb 10 16:26:15 2017 +0200
+++ b/src/lib-index/mail-index-sync-update.c	Wed Feb 08 12:03:30 2017 +0200
@@ -422,7 +422,8 @@
 	map->hdr.messages_count++;
 	map->hdr.next_uid = rec->uid+1;
 
-	if ((new_flags & MAIL_INDEX_MAIL_FLAG_DIRTY) != 0)
+	if ((new_flags & MAIL_INDEX_MAIL_FLAG_DIRTY) != 0 &&
+	    (view->index->flags & MAIL_INDEX_OPEN_FLAG_NO_DIRTY) == 0)
 		map->hdr.flags |= MAIL_INDEX_HDR_FLAG_HAVE_DIRTY;
 
 	mail_index_header_update_lowwaters(ctx, rec->uid, new_flags);
@@ -447,7 +448,8 @@
 					       seq1, seq2);
 	}
 
-	if ((u->add_flags & MAIL_INDEX_MAIL_FLAG_DIRTY) != 0)
+	if ((u->add_flags & MAIL_INDEX_MAIL_FLAG_DIRTY) != 0 &&
+	    (view->index->flags & MAIL_INDEX_OPEN_FLAG_NO_DIRTY) == 0)
 		view->map->hdr.flags |= MAIL_INDEX_HDR_FLAG_HAVE_DIRTY;
 
         flag_mask = ~u->remove_flags;
@@ -856,7 +858,8 @@
 	const struct mail_index_record *rec;
 	uint32_t seq;
 
-	if ((map->hdr.flags & MAIL_INDEX_HDR_FLAG_HAVE_DIRTY) != 0)
+	if ((map->hdr.flags & MAIL_INDEX_HDR_FLAG_HAVE_DIRTY) != 0 ||
+	    (map->index->flags & MAIL_INDEX_OPEN_FLAG_NO_DIRTY) != 0)
 		return;
 
 	/* do we have dirty flags anymore? */
--- a/src/lib-index/mail-index-sync.c	Fri Feb 10 16:26:15 2017 +0200
+++ b/src/lib-index/mail-index-sync.c	Wed Feb 08 12:03:30 2017 +0200
@@ -174,8 +174,9 @@
 	unsigned int i, keyword_count;
 	int ret;
 
-	if ((ctx->view->map->hdr.flags & MAIL_INDEX_HDR_FLAG_HAVE_DIRTY) &&
-	    (ctx->flags & MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY) != 0) {
+	if ((ctx->view->map->hdr.flags & MAIL_INDEX_HDR_FLAG_HAVE_DIRTY) != 0 &&
+	    (ctx->flags & MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY) != 0 &&
+	    (ctx->view->index->flags & MAIL_INDEX_OPEN_FLAG_NO_DIRTY) == 0) {
 		/* show dirty flags as flag updates */
 		mail_index_sync_add_dirty_updates(ctx);
 	}
@@ -252,8 +253,9 @@
 	    (flags & MAIL_INDEX_SYNC_FLAG_DROP_RECENT) != 0)
 		return TRUE;
 
-	if ((hdr->flags & MAIL_INDEX_HDR_FLAG_HAVE_DIRTY) &&
-	    (flags & MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY) != 0)
+	if ((hdr->flags & MAIL_INDEX_HDR_FLAG_HAVE_DIRTY) != 0 &&
+	    (flags & MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY) != 0 &&
+	    (index->flags & MAIL_INDEX_OPEN_FLAG_NO_DIRTY) == 0)
 		return TRUE;
 
 	if (log_file_seq == (uint32_t)-1) {
@@ -532,8 +534,9 @@
 	    (flags & MAIL_INDEX_SYNC_FLAG_DROP_RECENT) != 0)
 		return TRUE;
 
-	if ((view->map->hdr.flags & MAIL_INDEX_HDR_FLAG_HAVE_DIRTY) &&
-	    (flags & MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY) != 0)
+	if ((view->map->hdr.flags & MAIL_INDEX_HDR_FLAG_HAVE_DIRTY) != 0 &&
+	    (flags & MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY) != 0 &&
+	    (view->index->flags & MAIL_INDEX_OPEN_FLAG_NO_DIRTY) == 0)
 		return TRUE;
 
 	mail_transaction_log_get_head(view->index->log, &log_seq, &log_offset);
--- a/src/lib-index/mail-index.h	Fri Feb 10 16:26:15 2017 +0200
+++ b/src/lib-index/mail-index.h	Wed Feb 08 12:03:30 2017 +0200
@@ -37,6 +37,9 @@
 	MAIL_INDEX_OPEN_FLAG_SAVEONLY		= 0x400,
 	/* Enable debug logging */
 	MAIL_INDEX_OPEN_FLAG_DEBUG		= 0x800,
+	/* MAIL_INDEX_MAIL_FLAG_DIRTY can be used as a backend-specific flag.
+	   All special handling of the flag is disabled by this. */
+	MAIL_INDEX_OPEN_FLAG_NO_DIRTY		= 0x1000,
 };
 
 enum mail_index_header_compat_flags {
@@ -55,7 +58,9 @@
 enum mail_index_mail_flags {
 	/* For private use by backend. Replacing flags doesn't change this. */
 	MAIL_INDEX_MAIL_FLAG_BACKEND		= 0x40,
-	/* Message flags haven't been written to backend */
+	/* Message flags haven't been written to backend. If
+	   MAIL_INDEX_OPEN_FLAG_NO_DIRTY is set, this is treated as a
+	   backend-specific flag with no special internal handling. */
 	MAIL_INDEX_MAIL_FLAG_DIRTY		= 0x80,
 	/* Force updating this message's modseq via a flag update record */
 	MAIL_INDEX_MAIL_FLAG_UPDATE_MODSEQ	= 0x100