struct mail_search_result *
mailbox_search_result_alloc(struct mailbox *box, struct mail_search_args *args,
			    enum mailbox_search_result_flags flags)
{
	struct mail_search_result *result;

	result = i_new(struct mail_search_result, 1);
	result->box = box;
	result->flags = flags;
	i_array_init(&result->uids, 32);
	i_array_init(&result->never_uids, 128);

	if ((result->flags & MAILBOX_SEARCH_RESULT_FLAG_UPDATE) != 0) {
		result->search_args = args;
		mail_search_args_ref(result->search_args);
		mailbox_search_result_analyze_args(result, args->args);
	}

	array_append(&result->box->search_results, &result, 1);
	return result;
}
예제 #2
0
static int
virtual_config_add_rule(struct virtual_parse_context *ctx, const char **error_r)
{
    struct virtual_backend_box *const *bboxes;
    struct mail_search_args *search_args;
    unsigned int i, count;

    *error_r = NULL;

    if (ctx->rule_idx == array_count(&ctx->mbox->backend_boxes)) {
        i_assert(str_len(ctx->rule) == 0);
        return 0;
    }

    ctx->mbox->search_args_crc32 =
        crc32_str_more(ctx->mbox->search_args_crc32, str_c(ctx->rule));
    search_args = virtual_search_args_parse(ctx->rule, error_r);
    str_truncate(ctx->rule, 0);
    if (search_args == NULL) {
        i_assert(*error_r != NULL);
        *error_r = t_strconcat("Previous search rule is invalid: ",
                               *error_r, NULL);
        return -1;
    }

    /* update at all the mailboxes that were introduced since the previous
       rule. */
    bboxes = array_get(&ctx->mbox->backend_boxes, &count);
    i_assert(ctx->rule_idx < count);
    for (i = ctx->rule_idx; i < count; i++) {
        i_assert(bboxes[i]->search_args == NULL);
        mail_search_args_ref(search_args);
        bboxes[i]->search_args = search_args;
    }
    mail_search_args_unref(&search_args);

    ctx->rule_idx = array_count(&ctx->mbox->backend_boxes);
    return 0;
}