changeset 17751:77e71a45a475

lib-dict: Changed dict.init() API to take struct dict_settings and added dict_init_full(). 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.
author Timo Sirainen <tss@iki.fi>
date Thu, 28 Aug 2014 21:56:41 +0900
parents d91b43496e72
children 58c3676c116c
files 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
diffstat 10 files changed, 50 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-dict/dict-client.c	Thu Aug 28 22:06:29 2014 +0900
+++ b/src/lib-dict/dict-client.c	Thu Aug 28 21:56:41 2014 +0900
@@ -477,9 +477,8 @@
 
 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 @@
 	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 @@
 		/* 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);
--- a/src/lib-dict/dict-file.c	Thu Aug 28 22:06:29 2014 +0900
+++ b/src/lib-dict/dict-file.c	Thu Aug 28 21:56:41 2014 +0900
@@ -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 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 @@
 			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;
 		}
--- a/src/lib-dict/dict-fs.c	Thu Aug 28 22:06:29 2014 +0900
+++ b/src/lib-dict/dict-fs.c	Thu Aug 28 21:56:41 2014 +0900
@@ -16,10 +16,8 @@
 
 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 @@
 	}
 
 	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;
--- a/src/lib-dict/dict-memcached-ascii.c	Thu Aug 28 22:06:29 2014 +0900
+++ b/src/lib-dict/dict-memcached-ascii.c	Thu Aug 28 21:56:41 2014 +0900
@@ -347,9 +347,7 @@
 
 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 @@
 	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);
--- a/src/lib-dict/dict-memcached.c	Thu Aug 28 22:06:29 2014 +0900
+++ b/src/lib-dict/dict-memcached.c	Thu Aug 28 21:56:41 2014 +0900
@@ -169,10 +169,8 @@
 
 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;
--- a/src/lib-dict/dict-private.h	Thu Aug 28 22:06:29 2014 +0900
+++ b/src/lib-dict/dict-private.h	Thu Aug 28 21:56:41 2014 +0900
@@ -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);
--- a/src/lib-dict/dict-redis.c	Thu Aug 28 22:06:29 2014 +0900
+++ b/src/lib-dict/dict-redis.c	Thu Aug 28 21:56:41 2014 +0900
@@ -311,10 +311,8 @@
 
 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 @@
 
 	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;
--- a/src/lib-dict/dict-sql.c	Thu Aug 28 22:06:29 2014 +0900
+++ b/src/lib-dict/dict-sql.c	Thu Aug 28 21:56:41 2014 +0900
@@ -73,8 +73,7 @@
 
 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 @@
 	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);
--- a/src/lib-dict/dict.c	Thu Aug 28 22:06:29 2014 +0900
+++ b/src/lib-dict/dict.c	Thu Aug 28 21:56:41 2014 +0900
@@ -56,10 +56,22 @@
 	      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 @@
 		*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;
 	}
--- a/src/lib-dict/dict.h	Thu Aug 28 22:06:29 2014 +0900
+++ b/src/lib-dict/dict.h	Thu Aug 28 21:56:41 2014 +0900
@@ -14,10 +14,16 @@
 };
 
 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 @@
 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.