#include "dict-private.h"
static ARRAY_DEFINE(dict_drivers, struct dict *);
+static struct dict_iterate_context dict_iter_unsupported;
static struct dict *dict_driver_lookup(const char *name)
{
i_assert(paths[0] != NULL);
for (i = 0; paths[i] != NULL; i++)
i_assert(dict_key_prefix_is_valid(paths[i]));
+ if (dict->v.iterate_init == NULL) {
+ /* not supported by backend */
+ i_error("%s: dict iteration not supported", dict->name);
+ return &dict_iter_unsupported;
+ }
return dict->v.iterate_init(dict, paths, flags);
}
bool dict_iterate(struct dict_iterate_context *ctx,
const char **key_r, const char **value_r)
{
- return ctx->dict->v.iterate(ctx, key_r, value_r);
+ return ctx == &dict_iter_unsupported ? FALSE :
+ ctx->dict->v.iterate(ctx, key_r, value_r);
}
int dict_iterate_deinit(struct dict_iterate_context **_ctx)
struct dict_iterate_context *ctx = *_ctx;
*_ctx = NULL;
- return ctx->dict->v.iterate_deinit(ctx);
+ return ctx == &dict_iter_unsupported ? -1 :
+ ctx->dict->v.iterate_deinit(ctx);
}
struct dict_transaction_context *dict_transaction_begin(struct dict *dict)