Mercurial > dovecot > core-2.2
changeset 18329:3effe57f223d
imapc: If imapc_features has gmail-migration, fetch X-GM-MSGID at startup and cache it.
This works only if index files haven't been disabled.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 11 Mar 2015 18:30:19 +0200 |
parents | f32ddc04fce7 |
children | bac6a6a444d3 |
files | src/lib-storage/index/imapc/imapc-mailbox.c src/lib-storage/index/imapc/imapc-storage.h src/lib-storage/index/imapc/imapc-sync.c |
diffstat | 3 files changed, 47 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/index/imapc/imapc-mailbox.c Wed Mar 11 17:54:27 2015 +0200 +++ b/src/lib-storage/index/imapc/imapc-mailbox.c Wed Mar 11 18:30:19 2015 +0200 @@ -48,11 +48,20 @@ if (mbox->delayed_sync_trans != NULL) return; + i_assert(mbox->delayed_sync_cache_view == NULL); + i_assert(mbox->delayed_sync_cache_trans == NULL); + mbox->delayed_sync_trans = mail_index_transaction_begin(imapc_mailbox_get_sync_view(mbox), MAIL_INDEX_TRANSACTION_FLAG_EXTERNAL); mbox->delayed_sync_view = mail_index_transaction_open_updated_view(mbox->delayed_sync_trans); + + mbox->delayed_sync_cache_view = + mail_cache_view_open(mbox->box.cache, mbox->delayed_sync_view); + mbox->delayed_sync_cache_trans = + mail_cache_get_transaction(mbox->delayed_sync_cache_view, + mbox->delayed_sync_trans); } static int imapc_mailbox_commit_delayed_expunges(struct imapc_mailbox *mbox) @@ -92,6 +101,9 @@ } *changes_r = TRUE; } + mbox->delayed_sync_cache_trans = NULL; + if (mbox->delayed_sync_cache_view != NULL) + mail_cache_view_close(&mbox->delayed_sync_cache_view); if (mbox->sync_view != NULL) mail_index_view_close(&mbox->sync_view); @@ -259,7 +271,7 @@ struct imapc_fetch_request *const *fetch_requestp; struct imapc_mail *const *mailp; const struct imap_arg *list, *flags_list; - const char *atom; + const char *atom, *guid = NULL; const struct mail_index_record *rec = NULL; enum mail_flags flags; uint32_t fetch_uid, uid; @@ -295,6 +307,10 @@ array_append(&keywords, &atom, 1); } } + } else if (strcasecmp(atom, "X-GM-MSGID") == 0 && + !mbox->initial_sync_done) { + if (imap_arg_get_atom(&list[i+1], &atom)) + guid = atom; } else if (strcasecmp(atom, "X-GM-LABELS") == 0 && IMAPC_BOX_HAS_FEATURE(mbox, IMAPC_FEATURE_GMAIL_MIGRATION)) { if (!imap_arg_get_list(&list[i+1], &flags_list)) @@ -382,6 +398,17 @@ } mail_index_keywords_unref(&kw); } + if (guid != NULL) { + struct index_mailbox_context *ibox = INDEX_STORAGE_CONTEXT(&mbox->box); + const enum index_cache_field guid_cache_idx = + ibox->cache_fields[MAIL_CACHE_GUID].idx; + + if (mail_cache_field_can_add(mbox->delayed_sync_cache_trans, + lseq, guid_cache_idx)) { + mail_cache_add(mbox->delayed_sync_cache_trans, lseq, + guid_cache_idx, guid, strlen(guid)+1); + } + } imapc_mailbox_idle_notify(mbox); }
--- a/src/lib-storage/index/imapc/imapc-storage.h Wed Mar 11 17:54:27 2015 +0200 +++ b/src/lib-storage/index/imapc/imapc-storage.h Wed Mar 11 18:30:19 2015 +0200 @@ -87,6 +87,8 @@ struct mail_index_transaction *delayed_sync_trans; struct mail_index_view *sync_view, *delayed_sync_view; + struct mail_cache_view *delayed_sync_cache_view; + struct mail_cache_transaction_ctx *delayed_sync_cache_trans; struct timeout *to_idle_check, *to_idle_delay; ARRAY(struct imapc_fetch_request *) fetch_requests;
--- a/src/lib-storage/index/imapc/imapc-sync.c Wed Mar 11 17:54:27 2015 +0200 +++ b/src/lib-storage/index/imapc/imapc-sync.c Wed Mar 11 18:30:19 2015 +0200 @@ -4,6 +4,7 @@ #include "ioloop.h" #include "str.h" #include "imap-util.h" +#include "mail-cache.h" #include "index-sync-private.h" #include "imapc-client.h" #include "imapc-msgmap.h" @@ -282,13 +283,20 @@ str_printfa(cmd, "UID FETCH %u:* (FLAGS", first_uid); if (IMAPC_BOX_HAS_FEATURE(ctx->mbox, IMAPC_FEATURE_GMAIL_MIGRATION)) { - /* do this only for the \All mailbox */ enum mailbox_info_flags flags; + if (first_uid == 1 && + !mail_index_is_in_memory(ctx->mbox->box.index)) { + /* these can be efficiently fetched among flags and + stored into cache */ + str_append(cmd, " X-GM-MSGID"); + } + /* do this only for the \All mailbox */ if (imapc_list_get_mailbox_flags(ctx->mbox->box.list, ctx->mbox->box.name, &flags) == 0 && (flags & MAILBOX_SPECIALUSE_ALL) != 0) str_append(cmd, " X-GM-LABELS"); + } str_append_c(cmd, ')'); imapc_sync_cmd(ctx, str_c(cmd)); @@ -419,6 +427,11 @@ mbox->delayed_sync_view = mail_index_transaction_open_updated_view(ctx->trans); mbox->delayed_sync_trans = ctx->trans; + mbox->delayed_sync_cache_view = + mail_cache_view_open(mbox->box.cache, mbox->delayed_sync_view); + mbox->delayed_sync_cache_trans = + mail_cache_get_transaction(mbox->delayed_sync_cache_view, + mbox->delayed_sync_trans); mbox->min_append_uid = mail_index_get_header(ctx->sync_view)->next_uid; mbox->syncing = TRUE; @@ -455,6 +468,9 @@ i_free_and_null(ctx->mbox->sync_gmail_pop3_search_tag); ret = -1; } + mail_cache_view_close(&ctx->mbox->delayed_sync_cache_view); + ctx->mbox->delayed_sync_cache_trans = NULL; + ctx->mbox->syncing = FALSE; ctx->mbox->sync_ctx = NULL;