static void
wanted_sort_fields_get(struct mailbox *box,
const enum mail_sort_type *sort_program,
+ struct mailbox_header_lookup_ctx *wanted_headers,
enum mail_fetch_field *wanted_fields_r,
struct mailbox_header_lookup_ctx **headers_ctx_r)
{
- const char *headers[2];
+ ARRAY_TYPE(const_string) headers;
+ const char *header;
+ unsigned int i;
*wanted_fields_r = 0;
*headers_ctx_r = NULL;
- headers[0] = headers[1] = NULL;
+ t_array_init(&headers, 8);
+ header = NULL;
switch (sort_program[0] & MAIL_SORT_MASK) {
case MAIL_SORT_ARRIVAL:
- *wanted_fields_r = MAIL_FETCH_RECEIVED_DATE;
+ *wanted_fields_r |= MAIL_FETCH_RECEIVED_DATE;
break;
case MAIL_SORT_CC:
- headers[0] = "Cc";
+ header = "Cc";
break;
case MAIL_SORT_DATE:
- *wanted_fields_r = MAIL_FETCH_DATE;
+ *wanted_fields_r |= MAIL_FETCH_DATE;
break;
case MAIL_SORT_FROM:
- headers[0] = "From";
+ header = "From";
break;
case MAIL_SORT_SIZE:
- *wanted_fields_r = MAIL_FETCH_VIRTUAL_SIZE;
+ *wanted_fields_r |= MAIL_FETCH_VIRTUAL_SIZE;
break;
case MAIL_SORT_SUBJECT:
- headers[0] = "Subject";
+ header = "Subject";
break;
case MAIL_SORT_TO:
- headers[0] = "To";
+ header = "To";
break;
}
+ if (header != NULL)
+ array_append(&headers, &header, 1);
+
+ if (wanted_headers != NULL) {
+ for (i = 0; wanted_headers->name[i] != NULL; i++)
+ array_append(&headers, &wanted_headers->name[i], 1);
+ }
- if (headers[0] != NULL)
- *headers_ctx_r = mailbox_header_lookup_init(box, headers);
+ if (array_count(&headers) > 0) {
+ (void)array_append_space(&headers);
+ *headers_ctx_r = mailbox_header_lookup_init(box,
+ array_idx(&headers, 0));
+ }
}
struct mail_search_context *
ctx->view = t->view;
ctx->mail_ctx.args = args;
ctx->mail_ctx.sort_program = index_sort_program_init(t, sort_program);
- ctx->mail_ctx.wanted_fields = wanted_fields;
- if (wanted_headers != NULL) {
- ctx->mail_ctx.wanted_headers = wanted_headers;
- mailbox_header_lookup_ref(wanted_headers);
- }
ctx->max_mails = t->box->storage->set->mail_prefetch_count + 1;
if (ctx->max_mails == 0)
}
if (sort_program != NULL) {
- wanted_sort_fields_get(ctx->box, sort_program,
- &ctx->extra_wanted_fields,
- &ctx->extra_wanted_headers);
+ wanted_sort_fields_get(ctx->box, sort_program, wanted_headers,
+ &ctx->mail_ctx.wanted_fields,
+ &ctx->mail_ctx.wanted_headers);
+ } else if (wanted_headers != NULL) {
+ ctx->mail_ctx.wanted_headers = wanted_headers;
+ mailbox_header_lookup_ref(wanted_headers);
}
+ ctx->mail_ctx.wanted_fields |= wanted_fields;
search_get_seqset(ctx, status.messages, args->args);
(void)mail_search_args_foreach(args->args, search_init_arg, ctx);
if (ctx->mail_ctx.wanted_headers != NULL)
mailbox_header_lookup_unref(&ctx->mail_ctx.wanted_headers);
- if (ctx->extra_wanted_headers != NULL)
- mailbox_header_lookup_unref(&ctx->extra_wanted_headers);
if (ctx->mail_ctx.sort_program != NULL)
index_sort_program_deinit(&ctx->mail_ctx.sort_program);
if (ctx->thread_ctx != NULL)
imail = (struct index_mail *)mail;
imail->search_mail = TRUE;
imail->mail.stats_track = TRUE;
- imail->mail.extra_wanted_fields = ctx->extra_wanted_fields;
- imail->mail.extra_wanted_headers = ctx->extra_wanted_headers;
array_append(&ctx->mails, &mail, 1);
return mail;
#include "bsearch-insert-pos.h"
#include "hash2.h"
#include "message-id.h"
-#include "mail-index-private.h"
-#include "mail-index-sync-private.h"
#include "mail-search.h"
#include "mail-search-build.h"
#include "mailbox-search-result-private.h"
#include "index-storage.h"
-#include "index-search-private.h"
#include "index-thread-private.h"
#include <stdlib.h>
NULL
};
struct mail_thread_mailbox *tbox = MAIL_THREAD_CONTEXT(ctx->box);
+ struct mailbox_header_lookup_ctx *headers_ctx;
struct mail_search_args *search_args;
struct mail_search_context *search_ctx;
- struct index_search_context *search_ctx_i;
struct mail *mail;
- struct mail_private *pmail;
uint32_t last_uid, seq1, seq2;
int ret = 0;
&tbox->msgid_hash);
}
- ctx->tmp_mail = mail_alloc(ctx->t, 0, NULL);
- pmail = (struct mail_private *)ctx->tmp_mail;
- pmail->extra_wanted_headers =
- mailbox_header_lookup_init(ctx->box, wanted_headers);
+ headers_ctx = mailbox_header_lookup_init(ctx->box, wanted_headers);
+ ctx->tmp_mail = mail_alloc(ctx->t, 0, headers_ctx);
/* add all missing UIDs */
ctx->strmap_sync = mail_index_strmap_view_sync_init(tbox->strmap_view,
search_args = mail_search_build_init();
mail_search_build_add_seqset(search_args, seq1, seq2);
- search_ctx = mailbox_search_init(ctx->t, search_args, NULL, 0, NULL);
-
- search_ctx_i = (struct index_search_context *)search_ctx;
- search_ctx_i->extra_wanted_headers =
- mailbox_header_lookup_init(ctx->box, wanted_headers);
+ search_ctx = mailbox_search_init(ctx->t, search_args, NULL,
+ 0, headers_ctx);
while (mailbox_search_next(search_ctx, &mail)) {
if (mail_thread_map_add_mail(ctx, mail) < 0) {
static void mail_thread_clear(struct mail_thread_context *ctx)
{
- struct mail_private *pmail = (struct mail_private *)ctx->tmp_mail;
-
- mailbox_header_lookup_unref(&pmail->extra_wanted_headers);
mail_free(&ctx->tmp_mail);
(void)mailbox_transaction_commit(&ctx->t);
}