Mercurial > dovecot > core-2.2
annotate src/lib-dict/dict-cdb.c @ 22325:e01bc3015b2f
lib-index: Check .log.2 rotation only when syncing
Instead of also whenever appending transactions to .log file. This
shouldn't change the behavior much, and it's needed for the following
change to work correctly.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Tue, 11 Jul 2017 15:33:56 +0300 |
parents | af8d96508fad |
children | cb108f786fb4 |
rev | line source |
---|---|
21390
2e2563132d5f
Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
20386
diff
changeset
|
1 /* Copyright (c) 2013-2017 Dovecot authors, see the included COPYING file */ |
15665
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #ifdef BUILD_CDB |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "dict-private.h" |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include <string.h> |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include <cdb.h> |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #include <unistd.h> |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 #include <fcntl.h> |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 #define CDB_WITH_NULL 1 |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 #define CDB_WITHOUT_NULL 2 |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 struct cdb_dict { |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 struct dict dict; |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 struct cdb cdb; |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 char *path; |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 int fd, flag; |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 }; |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 static void cdb_dict_deinit(struct dict *_dict); |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 static int |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 cdb_dict_init(struct dict *driver, const char *uri, |
22102
af8d96508fad
lib-dict: Update cdb_dict_init to match with new API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21390
diff
changeset
|
27 const struct dict_settings *set ATTR_UNUSED, |
15665
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 struct dict **dict_r, const char **error_r) |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 { |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 struct cdb_dict *dict; |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 dict = i_new(struct cdb_dict, 1); |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 dict->dict = *driver; |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 dict->path = i_strdup(uri); |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 dict->flag = CDB_WITH_NULL | CDB_WITHOUT_NULL; |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 /* initialize cdb to 0 (unallocated) */ |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 memset(&dict->cdb, 0, sizeof(struct cdb)); |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 dict->fd = open(dict->path, O_RDONLY); |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 if (dict->fd == -1) { |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 *error_r = t_strdup_printf("open(%s) failed: %m", dict->path); |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 cdb_dict_deinit(&dict->dict); |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 return -1; |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 } |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 #ifdef TINYCDB_VERSION |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 if (cdb_init(&dict->cdb, dict->fd) < 0) { |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 *error_r = t_strdup_printf("cdb_init(%s) failed: %m", dict->path); |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 cdb_dict_deinit(&dict->dict); |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 return -1; |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 } |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 #else |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 cdb_init(&dict->cdb, dict->fd); |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 #endif |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 *dict_r = &dict->dict; |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 return 0; |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 } |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 static void cdb_dict_deinit(struct dict *_dict) |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 { |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 struct cdb_dict *dict = (struct cdb_dict *)_dict; |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 /* we can safely deinit unallocated cdb */ |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 cdb_free(&dict->cdb); |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 if (dict->fd != -1) { |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 if (close(dict->fd) < 0) |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 i_error("close(%s) failed: %m", dict->path); |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 } |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 i_free(dict->path); |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 i_free(dict); |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 } |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 static int cdb_dict_lookup(struct dict *_dict, pool_t pool, |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 const char *key, const char **value_r) |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 { |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 struct cdb_dict *dict = (struct cdb_dict *)_dict; |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 unsigned datalen; |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 int ret = 0; |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 char *data; |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 /* keys and values may be null terminated... */ |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 if ((dict->flag & CDB_WITH_NULL) != 0) { |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 ret = cdb_find(&dict->cdb, key, (unsigned)strlen(key)+1); |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 if (ret > 0) |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 dict->flag &= ~CDB_WITHOUT_NULL; |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 } |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 /* ...or not */ |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 if (ret == 0 && (dict->flag & CDB_WITHOUT_NULL) != 0) { |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 ret = cdb_find(&dict->cdb, key, (unsigned)strlen(key)); |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 if (ret > 0) |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 dict->flag &= ~CDB_WITH_NULL; |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 } |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 if (ret <= 0) { |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 *value_r = NULL; |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 /* something bad with db */ |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 if (ret < 0) { |
15666
87a709eb7b28
dict-cdb: Handle cdb_read() errors.
Timo Sirainen <tss@iki.fi>
parents:
15665
diff
changeset
|
103 i_error("cdb_find(%s) failed: %m", dict->path); |
15665
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 return -1; |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 } |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 /* found nothing */ |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 return 0; |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 } |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 datalen = cdb_datalen(&dict->cdb); |
15666
87a709eb7b28
dict-cdb: Handle cdb_read() errors.
Timo Sirainen <tss@iki.fi>
parents:
15665
diff
changeset
|
111 data = p_malloc(pool, datalen + 1); |
87a709eb7b28
dict-cdb: Handle cdb_read() errors.
Timo Sirainen <tss@iki.fi>
parents:
15665
diff
changeset
|
112 if (cdb_read(&dict->cdb, data, datalen, cdb_datapos(&dict->cdb)) < 0) { |
87a709eb7b28
dict-cdb: Handle cdb_read() errors.
Timo Sirainen <tss@iki.fi>
parents:
15665
diff
changeset
|
113 i_error("cdb_read(%s) failed: %m", dict->path); |
87a709eb7b28
dict-cdb: Handle cdb_read() errors.
Timo Sirainen <tss@iki.fi>
parents:
15665
diff
changeset
|
114 return -1; |
87a709eb7b28
dict-cdb: Handle cdb_read() errors.
Timo Sirainen <tss@iki.fi>
parents:
15665
diff
changeset
|
115 } |
15665
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 *value_r = data; |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 return 1; |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 } |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 struct dict dict_driver_cdb = { |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 .name = "cdb", |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 { |
20386
564a32262929
lib-dict: Explicitly specify used dict_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
123 .init = cdb_dict_init, |
564a32262929
lib-dict: Explicitly specify used dict_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
124 .deinit = cdb_dict_deinit, |
564a32262929
lib-dict: Explicitly specify used dict_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
125 .lookup = cdb_dict_lookup, |
15665
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 } |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 }; |
2c249941f9c2
dict: Added support for cdb backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 #endif |