Mercurial > dovecot > original-hg > dovecot-1.2
changeset 6450:3132ce8f425d HEAD
Added mail_index_sync_have_any().
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 22 Sep 2007 13:41:55 +0300 |
parents | 880e1bf0127b |
children | cbfce8bbc917 |
files | src/lib-index/mail-index-sync.c src/lib-index/mail-index.h src/lib-index/mail-transaction-log.c |
diffstat | 3 files changed, 60 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- 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)
--- 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);
--- 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; }