dovecot: Added mail_index_sync_have_any().

dovecot at dovecot.org dovecot at dovecot.org
Sat Sep 22 13:55:43 EEST 2007


details:   http://hg.dovecot.org/dovecot/rev/3132ce8f425d
changeset: 6450:3132ce8f425d
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Sep 22 13:41:55 2007 +0300
description:
Added mail_index_sync_have_any().

diffstat:

3 files changed, 60 insertions(+), 2 deletions(-)
src/lib-index/mail-index-sync.c      |   57 ++++++++++++++++++++++++++++++++++
src/lib-index/mail-index.h           |    3 +
src/lib-index/mail-transaction-log.c |    2 -

diffs (92 lines):

diff -r 880e1bf0127b -r 3132ce8f425d src/lib-index/mail-index-sync.c
--- a/src/lib-index/mail-index-sync.c	Sat Sep 22 12:53:03 2007 +0300
+++ b/src/lib-index/mail-index-sync.c	Sat Sep 22 13:41:55 2007 +0300
@@ -412,6 +412,63 @@ int mail_index_sync_begin_to(struct mail
 	return 1;
 }
 
+static bool mail_index_sync_view_have_any(struct mail_index_view *view,
+					  enum mail_index_sync_flags flags)
+{
+	const struct mail_transaction_header *hdr;
+	const void *data;
+	uint32_t log_seq;
+	uoff_t log_offset;
+	bool reset;
+	int ret;
+
+	if (view->map->hdr.first_recent_uid < view->map->hdr.next_uid &&
+	    (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)
+		return TRUE;
+
+	mail_transaction_log_get_head(view->index->log, &log_seq, &log_offset);
+	if (mail_transaction_log_view_set(view->log_view,
+					  view->map->hdr.log_file_seq,
+					  view->map->hdr.log_file_tail_offset,
+					  log_seq, log_offset, &reset) <= 0) {
+		/* let the actual syncing handle the error */
+		return TRUE;
+	}
+
+	while ((ret = mail_transaction_log_view_next(view->log_view,
+						     &hdr, &data)) > 0) {
+		if ((hdr->type & MAIL_TRANSACTION_EXTERNAL) != 0)
+			continue;
+
+		switch (hdr->type & MAIL_TRANSACTION_TYPE_MASK) {
+		case MAIL_TRANSACTION_EXPUNGE:
+		case MAIL_TRANSACTION_FLAG_UPDATE:
+		case MAIL_TRANSACTION_KEYWORD_UPDATE:
+		case MAIL_TRANSACTION_KEYWORD_RESET:
+			return TRUE;
+		default:
+			break;
+		}
+	}
+	return ret < 0;
+}
+
+bool mail_index_sync_have_any(struct mail_index *index,
+			      enum mail_index_sync_flags flags)
+{
+	struct mail_index_view *view;
+	bool ret;
+
+	view = mail_index_view_open(index);
+	ret = mail_index_sync_view_have_any(view, flags);
+	mail_index_view_close(&view);
+	return ret;
+}
+
 static void
 mail_index_sync_get_expunge(struct mail_index_sync_rec *rec,
 			    const struct mail_transaction_expunge *exp)
diff -r 880e1bf0127b -r 3132ce8f425d src/lib-index/mail-index.h
--- a/src/lib-index/mail-index.h	Sat Sep 22 12:53:03 2007 +0300
+++ b/src/lib-index/mail-index.h	Sat Sep 22 13:41:55 2007 +0300
@@ -260,6 +260,9 @@ int mail_index_sync_begin_to(struct mail
 			     struct mail_index_transaction **trans_r,
 			     uint32_t log_file_seq, uoff_t log_file_offset,
 			     enum mail_index_sync_flags flags);
+/* Returns TRUE if it currently looks like syncing would return changes. */
+bool mail_index_sync_have_any(struct mail_index *index,
+			      enum mail_index_sync_flags flags);
 /* Returns -1 if error, 0 if sync is finished, 1 if record was filled. */
 bool mail_index_sync_next(struct mail_index_sync_ctx *ctx,
 			  struct mail_index_sync_rec *sync_rec);
diff -r 880e1bf0127b -r 3132ce8f425d src/lib-index/mail-transaction-log.c
--- a/src/lib-index/mail-transaction-log.c	Sat Sep 22 12:53:03 2007 +0300
+++ b/src/lib-index/mail-transaction-log.c	Sat Sep 22 13:41:55 2007 +0300
@@ -446,8 +446,6 @@ void mail_transaction_log_get_head(struc
 void mail_transaction_log_get_head(struct mail_transaction_log *log,
 				   uint32_t *file_seq_r, uoff_t *file_offset_r)
 {
-	i_assert(log->index->log_locked);
-
 	*file_seq_r = log->head->hdr.file_seq;
 	*file_offset_r = log->head->sync_offset;
 }


More information about the dovecot-cvs mailing list