]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Use RECENT count in mailbox list index to set \Marked and \UnMarked...
authorTimo Sirainen <tss@iki.fi>
Wed, 9 Feb 2011 00:26:44 +0000 (02:26 +0200)
committerTimo Sirainen <tss@iki.fi>
Wed, 9 Feb 2011 00:26:44 +0000 (02:26 +0200)
src/lib-storage/list/index-mailbox-list-status.c
src/lib-storage/list/index-mailbox-list.c
src/lib-storage/list/index-mailbox-list.h

index 84b5cb773ec5920b6f70327d0d674032c1e6adac..fef357ee029d0dcf798a586411fe928930829735 100644 (file)
@@ -316,6 +316,41 @@ index_list_transaction_commit(struct mailbox_transaction_context *t,
        return 0;
 }
 
+void index_mailbox_list_status_set_info_flags(struct mailbox *box, uint32_t uid,
+                                             enum mailbox_info_flags *flags)
+{
+       struct index_mailbox_list *ilist = INDEX_LIST_CONTEXT(box->list);
+       struct mail_index_view *view;
+       struct mailbox_status status;
+       uint32_t seq;
+       int ret;
+
+       view = mail_index_view_open(ilist->index);
+       if (!mail_index_lookup_seq(view, uid, &seq)) {
+               /* our in-memory tree is out of sync */
+               ret = 0;
+       } else T_BEGIN {
+               ret = box->v.list_index_has_changed == NULL ? 0 :
+                       box->v.list_index_has_changed(box, view, seq);
+       } T_END;
+
+       if (ret != 0) {
+               /* error / not up to date. don't waste time with it. */
+               mail_index_view_close(&view);
+               return;
+       }
+
+       status.recent = 0;
+       (void)index_list_get_view_status(box, view, seq, STATUS_RECENT,
+                                        &status, NULL);
+       mail_index_view_close(&view);
+
+       if (status.recent != 0)
+               *flags |= MAILBOX_MARKED;
+       else
+               *flags |= MAILBOX_UNMARKED;
+}
+
 static void index_list_mail_mailbox_allocated(struct mailbox *box)
 {
        struct index_mailbox_list *ilist = INDEX_LIST_CONTEXT(box->list);
index eb9b5d381d80a6226974d7fb4c1d90bd7881341a..a4f88890fa7c9e870ba3b53fa0873280f554f328 100644 (file)
@@ -6,6 +6,7 @@
 #include "hash.h"
 #include "imap-match.h"
 #include "mail-index.h"
+#include "mail-storage.h"
 #include "mail-storage-hooks.h"
 #include "mailbox-list-subscriptions.h"
 #include "index-mailbox-list.h"
@@ -110,6 +111,8 @@ index_mailbox_list_lookup(struct mailbox_list *list, const char *vname)
        struct index_mailbox_list *ilist = INDEX_LIST_CONTEXT(list);
        struct index_mailbox_node *node;
 
+       (void)index_mailbox_list_refresh(list);
+
        T_BEGIN {
                const char *const *path;
                unsigned int i;
@@ -575,6 +578,7 @@ static void
 index_mailbox_list_update_info(struct index_mailbox_list_iterate_context *ctx)
 {
        struct index_mailbox_node *node = ctx->next_node;
+       struct mailbox *box;
 
        str_truncate(ctx->path, ctx->parent_len);
        if (str_len(ctx->path) > 0)
@@ -599,7 +603,11 @@ index_mailbox_list_update_info(struct index_mailbox_list_iterate_context *ctx)
                                                    &ctx->info.flags);
        }
 
-       /* FIXME: set marked, unmarked flags based on recent counter */
+       box = mailbox_alloc(ctx->ctx.list, ctx->info.name,
+                           MAILBOX_FLAG_KEEP_RECENT);
+       index_mailbox_list_status_set_info_flags(box, node->uid,
+                                                &ctx->info.flags);
+       mailbox_free(&box);
 }
 
 static void
index 69437c562cad8d506e2f038d7ab226e401a5ec57..a8456e2c2f43f09c9cc6e5287ff5bfbc0bfe513f 100644 (file)
@@ -102,6 +102,9 @@ index_mailbox_list_lookup(struct mailbox_list *list, const char *vname);
 int index_mailbox_list_refresh(struct mailbox_list *list);
 void index_mailbox_list_refresh_later(struct mailbox_list *list);
 
+void index_mailbox_list_status_set_info_flags(struct mailbox *box, uint32_t uid,
+                                             enum mailbox_info_flags *flags);
+
 void index_mailbox_list_status_init(void);
 void index_mailbox_list_status_init_list(struct mailbox_list *list);