struct mail_search_arg *arg)
{
ARRAY_TYPE(keyword_indexes) keyword_indexes_arr;
- const struct mail_keywords *search_kws = arg->value.keywords;
+ const struct mail_keywords *search_kws = arg->initialized.keywords;
const unsigned int *keyword_indexes;
unsigned int i, j, count;
if (arg->value.flags != 0) {
modseq = mail_index_modseq_lookup_flags(ctx->view,
arg->value.flags, ctx->mail_ctx.seq);
- } else if (arg->value.keywords != NULL) {
+ } else if (arg->initialized.keywords != NULL) {
modseq = mail_index_modseq_lookup_keywords(ctx->view,
- arg->value.keywords, ctx->mail_ctx.seq);
+ arg->initialized.keywords, ctx->mail_ctx.seq);
} else {
modseq = mail_index_modseq_lookup(ctx->view,
ctx->mail_ctx.seq);
return strcasecmp(arg->value.str, "INBOX") == 0;
return strcmp(str, arg->value.str) == 0;
case SEARCH_MAILBOX_GLOB:
- if (imap_match(arg->value.mailbox_glob, box->vname) == IMAP_MATCH_YES)
+ if (imap_match(arg->initialized.mailbox_glob, box->vname) == IMAP_MATCH_YES)
return 1;
if (mail_get_special(ctx->cur_mail, MAIL_FETCH_MAILBOX_NAME,
&str) < 0)
return -1;
- return imap_match(arg->value.mailbox_glob, str) == IMAP_MATCH_YES;
+ return imap_match(arg->initialized.mailbox_glob, str) == IMAP_MATCH_YES;
default:
return -1;
}
int ret = 0;
/* mail_search_args_init() must have been called by now */
- i_assert(arg->value.search_args != NULL);
+ i_assert(arg->initialized.search_args != NULL);
p_array_init(&arg->value.seqset, ctx->mail_ctx.args->pool, 64);
if (mailbox_search_result_build(ctx->mail_ctx.transaction,
- arg->value.search_args,
+ arg->initialized.search_args,
MAILBOX_SEARCH_RESULT_FLAG_UPDATE |
MAILBOX_SEARCH_RESULT_FLAG_QUEUE_SYNC,
&arg->value.search_result) < 0)
str_append_c(dest, ')');
break;
case SEARCH_KEYWORDS: {
- const struct mail_keywords *kw = arg->value.keywords;
+ const struct mail_keywords *kw = arg->initialized.keywords;
const ARRAY_TYPE(keywords) *names_arr;
const char *const *namep;
unsigned int i;
keywords[0] = arg->value.str;
keywords[1] = NULL;
- i_assert(arg->value.keywords == NULL);
- arg->value.keywords =
+ i_assert(arg->initialized.keywords == NULL);
+ arg->initialized.keywords =
mailbox_keywords_create_valid(args->box,
keywords);
break;
struct mail_namespace *ns =
mailbox_get_namespace(args->box);
- arg->value.mailbox_glob =
+ arg->initialized.mailbox_glob =
imap_match_init(default_pool, arg->value.str,
TRUE, mail_namespace_get_sep(ns));
break;
}
case SEARCH_INTHREAD:
- thread_args = arg->value.search_args;
+ thread_args = arg->initialized.search_args;
if (thread_args == NULL) {
- arg->value.search_args = thread_args =
+ arg->initialized.search_args = thread_args =
p_new(args->pool,
struct mail_search_args, 1);
thread_args->pool = args->pool;
switch (arg->type) {
case SEARCH_MODSEQ:
case SEARCH_KEYWORDS:
- if (arg->value.keywords == NULL)
+ if (arg->initialized.keywords == NULL)
break;
- mailbox_keywords_unref(&arg->value.keywords);
+ mailbox_keywords_unref(&arg->initialized.keywords);
break;
case SEARCH_MAILBOX_GLOB:
- if (arg->value.mailbox_glob == NULL)
+ if (arg->initialized.mailbox_glob == NULL)
break;
- imap_match_deinit(&arg->value.mailbox_glob);
+ imap_match_deinit(&arg->initialized.mailbox_glob);
break;
case SEARCH_INTHREAD:
- i_assert(arg->value.search_args->refcount > 0);
+ i_assert(arg->initialized.search_args->refcount > 0);
if (args->refcount == 0 &&
arg->value.search_result != NULL) {
mailbox_search_result_free(
&arg->value.search_result);
}
- arg->value.search_args->refcount--;
- arg->value.search_args->box = NULL;
+ arg->initialized.search_args->refcount--;
+ arg->initialized.search_args->box = NULL;
/* fall through */
case SEARCH_SUB:
case SEARCH_OR:
m1->type == m2->type;
}
case SEARCH_INTHREAD:
- return mail_search_args_equal(arg1->value.search_args,
- arg2->value.search_args);
+ return mail_search_args_equal(arg1->initialized.search_args,
+ arg2->initialized.search_args);
}
i_unreached();
return FALSE;
enum mail_search_arg_flag search_flags;
enum mail_search_date_type date_type;
enum mail_thread_type thread_type;
- struct mail_keywords *keywords;
struct mail_search_modseq *modseq;
- struct mail_search_args *search_args;
struct mail_search_result *search_result;
- struct imap_match_glob *mailbox_glob;
} value;
+ /* set by mail_search_args_init(): */
+ struct {
+ struct mail_search_args *search_args;
+ struct mail_keywords *keywords;
+ struct imap_match_glob *mailbox_glob;
+ } initialized;
void *context;
const char *hdr_field_name; /* for SEARCH_HEADER* */