Mercurial > dovecot > core-2.2
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 |
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 }; |