# HG changeset patch # User Timo Sirainen # Date 1190457715 -10800 # Node ID 3132ce8f425d93e53bc58bdd1d40d54ee7317247 # Parent 880e1bf0127b4bf90482bacd5d7f795c405e6379 Added mail_index_sync_have_any(). 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 @@ 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 @@ 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(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; }