]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-dict: Changed dict.init() API to take struct dict_settings and added dict_init_fu...
authorTimo Sirainen <tss@iki.fi>
Thu, 28 Aug 2014 12:56:41 +0000 (21:56 +0900)
committerTimo Sirainen <tss@iki.fi>
Thu, 28 Aug 2014 12:56:41 +0000 (21:56 +0900)
This allows giving more settings to dict in future as needed. Unfortunately
it also breaks the internal dict API, but there aren't really any plugins
widely using it, so it's not a big problem.

src/lib-dict/dict-client.c
src/lib-dict/dict-file.c
src/lib-dict/dict-fs.c
src/lib-dict/dict-memcached-ascii.c
src/lib-dict/dict-memcached.c
src/lib-dict/dict-private.h
src/lib-dict/dict-redis.c
src/lib-dict/dict-sql.c
src/lib-dict/dict.c
src/lib-dict/dict.h

index e5316956659c4e2436677c76580a72397c5624f8..375b859b8520cc810171afc758472a20e1fa1ae5 100644 (file)
@@ -477,9 +477,8 @@ static void client_dict_disconnect(struct client_dict *dict)
 
 static int
 client_dict_init(struct dict *driver, const char *uri,
-                enum dict_data_type value_type, const char *username,
-                const char *base_dir, struct dict **dict_r,
-                const char **error_r)
+                const struct dict_settings *set,
+                struct dict **dict_r, const char **error_r)
 {
        struct client_dict *dict;
        const char *dest_uri;
@@ -496,8 +495,8 @@ client_dict_init(struct dict *driver, const char *uri,
        dict = p_new(pool, struct client_dict, 1);
        dict->pool = pool;
        dict->dict = *driver;
-       dict->value_type = value_type;
-       dict->username = p_strdup(pool, username);
+       dict->value_type = set->value_type;
+       dict->username = p_strdup(pool, set->username);
 
        dict->fd = -1;
 
@@ -505,7 +504,7 @@ client_dict_init(struct dict *driver, const char *uri,
                /* path given */
                dict->path = p_strdup_until(pool, uri, dest_uri);
        } else {
-               dict->path = p_strconcat(pool, base_dir,
+               dict->path = p_strconcat(pool, set->base_dir,
                                "/"DEFAULT_DICT_SERVER_SOCKET_FNAME, NULL);
        }
        dict->uri = p_strdup(pool, dest_uri + 1);
index 9ba1f4194ad84c11af520a76a6e1d62a1ec65a8e..198d05a6870d9e2fe5435d5d46d991a3bddc3877 100644 (file)
@@ -3,6 +3,7 @@
 #include "lib.h"
 #include "array.h"
 #include "hash.h"
+#include "home-expand.h"
 #include "mkdir-parents.h"
 #include "file-lock.h"
 #include "file-dotlock.h"
@@ -54,10 +55,8 @@ static struct dotlock_settings file_dict_dotlock_settings = {
 
 static int
 file_dict_init(struct dict *driver, const char *uri,
-              enum dict_data_type value_type ATTR_UNUSED,
-              const char *username ATTR_UNUSED,
-              const char *base_dir ATTR_UNUSED, struct dict **dict_r,
-              const char **error_r)
+              const struct dict_settings *set ATTR_UNUSED,
+              struct dict **dict_r, const char **error_r)
 {
        struct file_dict *dict;
        const char *p;
@@ -77,7 +76,6 @@ file_dict_init(struct dict *driver, const char *uri,
                        dict->lock_method = FILE_LOCK_METHOD_FLOCK;
                else {
                        *error_r = t_strdup_printf("Invalid parameter: %s", p+1);
-                       i_free(dict->path);
                        i_free(dict);
                        return -1;
                }
index b7be479f605f0d10a96f45864bd1fc17f568056e..9cb846faae00646dba46580c29bc7341fc910ccc 100644 (file)
@@ -16,10 +16,8 @@ struct fs_dict {
 
 static int
 fs_dict_init(struct dict *driver, const char *uri,
-            enum dict_data_type value_type ATTR_UNUSED,
-            const char *username,
-            const char *base_dir, struct dict **dict_r,
-            const char **error_r)
+            const struct dict_settings *set,
+            struct dict **dict_r, const char **error_r)
 {
        struct fs_settings fs_set;
        struct fs *fs;
@@ -36,14 +34,15 @@ fs_dict_init(struct dict *driver, const char *uri,
        }
 
        memset(&fs_set, 0, sizeof(fs_set));
-       fs_set.base_dir = base_dir;
+       fs_set.username = set->username;
+       fs_set.base_dir = set->base_dir;
        if (fs_init(fs_driver, fs_args, &fs_set, &fs, error_r) < 0)
                return -1;
 
        dict = i_new(struct fs_dict, 1);
        dict->dict = *driver;
        dict->fs = fs;
-       dict->username = i_strdup(username);
+       dict->username = i_strdup(set->username);
 
        *dict_r = &dict->dict;
        return 0;
index 93e8a64a86f9a51a9464e19244510797b73efb3c..d0b7c542f08a0cb2c7d753fee877dbb97be96c0c 100644 (file)
@@ -347,9 +347,7 @@ static const char *memcached_ascii_escape_username(const char *username)
 
 static int
 memcached_ascii_dict_init(struct dict *driver, const char *uri,
-                         enum dict_data_type value_type ATTR_UNUSED,
-                         const char *username,
-                         const char *base_dir ATTR_UNUSED,
+                         const struct dict_settings *set,
                          struct dict **dict_r, const char **error_r)
 {
        struct memcached_ascii_dict *dict;
@@ -411,11 +409,11 @@ memcached_ascii_dict_init(struct dict *driver, const char *uri,
        dict->conn.reply_str = str_new(default_pool, 256);
        dict->conn.dict = dict;
 
-       if (strchr(username, DICT_USERNAME_SEPARATOR) == NULL)
-               dict->username = i_strdup(username);
+       if (strchr(set->username, DICT_USERNAME_SEPARATOR) == NULL)
+               dict->username = i_strdup(set->username);
        else {
                /* escape the username */
-               dict->username = i_strdup(memcached_ascii_escape_username(username));
+               dict->username = i_strdup(memcached_ascii_escape_username(set->username));
        }
        i_array_init(&dict->input_states, 4);
        i_array_init(&dict->replies, 4);
index 51fc695c83821eaf7836d3e372557bddee9a98c0..f806086831aef6158501dc12b5333c3e8b3ad307 100644 (file)
@@ -169,10 +169,8 @@ static const struct connection_vfuncs memcached_conn_vfuncs = {
 
 static int
 memcached_dict_init(struct dict *driver, const char *uri,
-                   enum dict_data_type value_type ATTR_UNUSED,
-                   const char *username ATTR_UNUSED,
-                   const char *base_dir ATTR_UNUSED, struct dict **dict_r,
-                   const char **error_r)
+                   const struct dict_settings *set ATTR_UNUSED,
+                   struct dict **dict_r, const char **error_r)
 {
        struct memcached_dict *dict;
        const char *const *args;
index 02cd83fab8e3a42df594b964c2b2c85c30fecb6a..5cafaf33c81b3ac5b14aeb795a1b3d3cb8316b61 100644 (file)
@@ -5,8 +5,7 @@
 
 struct dict_vfuncs {
        int (*init)(struct dict *dict_driver, const char *uri,
-                   enum dict_data_type value_type,
-                   const char *username, const char *base_dir,
+                   const struct dict_settings *set,
                    struct dict **dict_r, const char **error_r);
        void (*deinit)(struct dict *dict);
        int (*wait)(struct dict *dict);
index a5d56662c53cbf03f077d8361a6cba2f853a0b8b..a68b4ff6940a795f3a4aea2696b426d2a1323b6e 100644 (file)
@@ -311,10 +311,8 @@ static const char *redis_escape_username(const char *username)
 
 static int
 redis_dict_init(struct dict *driver, const char *uri,
-               enum dict_data_type value_type ATTR_UNUSED,
-               const char *username,
-               const char *base_dir ATTR_UNUSED, struct dict **dict_r,
-               const char **error_r)
+               const struct dict_settings *set,
+               struct dict **dict_r, const char **error_r)
 {
        struct redis_dict *dict;
        struct ip_addr ip;
@@ -383,11 +381,11 @@ redis_dict_init(struct dict *driver, const char *uri,
 
        i_array_init(&dict->input_states, 4);
        i_array_init(&dict->replies, 4);
-       if (strchr(username, DICT_USERNAME_SEPARATOR) == NULL)
-               dict->username = i_strdup(username);
+       if (strchr(set->username, DICT_USERNAME_SEPARATOR) == NULL)
+               dict->username = i_strdup(set->username);
        else {
                /* escape the username */
-               dict->username = i_strdup(redis_escape_username(username));
+               dict->username = i_strdup(redis_escape_username(set->username));
        }
 
        *dict_r = &dict->dict;
index f8871ac52dcb71f5932be013c0cfbc5ba7fef363..3bc20adfd29f83abe3ac45d9f810f86839d69ba1 100644 (file)
@@ -73,8 +73,7 @@ static void sql_dict_prev_inc_flush(struct sql_dict_transaction_context *ctx);
 
 static int
 sql_dict_init(struct dict *driver, const char *uri,
-             enum dict_data_type value_type ATTR_UNUSED,
-             const char *username, const char *base_dir ATTR_UNUSED,
+             const struct dict_settings *set,
              struct dict **dict_r, const char **error_r)
 {
        struct sql_dict *dict;
@@ -84,7 +83,7 @@ sql_dict_init(struct dict *driver, const char *uri,
        dict = p_new(pool, struct sql_dict, 1);
        dict->pool = pool;
        dict->dict = *driver;
-       dict->username = p_strdup(pool, username);
+       dict->username = p_strdup(pool, set->username);
        dict->set = dict_sql_settings_read(pool, uri, error_r);
        if (dict->set == NULL) {
                pool_unref(&pool);
index 08460197d63da366c2c2ead3131252e12c0dee09..27fd2c0df7c710db06077da609763cf46dcf5c02 100644 (file)
@@ -55,11 +55,23 @@ void dict_driver_unregister(struct dict *driver)
 int dict_init(const char *uri, enum dict_data_type value_type,
              const char *username, const char *base_dir, struct dict **dict_r,
              const char **error_r)
+{
+       struct dict_settings set;
+
+       memset(&set, 0, sizeof(set));
+       set.value_type = value_type;
+       set.username = username;
+       set.base_dir = base_dir;
+       return dict_init_full(uri, &set, dict_r, error_r);
+}
+
+int dict_init_full(const char *uri, const struct dict_settings *set,
+                  struct dict **dict_r, const char **error_r)
 {
        struct dict *dict;
        const char *p, *name, *error;
 
-       i_assert(username != NULL);
+       i_assert(set->username != NULL);
 
        p = strchr(uri, ':');
        if (p == NULL) {
@@ -74,8 +86,7 @@ int dict_init(const char *uri, enum dict_data_type value_type,
                *error_r = t_strdup_printf("Unknown dict module: %s", name);
                return -1;
        }
-       if (dict->v.init(dict, p+1, value_type, username, base_dir,
-                        dict_r, &error) < 0) {
+       if (dict->v.init(dict, p+1, set, dict_r, &error) < 0) {
                *error_r = t_strdup_printf("dict %s: %s", name, error);
                return -1;
        }
index fc287a6a87df3aa308b2b04fac32a94005b50388..df489009f2337436e02d7655eea8de660f75034c 100644 (file)
@@ -14,10 +14,16 @@ enum dict_iterate_flags {
 };
 
 enum dict_data_type {
-       DICT_DATA_TYPE_STRING,
+       DICT_DATA_TYPE_STRING = 0,
        DICT_DATA_TYPE_UINT32
 };
 
+struct dict_settings {
+       enum dict_data_type value_type;
+       const char *username;
+       const char *base_dir;
+};
+
 typedef void dict_transaction_commit_callback_t(int ret, void *context);
 
 void dict_driver_register(struct dict *driver);
@@ -34,6 +40,8 @@ void dict_drivers_unregister_all(void);
 int dict_init(const char *uri, enum dict_data_type value_type,
              const char *username, const char *base_dir, struct dict **dict_r,
              const char **error_r);
+int dict_init_full(const char *uri, const struct dict_settings *set,
+                  struct dict **dict_r, const char **error_r);
 /* Close dictionary. */
 void dict_deinit(struct dict **dict);
 /* Wait for all pending asynchronous transaction commits to finish.