annotate src/lib-dict-extra/dict-fs.c @ 22656:1789bf2a1e01

director: Make sure HOST-RESET-USERS isn't used with max_moving_users=0 The reset command would just hang in that case. doveadm would never have sent this, so this is just an extra sanity check.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Sun, 05 Nov 2017 23:51:56 +0200
parents 2e2563132d5f
children cb108f786fb4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21389
diff changeset
1 /* Copyright (c) 2013-2017 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
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21378
diff changeset
46 i_zero(&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);
20828
d7bed2a85e99 global: Make sure i_stream_read() calls handle 0 and -2 return values correctly.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20342
diff changeset
96 (void)i_stream_read(input);
17043
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);
18638
bb7d35fa9b43 lib-dict: Added DICT_ITERATE_FLAG_EXACT_KEY flag.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
128 i_assert((flags & DICT_ITERATE_FLAG_EXACT_KEY) == 0);
17824
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
129 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
130 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
131
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
132 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
133 iter->ctx.dict = _dict;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
134 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
135 iter->flags = flags;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
136 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
137 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
138 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
139 return &iter->ctx;
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
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
142 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
143 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
144 {
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 *iter =
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
146 (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
147 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
148 const char *path;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
149 int ret;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
150
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
151 *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
152 if (*key_r == NULL) {
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
153 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
154 iter->failed = TRUE;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
155 return FALSE;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
156 }
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
157 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
158 return FALSE;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
159 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
160 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
161 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
162 }
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
163 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
164 *value_r = NULL;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
165 return TRUE;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
166 }
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
167 p_clear(iter->value_pool);
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
168 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
169 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
170 /* I/O error */
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
171 iter->failed = TRUE;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
172 return FALSE;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
173 } else if (ret == 0) {
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
174 /* 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
175 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
176 }
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
177 return TRUE;
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
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
180 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
181 {
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 *iter =
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
183 (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
184 int ret;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
185
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
186 if (iter->fs_iter != NULL) {
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
187 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
188 iter->failed = TRUE;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
189 }
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
190 ret = iter->failed ? -1 : 0;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
191
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
192 pool_unref(&iter->value_pool);
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
193 i_free(iter->paths);
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
194 i_free(iter);
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
195 return ret;
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
196 }
979e5a007248 lib-dict: dict-fs implements now minimal iteration support.
Timo Sirainen <tss@iki.fi>
parents: 17751
diff changeset
197
17043
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 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
199 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
200 {
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 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
202 pool_t pool;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 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
205 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
206 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
207 return &ctx->ctx;
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
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 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
211 {
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212 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
213 struct fs_file *file;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 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
215 const char *key;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 int ret = 0;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 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
219 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
220 switch (change->type) {
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 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
222 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
223 FS_OPEN_MODE_REPLACE);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 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
225 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
226 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
227 ret = -1;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 }
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 fs_file_deinit(&file);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 break;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 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
232 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
233 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
234 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
235 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
236 ret = -1;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 }
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 fs_file_deinit(&file);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 break;
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_APPEND:
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 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
242 i_unreached();
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 }
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 if (ret < 0)
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 return -1;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 }
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247 return 0;
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
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250 static int
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251 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
252 bool async ATTR_UNUSED,
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 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
254 void *context)
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 {
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 (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
258 int ret;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
259
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
260 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
261 ret = -1;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 else
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 ret = 1;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 pool_unref(&ctx->pool);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266 if (callback != NULL)
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 callback(ret, context);
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 return ret;
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
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 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
272 .name = "fs",
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 {
21378
8b87ae4cd4c3 dict-ldap|fs: Explicitly specify used dict_vfuncs methods.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20828
diff changeset
274 .init = fs_dict_init,
8b87ae4cd4c3 dict-ldap|fs: Explicitly specify used dict_vfuncs methods.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20828
diff changeset
275 .deinit = fs_dict_deinit,
8b87ae4cd4c3 dict-ldap|fs: Explicitly specify used dict_vfuncs methods.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20828
diff changeset
276 .lookup = fs_dict_lookup,
8b87ae4cd4c3 dict-ldap|fs: Explicitly specify used dict_vfuncs methods.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20828
diff changeset
277 .iterate_init = fs_dict_iterate_init,
8b87ae4cd4c3 dict-ldap|fs: Explicitly specify used dict_vfuncs methods.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20828
diff changeset
278 .iterate = fs_dict_iterate,
8b87ae4cd4c3 dict-ldap|fs: Explicitly specify used dict_vfuncs methods.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20828
diff changeset
279 .iterate_deinit = fs_dict_iterate_deinit,
8b87ae4cd4c3 dict-ldap|fs: Explicitly specify used dict_vfuncs methods.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20828
diff changeset
280 .transaction_init = fs_dict_transaction_init,
8b87ae4cd4c3 dict-ldap|fs: Explicitly specify used dict_vfuncs methods.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20828
diff changeset
281 .transaction_commit = fs_dict_transaction_commit,
8b87ae4cd4c3 dict-ldap|fs: Explicitly specify used dict_vfuncs methods.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20828
diff changeset
282 .transaction_rollback = dict_transaction_memory_rollback,
8b87ae4cd4c3 dict-ldap|fs: Explicitly specify used dict_vfuncs methods.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20828
diff changeset
283 .set = dict_transaction_memory_set,
8b87ae4cd4c3 dict-ldap|fs: Explicitly specify used dict_vfuncs methods.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20828
diff changeset
284 .unset = dict_transaction_memory_unset,
17043
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 }
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286 };