annotate src/lib-dict/dict-fs.c @ 17824:979e5a007248

lib-dict: dict-fs implements now minimal iteration support.
author Timo Sirainen <tss@iki.fi>
date Thu, 18 Sep 2014 17:46:18 +0200
parents 77e71a45a475
children 3009a1a6f6d5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
17130
add8c00fb3cc Updated copyright notices to include year 2014.
Timo Sirainen <tss@iki.fi>
parents: 17043
diff changeset
1 /* Copyright (c) 2013-2014 Dovecot authors, see the included COPYING file */
17043
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "array.h"
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "fs-api.h"
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "istream.h"
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "str.h"
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "dict-transaction-memory.h"
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "dict-private.h"
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 struct fs_dict {
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 struct dict dict;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 struct fs *fs;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 char *username;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 };
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16
17824
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
17 struct fs_dict_iterate_context {
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
18 struct dict_iterate_context ctx;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
19 const char **paths;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
20 unsigned int path_idx;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
21 enum dict_iterate_flags flags;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
22 pool_t value_pool;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
23 struct fs_iter *fs_iter;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
24 bool failed;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
25 };
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
26
17043
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 static int
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 fs_dict_init(struct dict *driver, const char *uri,
17751
77e71a45a475 lib-dict: Changed dict.init() API to take struct dict_settings and added dict_init_full().
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
29 const struct dict_settings *set,
77e71a45a475 lib-dict: Changed dict.init() API to take struct dict_settings and added dict_init_full().
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
30 struct dict **dict_r, const char **error_r)
17043
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 {
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 struct fs_settings fs_set;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 struct fs *fs;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 struct fs_dict *dict;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 const char *p, *fs_driver, *fs_args;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 p = strchr(uri, ':');
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 if (p == NULL) {
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 fs_driver = uri;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 fs_args = "";
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 } else {
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 fs_driver = t_strdup_until(uri, p);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 fs_args = p+1;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 }
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 memset(&fs_set, 0, sizeof(fs_set));
17751
77e71a45a475 lib-dict: Changed dict.init() API to take struct dict_settings and added dict_init_full().
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
47 fs_set.username = set->username;
77e71a45a475 lib-dict: Changed dict.init() API to take struct dict_settings and added dict_init_full().
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
48 fs_set.base_dir = set->base_dir;
17043
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 if (fs_init(fs_driver, fs_args, &fs_set, &fs, error_r) < 0)
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 return -1;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 dict = i_new(struct fs_dict, 1);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 dict->dict = *driver;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 dict->fs = fs;
17751
77e71a45a475 lib-dict: Changed dict.init() API to take struct dict_settings and added dict_init_full().
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
55 dict->username = i_strdup(set->username);
17043
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 *dict_r = &dict->dict;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 return 0;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 }
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 static void fs_dict_deinit(struct dict *_dict)
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 {
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 struct fs_dict *dict = (struct fs_dict *)_dict;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 fs_deinit(&dict->fs);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 i_free(dict->username);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 i_free(dict);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 }
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 static const char *fs_dict_get_full_key(struct fs_dict *dict, const char *key)
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 {
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 if (strncmp(key, DICT_PATH_SHARED, strlen(DICT_PATH_SHARED)) == 0)
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 return key + strlen(DICT_PATH_SHARED);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 else if (strncmp(key, DICT_PATH_PRIVATE, strlen(DICT_PATH_PRIVATE)) == 0) {
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 return t_strdup_printf("%s/%s", dict->username,
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 key + strlen(DICT_PATH_PRIVATE));
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 } else {
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 i_unreached();
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 }
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 }
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 static int fs_dict_lookup(struct dict *_dict, pool_t pool,
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 const char *key, const char **value_r)
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 {
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 struct fs_dict *dict = (struct fs_dict *)_dict;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 struct fs_file *file;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 struct istream *input;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 const unsigned char *data;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 size_t size;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 string_t *str;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 int ret;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 file = fs_file_init(dict->fs, fs_dict_get_full_key(dict, key),
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 FS_OPEN_MODE_READONLY);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 input = fs_read_stream(file, IO_BLOCK_SIZE);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96 i_stream_read(input);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 str = str_new(pool, i_stream_get_data_size(input)+1);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 while ((ret = i_stream_read_data(input, &data, &size, 0)) > 0) {
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 str_append_n(str, data, size);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 i_stream_skip(input, size);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 }
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 i_assert(ret == -1);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 if (input->stream_errno == 0) {
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 *value_r = str_c(str);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107 ret = 1;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108 } else {
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109 *value_r = NULL;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 if (input->stream_errno == ENOENT)
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 ret = 0;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 }
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 i_stream_unref(&input);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 fs_file_deinit(&file);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 return ret;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117 }
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118
17824
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
119 static struct dict_iterate_context *
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
120 fs_dict_iterate_init(struct dict *_dict, const char *const *paths,
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
121 enum dict_iterate_flags flags)
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
122 {
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
123 struct fs_dict *dict = (struct fs_dict *)_dict;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
124 struct fs_dict_iterate_context *iter;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
125
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
126 /* these flags are not supported for now */
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
127 i_assert((flags & DICT_ITERATE_FLAG_RECURSE) == 0);
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
128 i_assert((flags & (DICT_ITERATE_FLAG_SORT_BY_KEY |
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
129 DICT_ITERATE_FLAG_SORT_BY_VALUE)) == 0);
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
130
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
131 iter = i_new(struct fs_dict_iterate_context, 1);
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
132 iter->ctx.dict = _dict;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
133 iter->paths = p_strarray_dup(default_pool, paths);
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
134 iter->flags = flags;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
135 iter->value_pool = pool_alloconly_create("iterate value pool", 128);
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
136 iter->fs_iter = fs_iter_init(dict->fs,
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
137 fs_dict_get_full_key(dict, paths[0]), 0);
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
138 return &iter->ctx;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
139 }
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
140
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
141 static bool fs_dict_iterate(struct dict_iterate_context *ctx,
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
142 const char **key_r, const char **value_r)
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
143 {
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
144 struct fs_dict_iterate_context *iter =
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
145 (struct fs_dict_iterate_context *)ctx;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
146 struct fs_dict *dict = (struct fs_dict *)ctx->dict;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
147 const char *path;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
148 int ret;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
149
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
150 *key_r = fs_iter_next(iter->fs_iter);
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
151 if (*key_r == NULL) {
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
152 if (fs_iter_deinit(&iter->fs_iter) < 0) {
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
153 iter->failed = TRUE;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
154 return FALSE;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
155 }
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
156 if (iter->paths[++iter->path_idx] == NULL)
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
157 return FALSE;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
158 path = fs_dict_get_full_key(dict, iter->paths[iter->path_idx]);
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
159 iter->fs_iter = fs_iter_init(dict->fs, path, 0);
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
160 return fs_dict_iterate(ctx, key_r, value_r);
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
161 }
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
162 if ((iter->flags & DICT_ITERATE_FLAG_NO_VALUE) != 0) {
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
163 *value_r = NULL;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
164 return TRUE;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
165 }
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
166 p_clear(iter->value_pool);
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
167 path = t_strconcat(iter->paths[iter->path_idx], *key_r, NULL);
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
168 if ((ret = fs_dict_lookup(ctx->dict, iter->value_pool, path, value_r)) < 0) {
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
169 /* I/O error */
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
170 iter->failed = TRUE;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
171 return FALSE;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
172 } else if (ret == 0) {
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
173 /* file was just deleted, just skip to next one */
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
174 return fs_dict_iterate(ctx, key_r, value_r);
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
175 }
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
176 return TRUE;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
177 }
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
178
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
179 static int fs_dict_iterate_deinit(struct dict_iterate_context *ctx)
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
180 {
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
181 struct fs_dict_iterate_context *iter =
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
182 (struct fs_dict_iterate_context *)ctx;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
183 int ret;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
184
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
185 if (iter->fs_iter != NULL) {
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
186 if (fs_iter_deinit(&iter->fs_iter) < 0)
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
187 iter->failed = TRUE;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
188 }
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
189 ret = iter->failed ? -1 : 0;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
190
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
191 pool_unref(&iter->value_pool);
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
192 i_free(iter->paths);
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
193 i_free(iter);
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
194 return ret;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
195 }
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
196
17043
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 static struct dict_transaction_context *
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 fs_dict_transaction_init(struct dict *_dict)
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 {
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 struct dict_transaction_memory_context *ctx;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 pool_t pool;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 pool = pool_alloconly_create("file dict transaction", 2048);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 ctx = p_new(pool, struct dict_transaction_memory_context, 1);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 dict_transaction_memory_init(ctx, _dict, pool);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 return &ctx->ctx;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 }
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 static int fs_dict_write_changes(struct dict_transaction_memory_context *ctx)
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 {
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 struct fs_dict *dict = (struct fs_dict *)ctx->ctx.dict;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212 struct fs_file *file;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 const struct dict_transaction_memory_change *change;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 const char *key;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 int ret = 0;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 array_foreach(&ctx->changes, change) {
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 key = fs_dict_get_full_key(dict, change->key);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 switch (change->type) {
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 case DICT_CHANGE_TYPE_SET:
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 file = fs_file_init(dict->fs, key,
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 FS_OPEN_MODE_REPLACE);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 if (fs_write(file, change->value.str, strlen(change->value.str)) < 0) {
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 i_error("fs_write(%s) failed: %s", key,
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 fs_file_last_error(file));
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226 ret = -1;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 }
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 fs_file_deinit(&file);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 break;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 case DICT_CHANGE_TYPE_UNSET:
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 file = fs_file_init(dict->fs, key, FS_OPEN_MODE_READONLY);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 if (fs_delete(file) < 0) {
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 i_error("fs_delete(%s) failed: %s", key,
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 fs_file_last_error(file));
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235 ret = -1;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 }
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 fs_file_deinit(&file);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 break;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 case DICT_CHANGE_TYPE_APPEND:
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 case DICT_CHANGE_TYPE_INC:
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 i_unreached();
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 }
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 if (ret < 0)
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 return -1;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 }
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 return 0;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247 }
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 static int
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250 fs_dict_transaction_commit(struct dict_transaction_context *_ctx,
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251 bool async ATTR_UNUSED,
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252 dict_transaction_commit_callback_t *callback,
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 void *context)
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254 {
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 struct dict_transaction_memory_context *ctx =
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256 (struct dict_transaction_memory_context *)_ctx;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257 int ret;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
259 if (fs_dict_write_changes(ctx) < 0)
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
260 ret = -1;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261 else
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 ret = 1;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 pool_unref(&ctx->pool);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265 if (callback != NULL)
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266 callback(ret, context);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 return ret;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 }
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 struct dict dict_driver_fs = {
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 .name = "fs",
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 {
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 fs_dict_init,
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 fs_dict_deinit,
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275 NULL,
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276 fs_dict_lookup,
17824
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
277 fs_dict_iterate_init,
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
278 fs_dict_iterate,
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
279 fs_dict_iterate_deinit,
17043
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 fs_dict_transaction_init,
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 fs_dict_transaction_commit,
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 dict_transaction_memory_rollback,
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283 dict_transaction_memory_set,
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284 dict_transaction_memory_unset,
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 NULL,
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286 NULL
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287 }
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 };