]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-dict: Allow backends to have iteration methods as NULL if they don't support it.
authorTimo Sirainen <tss@iki.fi>
Mon, 23 Jul 2012 14:23:37 +0000 (17:23 +0300)
committerTimo Sirainen <tss@iki.fi>
Mon, 23 Jul 2012 14:23:37 +0000 (17:23 +0300)
src/lib-dict/dict.c

index 9767129a7196bdb587f9e67c302e4fb858f55fd7..96f72be958205352ec993ed0d592ead98fcd0b93 100644 (file)
@@ -7,6 +7,7 @@
 #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)
 {
@@ -136,13 +137,19 @@ dict_iterate_init_multiple(struct dict *dict, const char *const *paths,
        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)
@@ -150,7 +157,8 @@ 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)