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;
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;
/* 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);
#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"
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;
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;
}
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;
}
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;
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;
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);
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;
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);
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;
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;
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;
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);
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) {
*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;
}
};
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);
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.