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