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);
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;
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);
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;
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;
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;
};