From: Timo Sirainen Date: Fri, 17 Feb 2017 17:29:03 +0000 (+0200) Subject: lib-storage: Add mail.access_type X-Git-Tag: 2.3.0.rc1~2053 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=dfaf420c473c810fee33f515d08b888826dd57bd;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Add mail.access_type --- diff --git a/src/lib-storage/index/index-search.c b/src/lib-storage/index/index-search.c index 5657f0ac03..9729543fd0 100644 --- a/src/lib-storage/index/index-search.c +++ b/src/lib-storage/index/index-search.c @@ -1592,9 +1592,14 @@ static int search_more_with_mail(struct index_search_context *ctx, mail_set_seq(mail, _ctx->seq); ctx->cur_mail = mail; + /* mail's access_type is SEARCH only while using it to process + the search query. afterwards the mail can still be accessed + for fetching. */ + ctx->cur_mail->access_type = MAIL_ACCESS_TYPE_SEARCH; T_BEGIN { match = search_match_next(ctx); } T_END; + ctx->cur_mail->access_type = MAIL_ACCESS_TYPE_DEFAULT; ctx->cur_mail = NULL; i_assert(imail->data.search_results == NULL); diff --git a/src/lib-storage/index/index-sort.c b/src/lib-storage/index/index-sort.c index 452395a618..2f0df42887 100644 --- a/src/lib-storage/index/index-sort.c +++ b/src/lib-storage/index/index-sort.c @@ -170,6 +170,7 @@ void index_sort_list_add(struct mail_search_sort_program *program, struct mail *mail) { enum mail_lookup_abort orig_abort = mail->lookup_abort; + enum mail_access_type orig_access_type = mail->access_type; bool prev_slow = mail->mail_stream_opened || mail->mail_metadata_accessed; @@ -177,9 +178,13 @@ void index_sort_list_add(struct mail_search_sort_program *program, if (program->slow_mails_left == 0) mail->lookup_abort = MAIL_LOOKUP_ABORT_NOT_IN_CACHE; + + mail->access_type = MAIL_ACCESS_TYPE_SORT; T_BEGIN { program->sort_list_add(program, mail); } T_END; + mail->access_type = orig_access_type; + if (!prev_slow && (mail->mail_stream_opened || mail->mail_metadata_accessed)) { i_assert(program->slow_mails_left > 0); @@ -308,6 +313,7 @@ index_sort_program_init(struct mailbox_transaction_context *t, program = i_new(struct mail_search_sort_program, 1); program->t = t; program->temp_mail = mail_alloc(t, 0, NULL); + program->temp_mail->access_type = MAIL_ACCESS_TYPE_SORT; program->slow_mails_left = program->t->box->storage->set->mail_sort_max_read_count; diff --git a/src/lib-storage/mail-storage.h b/src/lib-storage/mail-storage.h index 514df21d20..c16ad45735 100644 --- a/src/lib-storage/mail-storage.h +++ b/src/lib-storage/mail-storage.h @@ -372,6 +372,14 @@ enum mail_lookup_abort { MAIL_LOOKUP_ABORT_NOT_IN_CACHE }; +enum mail_access_type { + MAIL_ACCESS_TYPE_DEFAULT = 0, + /* Mail is being used for searching */ + MAIL_ACCESS_TYPE_SEARCH, + /* Mail is being used for sorting results */ + MAIL_ACCESS_TYPE_SORT, +}; + struct mail { /* always set */ struct mailbox *box; @@ -393,6 +401,8 @@ struct mail { MAIL_LOOKUP_ABORT_NOT_IN_CACHE, this can't become TRUE. */ bool mail_metadata_accessed:1; + enum mail_access_type access_type; + /* If the lookup is aborted, error is set to MAIL_ERROR_NOTPOSSIBLE */ enum mail_lookup_abort lookup_abort; };