From 88553367d677170a4b703b9d52aac9eabf91c656 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Mon, 26 Jul 2004 21:52:06 +0300 Subject: [PATCH] Fixed recent flags with mbox. --HG-- branch : HEAD --- src/lib-index/mail-index-sync.c | 44 ++++++++++++++++--- src/lib-index/mail-index-view-sync.c | 3 +- src/lib-index/mail-index.h | 3 +- src/lib-storage/index/maildir/maildir-sync.c | 4 +- src/lib-storage/index/mbox/mbox-sync-update.c | 7 ++- src/lib-storage/index/mbox/mbox-sync.c | 36 +++++++++------ 6 files changed, 73 insertions(+), 24 deletions(-) diff --git a/src/lib-index/mail-index-sync.c b/src/lib-index/mail-index-sync.c index 15993128c4..18cc932277 100644 --- a/src/lib-index/mail-index-sync.c +++ b/src/lib-index/mail-index-sync.c @@ -174,7 +174,31 @@ static int mail_index_sync_add_dirty_updates(struct mail_index_sync_ctx *ctx) return 0; } -static int mail_index_sync_read_and_sort(struct mail_index_sync_ctx *ctx) +static int mail_index_sync_add_recent_updates(struct mail_index_sync_ctx *ctx) +{ + struct mail_transaction_flag_update update; + const struct mail_index_record *rec; + uint32_t seq, messages_count; + + memset(&update, 0, sizeof(update)); + + messages_count = mail_index_view_get_message_count(ctx->view); + for (seq = 1; seq <= messages_count; seq++) { + if (mail_index_lookup(ctx->view, seq, &rec) < 0) + return -1; + + if ((rec->flags & MAIL_RECENT) == 0) + continue; + + update.uid1 = update.uid2 = rec->uid; + mail_index_sync_sort_flags(ctx->updates_buf, + &update, sizeof(update)); + } + return 0; +} + +static int +mail_index_sync_read_and_sort(struct mail_index_sync_ctx *ctx, int sync_recent) { size_t size; int ret; @@ -185,6 +209,11 @@ static int mail_index_sync_read_and_sort(struct mail_index_sync_ctx *ctx) return -1; } + if (sync_recent) { + if (mail_index_sync_add_recent_updates(ctx) < 0) + return -1; + } + while ((ret = mail_transaction_log_view_next(ctx->view->log_view, &ctx->hdr, &ctx->data, NULL)) > 0) { @@ -200,9 +229,12 @@ static int mail_index_sync_read_and_sort(struct mail_index_sync_ctx *ctx) return ret; } -static int mail_index_need_lock(struct mail_index *index, +static int mail_index_need_lock(struct mail_index *index, int sync_recent, uint32_t log_file_seq, uoff_t log_file_offset) { + if (sync_recent && index->hdr->recent_messages_count > 0) + return 1; + if (index->hdr->log_file_seq > log_file_seq || (index->hdr->log_file_seq == log_file_seq && index->hdr->log_file_offset >= log_file_offset)) { @@ -216,7 +248,8 @@ static int mail_index_need_lock(struct mail_index *index, int mail_index_sync_begin(struct mail_index *index, struct mail_index_sync_ctx **ctx_r, struct mail_index_view **view_r, - uint32_t log_file_seq, uoff_t log_file_offset) + uint32_t log_file_seq, uoff_t log_file_offset, + int sync_recent) { struct mail_index_sync_ctx *ctx; uint32_t seq; @@ -237,7 +270,8 @@ int mail_index_sync_begin(struct mail_index *index, return -1; } - if (!mail_index_need_lock(index, log_file_seq, log_file_offset)) { + if (!mail_index_need_lock(index, sync_recent, + log_file_seq, log_file_offset)) { mail_index_unlock(index, lock_id); mail_transaction_log_sync_unlock(index->log); return 0; @@ -265,7 +299,7 @@ int mail_index_sync_begin(struct mail_index *index, 1024, (size_t)-1); ctx->updates_buf = buffer_create_dynamic(default_pool, 1024, (size_t)-1); - if (mail_index_sync_read_and_sort(ctx) < 0) { + if (mail_index_sync_read_and_sort(ctx, sync_recent) < 0) { mail_index_sync_end(ctx); return -1; } diff --git a/src/lib-index/mail-index-view-sync.c b/src/lib-index/mail-index-view-sync.c index 13b70e1730..9af5555376 100644 --- a/src/lib-index/mail-index-view-sync.c +++ b/src/lib-index/mail-index-view-sync.c @@ -218,7 +218,8 @@ static int mail_index_view_sync_next_trans(struct mail_index_view_sync_ctx *ctx, } #define FLAG_UPDATE_IS_INTERNAL(u, empty) \ - (((u)->add_flags | (u)->remove_flags) == MAIL_INDEX_MAIL_FLAG_DIRTY && \ + ((((u)->add_flags | (u)->remove_flags) & \ + ~(MAIL_INDEX_MAIL_FLAG_DIRTY | MAIL_RECENT)) == 0 && \ memcmp((u)->add_keywords, empty, INDEX_KEYWORDS_BYTE_COUNT) == 0 && \ memcmp((u)->add_keywords, empty, INDEX_KEYWORDS_BYTE_COUNT) == 0) diff --git a/src/lib-index/mail-index.h b/src/lib-index/mail-index.h index 5d61b5e5bc..6c5a9b5794 100644 --- a/src/lib-index/mail-index.h +++ b/src/lib-index/mail-index.h @@ -210,7 +210,8 @@ mail_index_transaction_open_updated_view(struct mail_index_transaction *t); int mail_index_sync_begin(struct mail_index *index, struct mail_index_sync_ctx **ctx_r, struct mail_index_view **view_r, - uint32_t log_file_seq, uoff_t log_file_offset); + uint32_t log_file_seq, uoff_t log_file_offset, + int sync_recent); /* Returns -1 if error, 0 if sync is finished, 1 if record was filled. */ int mail_index_sync_next(struct mail_index_sync_ctx *ctx, struct mail_index_sync_rec *sync_rec); diff --git a/src/lib-storage/index/maildir/maildir-sync.c b/src/lib-storage/index/maildir/maildir-sync.c index 845776bc01..e7123f1a64 100644 --- a/src/lib-storage/index/maildir/maildir-sync.c +++ b/src/lib-storage/index/maildir/maildir-sync.c @@ -337,7 +337,7 @@ int maildir_sync_last_commit(struct index_mailbox *ibox) ibox->syncing_commit = TRUE; ret = mail_index_sync_begin(ibox->index, &ctx.sync_ctx, &ctx.view, ibox->commit_log_file_seq, - ibox->commit_log_file_offset); + ibox->commit_log_file_offset, FALSE); if (ret > 0) { ctx.trans = mail_index_transaction_begin(ctx.view, FALSE); @@ -594,7 +594,7 @@ static int maildir_sync_index(struct maildir_sync_context *ctx) sync_ctx.ibox = ibox; if (mail_index_sync_begin(ibox->index, &sync_ctx.sync_ctx, &view, - (uint32_t)-1, (uoff_t)-1) <= 0) { + (uint32_t)-1, (uoff_t)-1, FALSE) <= 0) { mail_storage_set_index_error(ibox); return -1; } diff --git a/src/lib-storage/index/mbox/mbox-sync-update.c b/src/lib-storage/index/mbox/mbox-sync-update.c index 782859153f..96852bb36b 100644 --- a/src/lib-storage/index/mbox/mbox-sync-update.c +++ b/src/lib-storage/index/mbox/mbox-sync-update.c @@ -143,8 +143,6 @@ static void mbox_sync_add_missing_headers(struct mbox_sync_mail_context *ctx) if (ctx->hdr_pos[MBOX_HDR_STATUS] == (size_t)-1 && (ctx->mail.flags & STATUS_FLAGS_MASK) != 0) { - if (!ctx->sync_ctx->ibox->keep_recent) - ctx->mail.flags |= MBOX_NONRECENT; str_append(ctx->header, "Status: "); ctx->hdr_pos[MBOX_HDR_STATUS] = str_len(ctx->header); status_flags_append(ctx, mbox_status_flags); @@ -292,6 +290,11 @@ void mbox_sync_update_header(struct mbox_sync_mail_context *ctx, ctx->mail.keywords); } + /* keep our old recent flag. especially because we use it + negatively as non-recent */ + ctx->mail.flags = (ctx->mail.flags & ~MAIL_RECENT) | + (old_flags & MAIL_RECENT); + if ((old_flags & STATUS_FLAGS_MASK) != (ctx->mail.flags & STATUS_FLAGS_MASK)) mbox_sync_update_status(ctx); diff --git a/src/lib-storage/index/mbox/mbox-sync.c b/src/lib-storage/index/mbox/mbox-sync.c index cd76b677dc..50f9f75b8b 100644 --- a/src/lib-storage/index/mbox/mbox-sync.c +++ b/src/lib-storage/index/mbox/mbox-sync.c @@ -215,6 +215,7 @@ mbox_sync_read_next_mail(struct mbox_sync_context *sync_ctx, if (!sync_ctx->ibox->keep_recent) { /* need to add 'O' flag to Status-header */ mail_ctx->need_rewrite = TRUE; + mail_ctx->mail.flags |= MBOX_NONRECENT; } index_mailbox_set_recent(sync_ctx->ibox, mail_ctx->seq - mail_ctx->pseudo); @@ -471,17 +472,21 @@ static int mbox_sync_update_index(struct mbox_sync_context *sync_ctx, &idx_flags, idx_keywords); mbox_flags = (rec->flags & ~MAIL_FLAGS_MASK) | - (mail->flags & (MAIL_FLAGS_MASK^MAIL_RECENT)); + (mail->flags & MAIL_FLAGS_MASK); + mbox_flags ^= MAIL_RECENT; - if (!sync_ctx->ibox->keep_recent) - mbox_flags &= ~MAIL_RECENT; - - if (idx_flags != mbox_flags || + if ((idx_flags & ~MAIL_RECENT) != (mbox_flags & ~MAIL_RECENT) || memcmp(idx_keywords, mail->keywords, INDEX_KEYWORDS_BYTE_COUNT) != 0) { mail_index_update_flags(sync_ctx->t, sync_ctx->idx_seq, MODIFY_REPLACE, mbox_flags, mail->keywords); + } else if (((idx_flags ^ mbox_flags) & MAIL_RECENT) != 0) { + /* drop recent flag */ + memset(idx_keywords, 0, INDEX_KEYWORDS_BYTE_COUNT); + mail_index_update_flags(sync_ctx->t, sync_ctx->idx_seq, + MODIFY_REMOVE, MAIL_RECENT, + idx_keywords); } } @@ -1173,7 +1178,7 @@ int mbox_sync(struct index_mailbox *ibox, int last_commit, uint32_t seq; uoff_t offset; unsigned int lock_id = 0; - int ret, lock_type; + int ret, changed, lock_type; if (lock) { if (mbox_lock(ibox, F_RDLCK, &lock_id) <= 0) @@ -1181,18 +1186,15 @@ int mbox_sync(struct index_mailbox *ibox, int last_commit, } if (sync_header) - ret = 0; + changed = 0; else { - if ((ret = mbox_sync_has_changed(ibox)) < 0) { + if ((changed = mbox_sync_has_changed(ibox)) < 0) { if (lock) (void)mbox_unlock(ibox, lock_id); return -1; } } - if (ret == 0 && !last_commit) - return 0; - if (last_commit) { seq = ibox->commit_log_file_seq; offset = ibox->commit_log_file_offset; @@ -1202,13 +1204,21 @@ int mbox_sync(struct index_mailbox *ibox, int last_commit, } ret = mail_index_sync_begin(ibox->index, &index_sync_ctx, &sync_view, - seq, offset); + seq, offset, !ibox->keep_recent); if (ret <= 0) { if (ret < 0) mail_storage_set_index_error(ibox); return ret; } + if (!changed && !mail_index_sync_have_more(index_sync_ctx)) { + if (mail_index_sync_end(index_sync_ctx) < 0) { + mail_storage_set_index_error(ibox); + return -1; + } + return 0; + } + memset(&sync_ctx, 0, sizeof(sync_ctx)); sync_ctx.ibox = ibox; sync_ctx.from_line = str_new(default_pool, 256); @@ -1263,7 +1273,7 @@ int mbox_sync(struct index_mailbox *ibox, int last_commit, ret = mail_index_sync_begin(ibox->index, &sync_ctx.index_sync_ctx, &sync_ctx.sync_view, - (uint32_t)-1, (uoff_t)-1); + (uint32_t)-1, (uoff_t)-1, FALSE); if (ret < 0) mail_storage_set_index_error(ibox); else { -- 2.47.3