]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
dict-cdb: Implement new init() API
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 18 Sep 2024 11:39:59 +0000 (14:39 +0300)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 17 Jan 2025 08:40:00 +0000 (10:40 +0200)
src/lib-dict-backend/dict-cdb.c

index 37e05ccdd8953fb50493198ee0763ad4aa04b437..9710e191c42007e4a3cc40e7ed91b2beeaa02424 100644 (file)
@@ -4,6 +4,8 @@
 #include "buffer.h"
 
 #ifdef BUILD_CDB
+#include "settings.h"
+#include "settings-parser.h"
 #include "dict-private.h"
 
 #include <string.h>
@@ -32,19 +34,47 @@ struct cdb_dict_iterate_context {
        char *error;
 };
 
+struct dict_cdb_settings {
+       pool_t pool;
+
+       const char *cdb_path;
+};
+
+#undef DEF
+#define DEF(type, name) \
+       SETTING_DEFINE_STRUCT_##type(#name, name, struct dict_cdb_settings)
+static const struct setting_define cdb_setting_defines[] = {
+       DEF(STR, cdb_path),
+
+       SETTING_DEFINE_LIST_END
+};
+static const struct dict_cdb_settings cdb_default_settings = {
+       .cdb_path = "",
+};
+const struct setting_parser_info cdb_setting_parser_info = {
+       .name = "dict_cdb",
+
+       .defines = cdb_setting_defines,
+       .defaults = &cdb_default_settings,
+
+       .struct_size = sizeof(struct dict_cdb_settings),
+       .pool_offset1 = 1 + offsetof(struct dict_cdb_settings, pool),
+};
+
 static void cdb_dict_deinit(struct dict *_dict);
 
 static int
-cdb_dict_init_legacy(struct dict *driver, const char *uri,
-                    const struct dict_legacy_settings *set ATTR_UNUSED,
+cdb_dict_init_common(const struct dict *driver,
+                    const struct dict_cdb_settings *set,
                     struct dict **dict_r, const char **error_r)
 {
        struct cdb_dict *dict;
 
        dict = i_new(struct cdb_dict, 1);
        dict->dict = *driver;
-       dict->path = i_strdup(uri);
+       dict->path = i_strdup(set->cdb_path);
        dict->flag = CDB_WITH_NULL | CDB_WITHOUT_NULL;
+       settings_free(set);
 
        /* initialize cdb to 0 (unallocated) */
        i_zero(&dict->cdb);
@@ -70,6 +100,31 @@ cdb_dict_init_legacy(struct dict *driver, const char *uri,
        return 0;
 }
 
+static int
+cdb_dict_init_legacy(struct dict *driver, const char *uri,
+                    const struct dict_legacy_settings *legacy_set ATTR_UNUSED,
+                    struct dict **dict_r, const char **error_r)
+{
+       pool_t pool = pool_alloconly_create("cdb_settings", 128);
+       struct dict_cdb_settings *set =
+               settings_defaults_dup(pool, &cdb_setting_parser_info);
+       set->cdb_path = p_strdup(pool, uri);
+       return cdb_dict_init_common(driver, set, dict_r, error_r);
+}
+
+static int
+cdb_dict_init(const struct dict *dict_driver, struct event *event,
+             struct dict **dict_r, const char **error_r)
+{
+       const struct dict_cdb_settings *set;
+
+       if (settings_get(event, &cdb_setting_parser_info, 0,
+                        &set, error_r) < 0)
+               return -1;
+       return cdb_dict_init_common(dict_driver, set, dict_r, error_r);
+}
+
+
 static void cdb_dict_deinit(struct dict *_dict)
 {
        struct cdb_dict *dict = (struct cdb_dict *)_dict;
@@ -256,6 +311,7 @@ static int cdb_dict_iterate_deinit(struct dict_iterate_context *_ctx,
 struct dict dict_driver_cdb = {
        .name = "cdb",
        .v = {
+               .init = cdb_dict_init,
                .init_legacy = cdb_dict_init_legacy,
                .deinit = cdb_dict_deinit,
                .lookup = cdb_dict_lookup,