# HG changeset patch # User Timo Sirainen # Date 1487352543 -7200 # Node ID bcd286fcdbadfdf103bdb37948623886849ef609 # Parent fb8ef6e2c2fe1a82cb4c4f937887b6d758138542 lib-storage: Add mail.access_type diff -r fb8ef6e2c2fe -r bcd286fcdbad src/lib-storage/index/index-search.c --- a/src/lib-storage/index/index-search.c Fri Feb 17 19:07:53 2017 +0200 +++ b/src/lib-storage/index/index-search.c Fri Feb 17 19:29:03 2017 +0200 @@ -1591,9 +1591,14 @@ 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 -r fb8ef6e2c2fe -r bcd286fcdbad src/lib-storage/index/index-sort.c --- a/src/lib-storage/index/index-sort.c Fri Feb 17 19:07:53 2017 +0200 +++ b/src/lib-storage/index/index-sort.c Fri Feb 17 19:29:03 2017 +0200 @@ -170,6 +170,7 @@ 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 @@ 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 @@ 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 -r fb8ef6e2c2fe -r bcd286fcdbad src/lib-storage/mail-storage.h --- a/src/lib-storage/mail-storage.h Fri Feb 17 19:07:53 2017 +0200 +++ b/src/lib-storage/mail-storage.h Fri Feb 17 19:29:03 2017 +0200 @@ -373,6 +373,14 @@ 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; @@ -394,6 +402,8 @@ 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; };