annotate src/lib-dict/dict-fs.c @ 17130:add8c00fb3cc

Updated copyright notices to include year 2014.
author Timo Sirainen <tss@iki.fi>
date Tue, 04 Feb 2014 16:23:22 -0500
parents 773e9ce608ed
children 77e71a45a475
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,
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 };