Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-dict/dict-file.c @ 9191:b340ecb24469 HEAD
Fix VPATH build of RQUOTA support.
Some rpcgen derive #include "..." paths from the infile argument.
This will be off for VPATH builds, as the generated rquota_xdr.c
code will look in $(srcdir), but we'll generate the rquota.h file in
$(builddir). Play safe and copy rquota.x to $(builddir) first.
This fixes the build on openSUSE 11.1.
author | Matthias Andree <matthias.andree@gmx.de> |
---|---|
date | Tue, 07 Jul 2009 21:01:36 +0200 |
parents | eed86bcc33aa |
children | a1b92a251bb9 |
rev | line source |
---|---|
8590
b9faf4db2a9f
Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents:
8573
diff
changeset
|
1 /* Copyright (c) 2008-2009 Dovecot authors, see the included COPYING file */ |
8300
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "array.h" |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "hash.h" |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "file-dotlock.h" |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "nfs-workarounds.h" |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "istream.h" |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "ostream.h" |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #include "dict-private.h" |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #include <stdlib.h> |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 #include <unistd.h> |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 #include <fcntl.h> |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 #include <sys/stat.h> |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 struct file_dict { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 struct dict dict; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 pool_t hash_pool; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 char *path; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 struct hash_table *hash; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 int fd; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 }; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 struct file_dict_iterate_context { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 struct dict_iterate_context ctx; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 struct hash_iterate_context *iter; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 char *path; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 unsigned int path_len; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 enum dict_iterate_flags flags; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 unsigned int failed:1; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 }; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 enum file_dict_change_type { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 FILE_DICT_CHANGE_TYPE_SET, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 FILE_DICT_CHANGE_TYPE_UNSET, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 FILE_DICT_CHANGE_TYPE_INC |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 }; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 struct file_dict_change { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 enum file_dict_change_type type; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 const char *key; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 union { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 const char *str; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 long long diff; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 } value; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 }; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 struct file_dict_transaction_context { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 struct dict_transaction_context ctx; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 pool_t pool; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 ARRAY_DEFINE(changes, struct file_dict_change); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 }; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 static struct dotlock_settings file_dict_dotlock_settings = { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 MEMBER(temp_prefix) NULL, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 MEMBER(lock_suffix) NULL, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 MEMBER(timeout) 30, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 MEMBER(stale_timeout) 5 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 }; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 static struct dict *file_dict_init(struct dict *driver, const char *uri, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 enum dict_data_type value_type ATTR_UNUSED, |
9174
eed86bcc33aa
dict proxy: Use base_dir as the default dict-server location.
Timo Sirainen <tss@iki.fi>
parents:
9000
diff
changeset
|
69 const char *username ATTR_UNUSED, |
eed86bcc33aa
dict proxy: Use base_dir as the default dict-server location.
Timo Sirainen <tss@iki.fi>
parents:
9000
diff
changeset
|
70 const char *base_dir ATTR_UNUSED) |
8300
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 struct file_dict *dict; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 dict = i_new(struct file_dict, 1); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 dict->dict = *driver; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 dict->path = i_strdup(uri); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 dict->hash_pool = pool_alloconly_create("file dict", 1024); |
8573
f9166a09423a
Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents:
8432
diff
changeset
|
78 dict->hash = hash_table_create(default_pool, dict->hash_pool, 0, |
f9166a09423a
Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents:
8432
diff
changeset
|
79 str_hash, (hash_cmp_callback_t *)strcmp); |
8300
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 dict->fd = -1; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 return &dict->dict; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 static void file_dict_deinit(struct dict *_dict) |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 struct file_dict *dict = (struct file_dict *)_dict; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 |
8573
f9166a09423a
Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents:
8432
diff
changeset
|
88 hash_table_destroy(&dict->hash); |
8300
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 pool_unref(&dict->hash_pool); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 i_free(dict->path); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 i_free(dict); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 static bool file_dict_need_refresh(struct file_dict *dict) |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 struct stat st1, st2; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 if (dict->fd == -1) |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 return TRUE; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 nfs_flush_file_handle_cache(dict->path); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 if (nfs_safe_stat(dict->path, &st1) < 0) { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 i_error("stat(%s) failed: %m", dict->path); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 return FALSE; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 if (fstat(dict->fd, &st2) < 0) { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 if (errno != ESTALE) |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 i_error("fstat(%s) failed: %m", dict->path); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 return TRUE; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 if (st1.st_ino != st2.st_ino || |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 !CMP_DEV_T(st1.st_dev, st2.st_dev)) { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 /* file changed */ |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 return TRUE; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 return FALSE; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 static int file_dict_refresh(struct file_dict *dict) |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 struct istream *input; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 char *key, *value; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 if (!file_dict_need_refresh(dict)) |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 return 0; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 if (dict->fd != -1) { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 if (close(dict->fd) < 0) |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 i_error("close(%s) failed: %m", dict->path); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 dict->fd = open(dict->path, O_RDONLY); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 if (dict->fd == -1) { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 if (errno == ENOENT) |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 return 0; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 i_error("open(%s) failed: %m", dict->path); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 return -1; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 |
8573
f9166a09423a
Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents:
8432
diff
changeset
|
140 hash_table_clear(dict->hash, TRUE); |
8300
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 p_clear(dict->hash_pool); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 input = i_stream_create_fd(dict->fd, (size_t)-1, FALSE); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 while ((key = i_stream_read_next_line(input)) != NULL && |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 (value = i_stream_read_next_line(input)) != NULL) { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 key = p_strdup(dict->hash_pool, key); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 value = p_strdup(dict->hash_pool, value); |
8573
f9166a09423a
Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents:
8432
diff
changeset
|
148 hash_table_insert(dict->hash, key, value); |
8300
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 i_stream_destroy(&input); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 return 0; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 static int file_dict_lookup(struct dict *_dict, pool_t pool, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 const char *key, const char **value_r) |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 struct file_dict *dict = (struct file_dict *)_dict; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 if (file_dict_refresh(dict) < 0) |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 return -1; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 |
8573
f9166a09423a
Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents:
8432
diff
changeset
|
162 *value_r = p_strdup(pool, hash_table_lookup(dict->hash, key)); |
8300
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 return *value_r == NULL ? 0 : 1; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 static struct dict_iterate_context * |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 file_dict_iterate_init(struct dict *_dict, const char *path, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 enum dict_iterate_flags flags) |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 struct file_dict_iterate_context *ctx; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 struct file_dict *dict = (struct file_dict *)_dict; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 ctx = i_new(struct file_dict_iterate_context, 1); |
8432
8f083c8482e1
Iteration was broken in dict-file.
Timo Sirainen <tss@iki.fi>
parents:
8388
diff
changeset
|
174 ctx->ctx.dict = _dict; |
8300
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 ctx->path = i_strdup(path); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 ctx->path_len = strlen(path); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 ctx->flags = flags; |
8573
f9166a09423a
Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents:
8432
diff
changeset
|
178 ctx->iter = hash_table_iterate_init(dict->hash); |
8300
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 if (file_dict_refresh(dict) < 0) |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 ctx->failed = TRUE; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 return &ctx->ctx; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 static int file_dict_iterate(struct dict_iterate_context *_ctx, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 const char **key_r, const char **value_r) |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 struct file_dict_iterate_context *ctx = |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 (struct file_dict_iterate_context *)_ctx; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 void *key, *value; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 |
8573
f9166a09423a
Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents:
8432
diff
changeset
|
192 while (hash_table_iterate(ctx->iter, &key, &value)) { |
8300
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 if (strncmp(ctx->path, key, ctx->path_len) != 0) |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 continue; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 if ((ctx->flags & DICT_ITERATE_FLAG_RECURSE) == 0 && |
8359 | 197 strchr((char *)key + ctx->path_len, '/') != NULL) |
8300
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 continue; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 *key_r = key; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 *value_r = value; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
202 return 1; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
203 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
204 return ctx->failed ? -1 : 0; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
207 static void file_dict_iterate_deinit(struct dict_iterate_context *_ctx) |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
208 { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
209 struct file_dict_iterate_context *ctx = |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 (struct file_dict_iterate_context *)_ctx; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 |
8573
f9166a09423a
Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents:
8432
diff
changeset
|
212 hash_table_iterate_deinit(&ctx->iter); |
8300
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 i_free(ctx->path); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 i_free(ctx); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
215 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
216 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
217 static struct dict_transaction_context * |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
218 file_dict_transaction_init(struct dict *_dict) |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
219 { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
220 struct file_dict_transaction_context *ctx; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
221 pool_t pool; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
222 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
223 pool = pool_alloconly_create("file dict transaction", 1024); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
224 ctx = p_new(pool, struct file_dict_transaction_context, 1); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
225 ctx->ctx.dict = _dict; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
226 ctx->pool = pool; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
227 p_array_init(&ctx->changes, pool, 32); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
228 return &ctx->ctx; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
230 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
231 static void file_dict_apply_changes(struct file_dict_transaction_context *ctx) |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
232 { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
233 struct file_dict *dict = (struct file_dict *)ctx->ctx.dict; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
234 const char *tmp; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
235 char *key, *value, *old_value; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
236 void *orig_key, *orig_value; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
237 const struct file_dict_change *changes; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
238 unsigned int i, count, new_len; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
239 long long diff; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
240 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
241 changes = array_get(&ctx->changes, &count); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
242 for (i = 0; i < count; i++) { |
8573
f9166a09423a
Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents:
8432
diff
changeset
|
243 if (hash_table_lookup_full(dict->hash, changes[i].key, |
f9166a09423a
Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents:
8432
diff
changeset
|
244 &orig_key, &orig_value)) { |
8300
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
245 key = orig_key; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
246 old_value = orig_value; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
247 } else { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
248 key = NULL; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
249 old_value = NULL; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
250 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
251 value = NULL; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
252 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
253 switch (changes[i].type) { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
254 case FILE_DICT_CHANGE_TYPE_INC: |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
255 diff = old_value == NULL ? 0 : |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
256 strtoll(old_value, NULL, 10); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
257 diff += changes[i].value.diff; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
258 tmp = t_strdup_printf("%lld", diff); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
259 new_len = strlen(tmp); |
8656 | 260 if (old_value == NULL || new_len > strlen(old_value)) |
8300
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
261 value = p_strdup(dict->hash_pool, tmp); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
262 else { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
263 memcpy(old_value, tmp, new_len + 1); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
264 value = old_value; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
265 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
266 /* fall through */ |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
267 case FILE_DICT_CHANGE_TYPE_SET: |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
268 if (key == NULL) |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
269 key = p_strdup(dict->hash_pool, changes[i].key); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
270 if (value == NULL) { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 value = p_strdup(dict->hash_pool, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 changes[i].value.str); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
273 } |
8573
f9166a09423a
Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents:
8432
diff
changeset
|
274 hash_table_update(dict->hash, key, value); |
8300
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
275 break; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
276 case FILE_DICT_CHANGE_TYPE_UNSET: |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
277 if (old_value != NULL) |
8573
f9166a09423a
Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents:
8432
diff
changeset
|
278 hash_table_remove(dict->hash, key); |
8300
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
279 break; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
280 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
281 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
282 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
283 |
9000
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
284 static int fd_copy_permissions(int src_fd, const char *src_path, |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
285 int dest_fd, const char *dest_path) |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
286 { |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
287 struct stat src_st, dest_st; |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
288 |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
289 if (fstat(src_fd, &src_st) < 0) { |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
290 i_error("fstat(%s) failed: %m", src_path); |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
291 return -1; |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
292 } |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
293 if (fstat(dest_fd, &dest_st) < 0) { |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
294 i_error("fstat(%s) failed: %m", dest_path); |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
295 return -1; |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
296 } |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
297 |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
298 if (src_st.st_gid != dest_st.st_gid) { |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
299 if (fchown(dest_fd, (uid_t)-1, src_st.st_gid) < 0) { |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
300 i_error("fchown(%s, -1, %s) failed: %m", |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
301 dest_path, dec2str(src_st.st_gid)); |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
302 return -1; |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
303 } |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
304 } |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
305 |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
306 if ((src_st.st_mode & 07777) != (dest_st.st_mode & 07777)) { |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
307 if (fchmod(dest_fd, src_st.st_mode & 07777) < 0) { |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
308 i_error("fchmod(%s, %o) failed: %m", |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
309 dest_path, (int)(src_st.st_mode & 0777)); |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
310 return -1; |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
311 } |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
312 } |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
313 return 0; |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
314 } |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
315 |
8300
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
316 static int file_dict_write_changes(struct file_dict_transaction_context *ctx) |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
317 { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
318 struct file_dict *dict = (struct file_dict *)ctx->ctx.dict; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
319 struct dotlock *dotlock; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
320 struct hash_iterate_context *iter; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
321 struct ostream *output; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
322 void *key, *value; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
323 int fd; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
324 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
325 fd = file_dotlock_open(&file_dict_dotlock_settings, dict->path, 0, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
326 &dotlock); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
327 if (fd == -1) { |
8996
c34010571c02
dict-file: If file_dotlock_open() fails, log also the path.
Timo Sirainen <tss@iki.fi>
parents:
8693
diff
changeset
|
328 i_error("file dict commit: file_dotlock_open(%s) failed: %m", |
c34010571c02
dict-file: If file_dotlock_open() fails, log also the path.
Timo Sirainen <tss@iki.fi>
parents:
8693
diff
changeset
|
329 dict->path); |
8300
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
330 return -1; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
331 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
332 /* refresh once more now that we're locked */ |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
333 if (file_dict_refresh(dict) < 0) { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
334 file_dotlock_delete(&dotlock); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
335 return -1; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
336 } |
9000
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
337 if (dict->fd != -1) { |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
338 /* preserve the permissions */ |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
339 (void)fd_copy_permissions(dict->fd, dict->path, fd, |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
340 file_dotlock_get_lock_path(dotlock)); |
b02c642b4e51
dict-file: When replacing the dict file, preserve its permissions.
Timo Sirainen <tss@iki.fi>
parents:
8996
diff
changeset
|
341 } |
8300
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
342 file_dict_apply_changes(ctx); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
343 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
344 output = o_stream_create_fd(fd, 0, FALSE); |
8388
4a608f96609b
dict-file: Minor optimization when writing the file.
Timo Sirainen <tss@iki.fi>
parents:
8359
diff
changeset
|
345 o_stream_cork(output); |
8573
f9166a09423a
Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents:
8432
diff
changeset
|
346 iter = hash_table_iterate_init(dict->hash); |
f9166a09423a
Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents:
8432
diff
changeset
|
347 while (hash_table_iterate(iter, &key, &value)) { |
8300
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
348 o_stream_send_str(output, key); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
349 o_stream_send(output, "\n", 1); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
350 o_stream_send_str(output, value); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
351 o_stream_send(output, "\n", 1); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
352 } |
8573
f9166a09423a
Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents:
8432
diff
changeset
|
353 hash_table_iterate_deinit(&iter); |
8300
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
354 o_stream_destroy(&output); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
355 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
356 if (file_dotlock_replace(&dotlock, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
357 DOTLOCK_REPLACE_FLAG_DONT_CLOSE_FD) < 0) { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
358 (void)close(fd); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
359 return -1; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
360 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
361 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
362 if (dict->fd != -1) |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
363 (void)close(dict->fd); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
364 dict->fd = fd; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
365 return 0; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
366 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
367 |
8693
a15d1f8bd289
dict file: Compiler warning fix.
Timo Sirainen <tss@iki.fi>
parents:
8656
diff
changeset
|
368 static int file_dict_transaction_commit(struct dict_transaction_context *_ctx, |
a15d1f8bd289
dict file: Compiler warning fix.
Timo Sirainen <tss@iki.fi>
parents:
8656
diff
changeset
|
369 bool async ATTR_UNUSED) |
8300
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
370 { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
371 struct file_dict_transaction_context *ctx = |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
372 (struct file_dict_transaction_context *)_ctx; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
373 int ret; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
374 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
375 ret = file_dict_write_changes(ctx); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
376 pool_unref(&ctx->pool); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
377 return ret; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
378 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
379 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
380 static void file_dict_transaction_rollback(struct dict_transaction_context *_ctx) |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
381 { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
382 struct file_dict_transaction_context *ctx = |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
383 (struct file_dict_transaction_context *)_ctx; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
384 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
385 pool_unref(&ctx->pool); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
386 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
387 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
388 static void file_dict_set(struct dict_transaction_context *_ctx, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
389 const char *key, const char *value) |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
390 { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
391 struct file_dict_transaction_context *ctx = |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
392 (struct file_dict_transaction_context *)_ctx; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
393 struct file_dict_change *change; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
394 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
395 change = array_append_space(&ctx->changes); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
396 change->type = FILE_DICT_CHANGE_TYPE_SET; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
397 change->key = p_strdup(ctx->pool, key); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
398 change->value.str = p_strdup(ctx->pool, value); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
399 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
400 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
401 static void file_dict_unset(struct dict_transaction_context *_ctx, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
402 const char *key) |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
403 { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
404 struct file_dict_transaction_context *ctx = |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
405 (struct file_dict_transaction_context *)_ctx; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
406 struct file_dict_change *change; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
407 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
408 change = array_append_space(&ctx->changes); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
409 change->type = FILE_DICT_CHANGE_TYPE_UNSET; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
410 change->key = p_strdup(ctx->pool, key); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
411 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
412 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
413 static void |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
414 file_dict_atomic_inc(struct dict_transaction_context *_ctx, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
415 const char *key, long long diff) |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
416 { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
417 struct file_dict_transaction_context *ctx = |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
418 (struct file_dict_transaction_context *)_ctx; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
419 struct file_dict_change *change; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
420 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
421 change = array_append_space(&ctx->changes); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
422 change->type = FILE_DICT_CHANGE_TYPE_INC; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
423 change->key = p_strdup(ctx->pool, key); |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
424 change->value.diff = diff; |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
425 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
426 |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
427 struct dict dict_driver_file = { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
428 MEMBER(name) "file", |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
429 { |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
430 file_dict_init, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
431 file_dict_deinit, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
432 file_dict_lookup, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
433 file_dict_iterate_init, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
434 file_dict_iterate, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
435 file_dict_iterate_deinit, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
436 file_dict_transaction_init, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
437 file_dict_transaction_commit, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
438 file_dict_transaction_rollback, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
439 file_dict_set, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
440 file_dict_unset, |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
441 file_dict_atomic_inc |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
442 } |
9d963e3bbe65
Added a simple flat file dict backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
443 }; |