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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
17130
add8c00fb3cc Updated copyright notices to include year 2014.
Timo Sirainen <tss@iki.fi>
parents: 17043
diff changeset
1 /* Copyright (c) 2013-2014 Dovecot authors, see the included COPYING file */
17043
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "array.h"
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "fs-api.h"
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "istream.h"
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "str.h"
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "dict-transaction-memory.h"
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "dict-private.h"
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 struct fs_dict {
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 struct dict dict;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 struct fs *fs;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 char *username;
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 };
773e9ce608ed lib-dict: Added "fs" wrapper dict backend, which uses lib-fs.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16
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 };