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