pool_t pool;
char ns_sep = mail_namespace_get_sep(list->ns);
+ if (!iter_use_index(list, flags)) {
+ /* no indexing */
+ return ilist->module_ctx.super.iter_init(list, patterns, flags);
+ }
+
pool = pool_alloconly_create("mailbox list index iter", 2048);
ctx = p_new(pool, struct mailbox_list_index_iterate_context, 1);
ctx->ctx.pool = pool;
ctx->ctx.glob = imap_match_init_multiple(pool, patterns, TRUE, ns_sep);
array_create(&ctx->ctx.module_contexts, pool, sizeof(void *), 5);
ctx->info_pool = pool_alloconly_create("mailbox list index iter info", 128);
+ ctx->ctx.index_iteration = TRUE;
- if (!iter_use_index(list, flags)) {
- /* no indexing */
- ctx->backend_ctx = ilist->module_ctx.super.
- iter_init(list, patterns, flags);
- mailbox_list_iter_init_autocreate(ctx->backend_ctx);
- } else {
- /* listing mailboxes from index */
- ctx->info.ns = list->ns;
- ctx->path = str_new(pool, 128);
- ctx->next_node = ilist->mailbox_tree;
- ctx->mailbox_pool = ilist->mailbox_pool;
- pool_ref(ctx->mailbox_pool);
- }
+ /* listing mailboxes from index */
+ ctx->info.ns = list->ns;
+ ctx->path = str_new(pool, 128);
+ ctx->next_node = ilist->mailbox_tree;
+ ctx->mailbox_pool = ilist->mailbox_pool;
+ pool_ref(ctx->mailbox_pool);
return &ctx->ctx;
}
const struct mailbox_info *
mailbox_list_index_iter_next(struct mailbox_list_iterate_context *_ctx)
{
+ struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(_ctx->list);
+ if (!_ctx->index_iteration) {
+ /* index isn't being used */
+ return ilist->module_ctx.super.iter_next(_ctx);
+ }
+
struct mailbox_list_index_iterate_context *ctx =
(struct mailbox_list_index_iterate_context *)_ctx;
- struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(_ctx->list);
bool follow_children;
enum imap_match_result match;
- if (ctx->backend_ctx != NULL) {
- /* index isn't being used */
- return mailbox_list_iter_autocreate_filter(ctx->backend_ctx,
- ilist->module_ctx.super.iter_next(ctx->backend_ctx));
- }
-
/* listing mailboxes from index */
while (ctx->next_node != NULL) {
mailbox_list_index_update_info(ctx);
int mailbox_list_index_iter_deinit(struct mailbox_list_iterate_context *_ctx)
{
+ struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(_ctx->list);
+ if (!_ctx->index_iteration)
+ return ilist->module_ctx.super.iter_deinit(_ctx);
+
struct mailbox_list_index_iterate_context *ctx =
(struct mailbox_list_index_iterate_context *)_ctx;
- struct mailbox_list_index *ilist = INDEX_LIST_CONTEXT(_ctx->list);
int ret = ctx->failed ? -1 : 0;
- if (ctx->backend_ctx != NULL)
- ret = ilist->module_ctx.super.iter_deinit(ctx->backend_ctx);
- else
- pool_unref(&ctx->mailbox_pool);
-
+ pool_unref(&ctx->mailbox_pool);
pool_unref(&ctx->info_pool);
pool_unref(&_ctx->pool);
return ret;