# HG changeset patch # User Timo Sirainen # Date 1090867926 -10800 # Node ID 9c830d1a4ebfd4c73f9da605a09643979791b082 # Parent 0169e0cad079cb14c3e75817bde6d06cb903e96d Fixed recent flags with mbox. diff -r 0169e0cad079 -r 9c830d1a4ebf src/lib-index/mail-index-sync.c --- a/src/lib-index/mail-index-sync.c Mon Jul 26 20:59:38 2004 +0300 +++ b/src/lib-index/mail-index-sync.c Mon Jul 26 21:52:06 2004 +0300 @@ -174,7 +174,31 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 -r 0169e0cad079 -r 9c830d1a4ebf src/lib-index/mail-index-view-sync.c --- a/src/lib-index/mail-index-view-sync.c Mon Jul 26 20:59:38 2004 +0300 +++ b/src/lib-index/mail-index-view-sync.c Mon Jul 26 21:52:06 2004 +0300 @@ -218,7 +218,8 @@ } #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 -r 0169e0cad079 -r 9c830d1a4ebf src/lib-index/mail-index.h --- a/src/lib-index/mail-index.h Mon Jul 26 20:59:38 2004 +0300 +++ b/src/lib-index/mail-index.h Mon Jul 26 21:52:06 2004 +0300 @@ -210,7 +210,8 @@ 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 -r 0169e0cad079 -r 9c830d1a4ebf src/lib-storage/index/maildir/maildir-sync.c --- a/src/lib-storage/index/maildir/maildir-sync.c Mon Jul 26 20:59:38 2004 +0300 +++ b/src/lib-storage/index/maildir/maildir-sync.c Mon Jul 26 21:52:06 2004 +0300 @@ -337,7 +337,7 @@ 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 @@ 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 -r 0169e0cad079 -r 9c830d1a4ebf src/lib-storage/index/mbox/mbox-sync-update.c --- a/src/lib-storage/index/mbox/mbox-sync-update.c Mon Jul 26 20:59:38 2004 +0300 +++ b/src/lib-storage/index/mbox/mbox-sync-update.c Mon Jul 26 21:52:06 2004 +0300 @@ -143,8 +143,6 @@ 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 @@ 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 -r 0169e0cad079 -r 9c830d1a4ebf src/lib-storage/index/mbox/mbox-sync.c --- a/src/lib-storage/index/mbox/mbox-sync.c Mon Jul 26 20:59:38 2004 +0300 +++ b/src/lib-storage/index/mbox/mbox-sync.c Mon Jul 26 21:52:06 2004 +0300 @@ -215,6 +215,7 @@ 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 @@ &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 @@ 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 @@ } 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 @@ } 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 @@ 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 {