]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
mailbox list indexes: Get mailbox_get_metadata(guid) from index if possible.
authorTimo Sirainen <tss@iki.fi>
Sun, 2 Oct 2011 17:09:04 +0000 (20:09 +0300)
committerTimo Sirainen <tss@iki.fi>
Sun, 2 Oct 2011 17:09:04 +0000 (20:09 +0300)
src/lib-storage/list/mailbox-list-index-status.c

index c78127ac08bcc506ba489de74f83457bac29c326..2f738017437206c02907dca956e72efdb37af587 100644 (file)
@@ -150,6 +150,41 @@ index_list_get_status(struct mailbox *box, enum mailbox_status_items items,
        return ibox->module_ctx.super.get_status(box, items, status_r);
 }
 
+static int
+index_list_get_cached_guid(struct mailbox *box, guid_128_t guid_r)
+{
+       struct mailbox_status status;
+       struct mail_index_view *view;
+       uint32_t seq;
+       int ret;
+
+       ret = index_list_open_view(box, &view, &seq);
+       if (ret <= 0)
+               return ret;
+
+       ret = index_list_get_view_status(box, view, seq, 0,
+                                        &status, guid_r) ? 1 : 0;
+       if (ret > 0 && guid_128_is_empty(guid_r))
+               ret = 0;
+       mail_index_view_close(&view);
+       return ret;
+}
+
+static int
+index_list_get_metadata(struct mailbox *box,
+                       enum mailbox_metadata_items items,
+                       struct mailbox_metadata *metadata_r)
+{
+       struct index_list_mailbox *ibox = INDEX_LIST_STORAGE_CONTEXT(box);
+
+       if (items == MAILBOX_METADATA_GUID && !box->opened) {
+               if (index_list_get_cached_guid(box, metadata_r->guid) > 0)
+                       return 0;
+               /* nonsynced / error, fallback to doing it the slow way */
+       }
+       return ibox->module_ctx.super.get_metadata(box, items, metadata_r);
+}
+
 static int
 index_list_update(struct mailbox *box, struct mail_index_view *view,
                  uint32_t seq, const struct mailbox_status *status)
@@ -162,6 +197,8 @@ index_list_update(struct mailbox *box, struct mail_index_view *view,
        guid_128_t mailbox_guid;
        bool rec_changed, msgs_changed, hmodseq_changed;
 
+       i_assert(box->opened);
+
        if (mailbox_get_metadata(box, MAILBOX_METADATA_GUID, &metadata) < 0)
                memset(&metadata, 0, sizeof(metadata));
 
@@ -367,6 +404,7 @@ static void index_list_mail_mailbox_allocated(struct mailbox *box)
        ibox = p_new(box->pool, struct index_list_mailbox, 1);
        ibox->module_ctx.super = box->v;
        box->v.get_status = index_list_get_status;
+       box->v.get_metadata = index_list_get_metadata;
        box->v.sync_deinit = index_list_sync_deinit;
        box->v.transaction_commit = index_list_transaction_commit;