6
6
#include "dict-sql.h"
7
7
#include "dict-private.h"
9
static ARRAY_DEFINE(dict_drivers, struct dict *);
9
static ARRAY(struct dict *) dict_drivers;
10
10
static struct dict_iterate_context dict_iter_unsupported;
12
12
static struct dict *dict_driver_lookup(const char *name)
37
37
void dict_driver_unregister(struct dict *driver)
39
39
struct dict *const *dicts;
40
unsigned int idx = -1U;
40
unsigned int idx = UINT_MAX;
42
42
array_foreach(&dict_drivers, dicts) {
43
43
if (*dicts == driver) {
57
57
dict_driver_register(&dict_driver_client);
58
58
dict_driver_register(&dict_driver_file);
59
59
dict_driver_register(&dict_driver_memcached);
60
dict_driver_register(&dict_driver_memcached_ascii);
60
61
dict_driver_register(&dict_driver_redis);
65
66
dict_driver_unregister(&dict_driver_client);
66
67
dict_driver_unregister(&dict_driver_file);
67
68
dict_driver_unregister(&dict_driver_memcached);
69
dict_driver_unregister(&dict_driver_memcached_ascii);
68
70
dict_driver_unregister(&dict_driver_redis);
71
struct dict *dict_init(const char *uri, enum dict_data_type value_type,
72
const char *username, const char *base_dir)
73
int dict_init(const char *uri, enum dict_data_type value_type,
74
const char *username, const char *base_dir, struct dict **dict_r,
78
const char *p, *name, *error;
77
80
i_assert(username != NULL);
79
82
p = strchr(uri, ':');
81
i_error("Dictionary URI is missing ':': %s", uri);
86
name = t_strdup_until(uri, p);
87
dict = dict_driver_lookup(name);
89
i_error("Unknown dict module: %s", name);
92
return dict == NULL ? NULL :
93
dict->v.init(dict, p+1, value_type, username, base_dir);
84
*error_r = t_strdup_printf("Dictionary URI is missing ':': %s",
89
name = t_strdup_until(uri, p);
90
dict = dict_driver_lookup(name);
92
*error_r = t_strdup_printf("Unknown dict module: %s", name);
95
if (dict->v.init(dict, p+1, value_type, username, base_dir,
96
dict_r, &error) < 0) {
97
*error_r = t_strdup_printf("dict %s: %s", name, error);
96
103
void dict_deinit(struct dict **_dict)
212
219
ctx->changed = TRUE;
222
void dict_append(struct dict_transaction_context *ctx,
223
const char *key, const char *value)
225
i_assert(dict_key_prefix_is_valid(key));
227
ctx->dict->v.append(ctx, key, value);
215
231
void dict_atomic_inc(struct dict_transaction_context *ctx,
216
232
const char *key, long long diff)