]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Fixed recent flags with mbox.
authorTimo Sirainen <tss@iki.fi>
Mon, 26 Jul 2004 18:52:06 +0000 (21:52 +0300)
committerTimo Sirainen <tss@iki.fi>
Mon, 26 Jul 2004 18:52:06 +0000 (21:52 +0300)
--HG--
branch : HEAD

src/lib-index/mail-index-sync.c
src/lib-index/mail-index-view-sync.c
src/lib-index/mail-index.h
src/lib-storage/index/maildir/maildir-sync.c
src/lib-storage/index/mbox/mbox-sync-update.c
src/lib-storage/index/mbox/mbox-sync.c

index 15993128c48892bc259a2c6cadd7db63750038ac..18cc93227754cd754e3edc1faca9b09e4fe971bb 100644 (file)
@@ -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;
        }
index 13b70e17306a47082534ff651eb54f65a1b3a6de..9af55553762a67c5e7a48db266a44d819e72320f 100644 (file)
@@ -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)
 
index 5d61b5e5bc55d0445115e50ce89de80b63e094b1..6c5a9b579466d494dd6b62387218d4f8fa418a33 100644 (file)
@@ -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);
index 845776bc01fdc45834771c4ba0f5a44081b373c2..e7123f1a64a28ef05c6761d5cd0fc7a152c53d7e 100644 (file)
@@ -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;
        }
index 782859153fd8f05ce8463e47067b5c7a956e6aac..96852bb36b78d09ec422ef536806fc9b3e82795f 100644 (file)
@@ -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);
index cd76b677dcd5c9b6b514704a2445ae70a3430841..50f9f75b8b5fee75f4ee73d8cd865f280a730801 100644 (file)
@@ -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 {