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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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