dovecot-2.2: lib-dict: Changed dict.init() API to take struct di...

dovecot at dovecot.org dovecot at dovecot.org
Thu Aug 28 13:11:29 UTC 2014


details:   http://hg.dovecot.org/dovecot-2.2/rev/77e71a45a475
changeset: 17751:77e71a45a475
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Aug 28 21:56:41 2014 +0900
description:
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.

diffstat:

 src/lib-dict/dict-client.c          |  11 +++++------
 src/lib-dict/dict-file.c            |   8 +++-----
 src/lib-dict/dict-fs.c              |  11 +++++------
 src/lib-dict/dict-memcached-ascii.c |  10 ++++------
 src/lib-dict/dict-memcached.c       |   6 ++----
 src/lib-dict/dict-private.h         |   3 +--
 src/lib-dict/dict-redis.c           |  12 +++++-------
 src/lib-dict/dict-sql.c             |   5 ++---
 src/lib-dict/dict.c                 |  17 ++++++++++++++---
 src/lib-dict/dict.h                 |  10 +++++++++-
 10 files changed, 50 insertions(+), 43 deletions(-)

diffs (279 lines):

diff -r d91b43496e72 -r 77e71a45a475 src/lib-dict/dict-client.c
--- 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);
diff -r d91b43496e72 -r 77e71a45a475 src/lib-dict/dict-file.c
--- 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;
 		}
diff -r d91b43496e72 -r 77e71a45a475 src/lib-dict/dict-fs.c
--- 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;
diff -r d91b43496e72 -r 77e71a45a475 src/lib-dict/dict-memcached-ascii.c
--- 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);
diff -r d91b43496e72 -r 77e71a45a475 src/lib-dict/dict-memcached.c
--- 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;
diff -r d91b43496e72 -r 77e71a45a475 src/lib-dict/dict-private.h
--- 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);
diff -r d91b43496e72 -r 77e71a45a475 src/lib-dict/dict-redis.c
--- 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;
diff -r d91b43496e72 -r 77e71a45a475 src/lib-dict/dict-sql.c
--- 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);
diff -r d91b43496e72 -r 77e71a45a475 src/lib-dict/dict.c
--- 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;
 	}
diff -r d91b43496e72 -r 77e71a45a475 src/lib-dict/dict.h
--- 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.


More information about the dovecot-cvs mailing list