Mercurial > dovecot > core-2.2
annotate src/lib-dict/dict-fs.c @ 17751:77e71a45a475
lib-dict: Changed dict.init() API to take struct dict_settings and added dict_init_full().
This allows giving more settings to dict in future as needed. Unfortunately
it also breaks the internal dict API, but there aren't really any plugins
widely using it, so it's not a big problem.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 28 Aug 2014 21:56:41 +0900 |
parents | add8c00fb3cc |
children | 979e5a007248 |
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 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 static int |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 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
|
19 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
|
20 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
|
21 { |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 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
|
23 struct fs *fs; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 struct fs_dict *dict; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 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
|
26 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 p = strchr(uri, ':'); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 if (p == NULL) { |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 fs_driver = uri; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 fs_args = ""; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 } else { |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 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
|
33 fs_args = p+1; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 } |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 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
|
37 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
|
38 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
|
39 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
|
40 return -1; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 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
|
43 dict->dict = *driver; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 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
|
45 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
|
46 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 *dict_r = &dict->dict; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 return 0; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 } |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 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
|
52 { |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 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
|
54 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 fs_deinit(&dict->fs); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 i_free(dict->username); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 i_free(dict); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 } |
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 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
|
61 { |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 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
|
63 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
|
64 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
|
65 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
|
66 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
|
67 } else { |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 i_unreached(); |
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 } |
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 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
|
73 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
|
74 { |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 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
|
76 struct fs_file *file; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 struct istream *input; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 const unsigned char *data; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 size_t size; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 string_t *str; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 int ret; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 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
|
84 FS_OPEN_MODE_READONLY); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 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
|
86 i_stream_read(input); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 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
|
89 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
|
90 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
|
91 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
|
92 } |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 i_assert(ret == -1); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 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
|
96 *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
|
97 ret = 1; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 } else { |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 *value_r = NULL; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 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
|
101 ret = 0; |
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 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 i_stream_unref(&input); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 fs_file_deinit(&file); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 return ret; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 } |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 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
|
110 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
|
111 { |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 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
|
113 pool_t pool; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 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
|
116 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
|
117 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
|
118 return &ctx->ctx; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 } |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 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
|
122 { |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 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
|
124 struct fs_file *file; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 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
|
126 const char *key; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 int ret = 0; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 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
|
130 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
|
131 switch (change->type) { |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 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
|
133 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
|
134 FS_OPEN_MODE_REPLACE); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 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
|
136 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
|
137 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
|
138 ret = -1; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 } |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 fs_file_deinit(&file); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 break; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 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
|
143 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
|
144 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
|
145 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
|
146 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
|
147 ret = -1; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 } |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 fs_file_deinit(&file); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 break; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 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
|
152 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
|
153 i_unreached(); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 } |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 if (ret < 0) |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 return -1; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 } |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 return 0; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 } |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 static int |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 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
|
163 bool async ATTR_UNUSED, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 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
|
165 void *context) |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 { |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 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
|
168 (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
|
169 int ret; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 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
|
172 ret = -1; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 else |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 ret = 1; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 pool_unref(&ctx->pool); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 if (callback != NULL) |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 callback(ret, context); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 return ret; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 } |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 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
|
183 .name = "fs", |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 { |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 fs_dict_init, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 fs_dict_deinit, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 NULL, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 fs_dict_lookup, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 NULL, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 NULL, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 NULL, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
192 fs_dict_transaction_init, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 fs_dict_transaction_commit, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 dict_transaction_memory_rollback, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 dict_transaction_memory_set, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 dict_transaction_memory_unset, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
197 NULL, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 NULL |
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 }; |