Mercurial > dovecot > core-2.2
annotate src/lib-dict/dict-fs.c @ 17043:773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Each dict key is a separate file where the file's contents are the dict
value.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 08 Dec 2013 21:13:22 +0200 |
parents | |
children | add8c00fb3cc |
rev | line source |
---|---|
17043
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1 /* Copyright (c) 2013 Dovecot authors, see the included COPYING file */ |
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, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 enum dict_data_type value_type ATTR_UNUSED, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 const char *username, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 const char *base_dir, struct dict **dict_r, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 const char **error_r) |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 { |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 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
|
25 struct fs *fs; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 struct fs_dict *dict; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 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
|
28 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 p = strchr(uri, ':'); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 if (p == NULL) { |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 fs_driver = uri; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 fs_args = ""; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 } else { |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 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
|
35 fs_args = p+1; |
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 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 memset(&fs_set, 0, sizeof(fs_set)); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 fs_set.base_dir = base_dir; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 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
|
41 return -1; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 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
|
44 dict->dict = *driver; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 dict->fs = fs; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 dict->username = i_strdup(username); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 *dict_r = &dict->dict; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 return 0; |
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 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 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
|
53 { |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 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
|
55 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 fs_deinit(&dict->fs); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 i_free(dict->username); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 i_free(dict); |
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 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
|
62 { |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 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
|
64 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
|
65 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
|
66 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
|
67 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
|
68 } else { |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 i_unreached(); |
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 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 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
|
74 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
|
75 { |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 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
|
77 struct fs_file *file; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 struct istream *input; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 const unsigned char *data; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 size_t size; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 string_t *str; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 int ret; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 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
|
85 FS_OPEN_MODE_READONLY); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 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
|
87 i_stream_read(input); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 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
|
90 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
|
91 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
|
92 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
|
93 } |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 i_assert(ret == -1); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 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
|
97 *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
|
98 ret = 1; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 } else { |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 *value_r = NULL; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 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
|
102 ret = 0; |
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 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 i_stream_unref(&input); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 fs_file_deinit(&file); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 return ret; |
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 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 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
|
111 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
|
112 { |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 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
|
114 pool_t pool; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 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
|
117 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
|
118 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
|
119 return &ctx->ctx; |
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 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 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
|
123 { |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 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
|
125 struct fs_file *file; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 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
|
127 const char *key; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 int ret = 0; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 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
|
131 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
|
132 switch (change->type) { |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 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
|
134 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
|
135 FS_OPEN_MODE_REPLACE); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 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
|
137 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
|
138 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
|
139 ret = -1; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 } |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 fs_file_deinit(&file); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 break; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 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
|
144 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
|
145 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
|
146 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
|
147 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
|
148 ret = -1; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 } |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 fs_file_deinit(&file); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 break; |
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_APPEND: |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 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
|
154 i_unreached(); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 } |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 if (ret < 0) |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 return -1; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 } |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 return 0; |
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 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 static int |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 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
|
164 bool async ATTR_UNUSED, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 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
|
166 void *context) |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 { |
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 (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
|
170 int ret; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 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
|
173 ret = -1; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 else |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 ret = 1; |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 pool_unref(&ctx->pool); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 if (callback != NULL) |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 callback(ret, context); |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 return ret; |
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 |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 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
|
184 .name = "fs", |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 { |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 fs_dict_init, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 fs_dict_deinit, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 NULL, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 fs_dict_lookup, |
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 NULL, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 fs_dict_transaction_init, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 fs_dict_transaction_commit, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 dict_transaction_memory_rollback, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 dict_transaction_memory_set, |
773e9ce608ed
lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
197 dict_transaction_memory_unset, |
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 NULL |
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 }; |