Statistics
| Branch: | Tag: | Revision:

root / lib / filter-kvs-gdbm.c @ master

History | View | Annotate | Download (3.8 kB)

1 351eb643 Hiroyuki Yamamoto
/* SylFilter - a message filter
2 351eb643 Hiroyuki Yamamoto
 *
3 351eb643 Hiroyuki Yamamoto
 * Copyright (C) 2011 Hiroyuki Yamamoto
4 351eb643 Hiroyuki Yamamoto
 * Copyright (C) 2011 Sylpheed Development Team
5 351eb643 Hiroyuki Yamamoto
 */
6 351eb643 Hiroyuki Yamamoto
7 351eb643 Hiroyuki Yamamoto
#include "config.h"
8 351eb643 Hiroyuki Yamamoto
9 351eb643 Hiroyuki Yamamoto
#ifdef USE_GDBM
10 351eb643 Hiroyuki Yamamoto
11 351eb643 Hiroyuki Yamamoto
#include <stdio.h>
12 351eb643 Hiroyuki Yamamoto
#include <string.h>
13 351eb643 Hiroyuki Yamamoto
#include <stdlib.h>
14 351eb643 Hiroyuki Yamamoto
#include <glib.h>
15 351eb643 Hiroyuki Yamamoto
#include <gdbm.h>
16 351eb643 Hiroyuki Yamamoto
17 351eb643 Hiroyuki Yamamoto
#include "filter-kvs.h"
18 351eb643 Hiroyuki Yamamoto
#include "filter-kvs-gdbm.h"
19 351eb643 Hiroyuki Yamamoto
20 351eb643 Hiroyuki Yamamoto
static XFilterKVS *xf_gdbm_open(const char *dbfile);
21 351eb643 Hiroyuki Yamamoto
static int xf_gdbm_close(XFilterKVS *kvs);
22 351eb643 Hiroyuki Yamamoto
static int xf_gdbm_insert(XFilterKVS *kvs, const char *key, void *value, int size);
23 351eb643 Hiroyuki Yamamoto
static int xf_gdbm_delete(XFilterKVS *kvs, const char *key);
24 351eb643 Hiroyuki Yamamoto
static int xf_gdbm_update(XFilterKVS *kvs, const char *key, void *value, int size);
25 351eb643 Hiroyuki Yamamoto
static int xf_gdbm_fetch(XFilterKVS *kvs, const char *key, void *vbuf, int vsize);
26 351eb643 Hiroyuki Yamamoto
static int xf_gdbm_size(XFilterKVS *kvs);
27 351eb643 Hiroyuki Yamamoto
static int xf_gdbm_foreach(XFilterKVS *kvs, XFilterKVSForeachFunc func, void *data);
28 351eb643 Hiroyuki Yamamoto
29 351eb643 Hiroyuki Yamamoto
30 351eb643 Hiroyuki Yamamoto
int xfilter_kvs_gdbm_set_engine(void)
31 351eb643 Hiroyuki Yamamoto
{
32 351eb643 Hiroyuki Yamamoto
        XFilterKVSEngine engine = {
33 351eb643 Hiroyuki Yamamoto
                xf_gdbm_open,
34 351eb643 Hiroyuki Yamamoto
                xf_gdbm_close,
35 351eb643 Hiroyuki Yamamoto
                xf_gdbm_insert,
36 351eb643 Hiroyuki Yamamoto
                xf_gdbm_delete,
37 351eb643 Hiroyuki Yamamoto
                xf_gdbm_update,
38 351eb643 Hiroyuki Yamamoto
                xf_gdbm_fetch,
39 351eb643 Hiroyuki Yamamoto
                NULL,
40 351eb643 Hiroyuki Yamamoto
                NULL,
41 351eb643 Hiroyuki Yamamoto
                xf_gdbm_size,
42 351eb643 Hiroyuki Yamamoto
                xf_gdbm_foreach
43 351eb643 Hiroyuki Yamamoto
        };
44 351eb643 Hiroyuki Yamamoto
45 351eb643 Hiroyuki Yamamoto
        return xfilter_kvs_set_engine(&engine);
46 351eb643 Hiroyuki Yamamoto
}
47 351eb643 Hiroyuki Yamamoto
48 351eb643 Hiroyuki Yamamoto
static XFilterKVS *xf_gdbm_open(const char *dbfile)
49 351eb643 Hiroyuki Yamamoto
{
50 351eb643 Hiroyuki Yamamoto
        GDBM_FILE dbf;
51 351eb643 Hiroyuki Yamamoto
52 351eb643 Hiroyuki Yamamoto
        dbf = gdbm_open((char *)dbfile, 0, GDBM_WRCREAT, 0600, 0);
53 351eb643 Hiroyuki Yamamoto
        if (!dbf) {
54 351eb643 Hiroyuki Yamamoto
                fprintf(stderr, "xf_gdbm_open: %s: %s\n",
55 351eb643 Hiroyuki Yamamoto
                        dbfile, gdbm_strerror(gdbm_errno));
56 351eb643 Hiroyuki Yamamoto
                return NULL;
57 351eb643 Hiroyuki Yamamoto
        }
58 351eb643 Hiroyuki Yamamoto
        return xfilter_kvs_new(dbfile, (void *)dbf);
59 351eb643 Hiroyuki Yamamoto
}
60 351eb643 Hiroyuki Yamamoto
61 351eb643 Hiroyuki Yamamoto
static int xf_gdbm_close(XFilterKVS *kvs)
62 351eb643 Hiroyuki Yamamoto
{
63 351eb643 Hiroyuki Yamamoto
        gdbm_close((GDBM_FILE)xfilter_kvs_get_handle(kvs));
64 351eb643 Hiroyuki Yamamoto
        return 0;
65 351eb643 Hiroyuki Yamamoto
}
66 351eb643 Hiroyuki Yamamoto
67 351eb643 Hiroyuki Yamamoto
static int xf_gdbm_insert(XFilterKVS *kvs, const char *key, void *value, int size)
68 351eb643 Hiroyuki Yamamoto
{
69 351eb643 Hiroyuki Yamamoto
        GDBM_FILE dbf;
70 351eb643 Hiroyuki Yamamoto
        datum dkey, dvalue;
71 351eb643 Hiroyuki Yamamoto
72 351eb643 Hiroyuki Yamamoto
        dbf = (GDBM_FILE)xfilter_kvs_get_handle(kvs);
73 351eb643 Hiroyuki Yamamoto
74 351eb643 Hiroyuki Yamamoto
        dkey.dptr = (char *)key;
75 351eb643 Hiroyuki Yamamoto
        dkey.dsize = strlen(key);
76 351eb643 Hiroyuki Yamamoto
        dvalue.dptr = (char *)value;
77 351eb643 Hiroyuki Yamamoto
        dvalue.dsize = size;
78 351eb643 Hiroyuki Yamamoto
        if (gdbm_store(dbf, dkey, dvalue, GDBM_INSERT) != 0)
79 351eb643 Hiroyuki Yamamoto
                return -1;
80 351eb643 Hiroyuki Yamamoto
81 351eb643 Hiroyuki Yamamoto
        return 0;
82 351eb643 Hiroyuki Yamamoto
}
83 351eb643 Hiroyuki Yamamoto
84 351eb643 Hiroyuki Yamamoto
static int xf_gdbm_delete(XFilterKVS *kvs, const char *key)
85 351eb643 Hiroyuki Yamamoto
{
86 351eb643 Hiroyuki Yamamoto
        GDBM_FILE dbf;
87 351eb643 Hiroyuki Yamamoto
        datum dkey;
88 351eb643 Hiroyuki Yamamoto
89 351eb643 Hiroyuki Yamamoto
        dbf = (GDBM_FILE)xfilter_kvs_get_handle(kvs);
90 351eb643 Hiroyuki Yamamoto
91 351eb643 Hiroyuki Yamamoto
        dkey.dptr = (char *)key;
92 351eb643 Hiroyuki Yamamoto
        dkey.dsize = strlen(key);
93 351eb643 Hiroyuki Yamamoto
        if (gdbm_delete(dbf, dkey) != 0)
94 351eb643 Hiroyuki Yamamoto
                return -1;
95 351eb643 Hiroyuki Yamamoto
96 351eb643 Hiroyuki Yamamoto
        return 0;
97 351eb643 Hiroyuki Yamamoto
}
98 351eb643 Hiroyuki Yamamoto
99 351eb643 Hiroyuki Yamamoto
static int xf_gdbm_update(XFilterKVS *kvs, const char *key, void *value, int size)
100 351eb643 Hiroyuki Yamamoto
{
101 351eb643 Hiroyuki Yamamoto
        GDBM_FILE dbf;
102 351eb643 Hiroyuki Yamamoto
        datum dkey, dvalue;
103 351eb643 Hiroyuki Yamamoto
104 351eb643 Hiroyuki Yamamoto
        dbf = (GDBM_FILE)xfilter_kvs_get_handle(kvs);
105 351eb643 Hiroyuki Yamamoto
106 351eb643 Hiroyuki Yamamoto
        dkey.dptr = (char *)key;
107 351eb643 Hiroyuki Yamamoto
        dkey.dsize = strlen(key);
108 351eb643 Hiroyuki Yamamoto
        dvalue.dptr = (char *)value;
109 351eb643 Hiroyuki Yamamoto
        dvalue.dsize = size;
110 351eb643 Hiroyuki Yamamoto
        if (gdbm_store(dbf, dkey, dvalue, GDBM_REPLACE) != 0)
111 351eb643 Hiroyuki Yamamoto
                return -1;
112 351eb643 Hiroyuki Yamamoto
113 351eb643 Hiroyuki Yamamoto
        return 0;
114 351eb643 Hiroyuki Yamamoto
}
115 351eb643 Hiroyuki Yamamoto
116 351eb643 Hiroyuki Yamamoto
static int xf_gdbm_fetch(XFilterKVS *kvs, const char *key, void *vbuf, int vsize)
117 351eb643 Hiroyuki Yamamoto
{
118 351eb643 Hiroyuki Yamamoto
        GDBM_FILE dbf;
119 351eb643 Hiroyuki Yamamoto
        datum dkey, dvalue;
120 351eb643 Hiroyuki Yamamoto
121 351eb643 Hiroyuki Yamamoto
        dbf = (GDBM_FILE)xfilter_kvs_get_handle(kvs);
122 351eb643 Hiroyuki Yamamoto
123 351eb643 Hiroyuki Yamamoto
        dkey.dptr = (char *)key;
124 351eb643 Hiroyuki Yamamoto
        dkey.dsize = strlen(key);
125 351eb643 Hiroyuki Yamamoto
        dvalue = gdbm_fetch(dbf, dkey);
126 351eb643 Hiroyuki Yamamoto
        if (!dvalue.dptr)
127 351eb643 Hiroyuki Yamamoto
                return -1;
128 351eb643 Hiroyuki Yamamoto
129 351eb643 Hiroyuki Yamamoto
        memcpy(vbuf, dvalue.dptr, MIN(vsize, dvalue.dsize));
130 351eb643 Hiroyuki Yamamoto
        free(dvalue.dptr);
131 351eb643 Hiroyuki Yamamoto
132 351eb643 Hiroyuki Yamamoto
        return dvalue.dsize;
133 351eb643 Hiroyuki Yamamoto
}
134 351eb643 Hiroyuki Yamamoto
135 351eb643 Hiroyuki Yamamoto
static int xf_gdbm_size(XFilterKVS *kvs)
136 351eb643 Hiroyuki Yamamoto
{
137 351eb643 Hiroyuki Yamamoto
        GDBM_FILE dbf;
138 351eb643 Hiroyuki Yamamoto
        datum dkey, nkey;
139 351eb643 Hiroyuki Yamamoto
        int size = 0;
140 351eb643 Hiroyuki Yamamoto
141 351eb643 Hiroyuki Yamamoto
        dbf = (GDBM_FILE)xfilter_kvs_get_handle(kvs);
142 351eb643 Hiroyuki Yamamoto
143 351eb643 Hiroyuki Yamamoto
        for (dkey = gdbm_firstkey(dbf); dkey.dptr; size++) {
144 351eb643 Hiroyuki Yamamoto
                nkey = gdbm_nextkey(dbf, dkey);
145 351eb643 Hiroyuki Yamamoto
                free(dkey.dptr);
146 351eb643 Hiroyuki Yamamoto
                dkey = nkey;
147 351eb643 Hiroyuki Yamamoto
        }
148 351eb643 Hiroyuki Yamamoto
149 351eb643 Hiroyuki Yamamoto
        return size;
150 351eb643 Hiroyuki Yamamoto
}
151 351eb643 Hiroyuki Yamamoto
152 351eb643 Hiroyuki Yamamoto
static int xf_gdbm_foreach(XFilterKVS *kvs, XFilterKVSForeachFunc func, void *data)
153 351eb643 Hiroyuki Yamamoto
{
154 351eb643 Hiroyuki Yamamoto
        GDBM_FILE dbf;
155 351eb643 Hiroyuki Yamamoto
        datum dkey, dvalue, nkey;
156 351eb643 Hiroyuki Yamamoto
        char key[1024];
157 351eb643 Hiroyuki Yamamoto
        int ksize;
158 351eb643 Hiroyuki Yamamoto
159 351eb643 Hiroyuki Yamamoto
        dbf = (GDBM_FILE)xfilter_kvs_get_handle(kvs);
160 351eb643 Hiroyuki Yamamoto
161 351eb643 Hiroyuki Yamamoto
        dkey = gdbm_firstkey(dbf);
162 351eb643 Hiroyuki Yamamoto
        for (dkey = gdbm_firstkey(dbf); dkey.dptr; ) {
163 351eb643 Hiroyuki Yamamoto
                int r;
164 351eb643 Hiroyuki Yamamoto
165 351eb643 Hiroyuki Yamamoto
                dvalue = gdbm_fetch(dbf, dkey);
166 351eb643 Hiroyuki Yamamoto
                if (!dvalue.dptr) {
167 351eb643 Hiroyuki Yamamoto
                        free(dkey.dptr);
168 351eb643 Hiroyuki Yamamoto
                        break;
169 351eb643 Hiroyuki Yamamoto
                }
170 351eb643 Hiroyuki Yamamoto
                ksize = MIN(sizeof(key) - 1, dkey.dsize);
171 351eb643 Hiroyuki Yamamoto
                memcpy(key, dkey.dptr, ksize);
172 351eb643 Hiroyuki Yamamoto
                key[ksize] = '\0';
173 351eb643 Hiroyuki Yamamoto
                r = func(kvs, key, dvalue.dptr, dvalue.dsize, data);
174 351eb643 Hiroyuki Yamamoto
                if (r < 0) {
175 351eb643 Hiroyuki Yamamoto
                        free(dvalue.dptr);
176 351eb643 Hiroyuki Yamamoto
                        free(dkey.dptr);
177 351eb643 Hiroyuki Yamamoto
                        break;
178 351eb643 Hiroyuki Yamamoto
                }
179 351eb643 Hiroyuki Yamamoto
                nkey = gdbm_nextkey(dbf, dkey);
180 351eb643 Hiroyuki Yamamoto
                free(dvalue.dptr);
181 351eb643 Hiroyuki Yamamoto
                free(dkey.dptr);
182 351eb643 Hiroyuki Yamamoto
183 351eb643 Hiroyuki Yamamoto
                dkey = nkey;
184 351eb643 Hiroyuki Yamamoto
        }
185 351eb643 Hiroyuki Yamamoto
186 351eb643 Hiroyuki Yamamoto
        return 0;
187 351eb643 Hiroyuki Yamamoto
}
188 351eb643 Hiroyuki Yamamoto
189 351eb643 Hiroyuki Yamamoto
#endif /* USE_GDBM */