Statistics
| Branch: | Tag: | Revision:

root / lib / filter-kvs.c @ 5c9fbf02

History | View | Annotate | Download (3.2 kB)

1 761f2955 Hiroyuki Yamamoto
#include <glib.h>
2 761f2955 Hiroyuki Yamamoto
3 761f2955 Hiroyuki Yamamoto
#include "filter-kvs.h"
4 761f2955 Hiroyuki Yamamoto
5 761f2955 Hiroyuki Yamamoto
struct _XFilterKVS
6 761f2955 Hiroyuki Yamamoto
{
7 761f2955 Hiroyuki Yamamoto
        char *dbfile;
8 761f2955 Hiroyuki Yamamoto
        void *dbhandle;
9 761f2955 Hiroyuki Yamamoto
};
10 761f2955 Hiroyuki Yamamoto
11 761f2955 Hiroyuki Yamamoto
static XFilterKVSEngine ke;
12 761f2955 Hiroyuki Yamamoto
13 761f2955 Hiroyuki Yamamoto
14 761f2955 Hiroyuki Yamamoto
int xfilter_kvs_set_engine(XFilterKVSEngine *engine)
15 761f2955 Hiroyuki Yamamoto
{
16 761f2955 Hiroyuki Yamamoto
        g_return_val_if_fail(engine != NULL, -1);
17 761f2955 Hiroyuki Yamamoto
18 761f2955 Hiroyuki Yamamoto
        ke = *engine;
19 761f2955 Hiroyuki Yamamoto
20 761f2955 Hiroyuki Yamamoto
        return 0;
21 761f2955 Hiroyuki Yamamoto
}
22 761f2955 Hiroyuki Yamamoto
23 761f2955 Hiroyuki Yamamoto
XFilterKVS *xfilter_kvs_new(const char *dbfile, void *dbhandle)
24 761f2955 Hiroyuki Yamamoto
{
25 761f2955 Hiroyuki Yamamoto
        XFilterKVS *kvs;
26 761f2955 Hiroyuki Yamamoto
27 761f2955 Hiroyuki Yamamoto
        kvs = g_new(XFilterKVS, 1);
28 761f2955 Hiroyuki Yamamoto
        kvs->dbfile = g_strdup(dbfile);
29 761f2955 Hiroyuki Yamamoto
        kvs->dbhandle = dbhandle;
30 761f2955 Hiroyuki Yamamoto
31 761f2955 Hiroyuki Yamamoto
        return kvs;
32 761f2955 Hiroyuki Yamamoto
}
33 761f2955 Hiroyuki Yamamoto
34 761f2955 Hiroyuki Yamamoto
const char *xfilter_kvs_get_file(XFilterKVS *kvs)
35 761f2955 Hiroyuki Yamamoto
{
36 761f2955 Hiroyuki Yamamoto
        g_return_val_if_fail(kvs != NULL, NULL);
37 761f2955 Hiroyuki Yamamoto
        return kvs->dbfile;
38 761f2955 Hiroyuki Yamamoto
}
39 761f2955 Hiroyuki Yamamoto
40 761f2955 Hiroyuki Yamamoto
void *xfilter_kvs_get_handle(XFilterKVS *kvs)
41 761f2955 Hiroyuki Yamamoto
{
42 761f2955 Hiroyuki Yamamoto
        g_return_val_if_fail(kvs != NULL, NULL);
43 761f2955 Hiroyuki Yamamoto
        return kvs->dbhandle;
44 761f2955 Hiroyuki Yamamoto
}
45 761f2955 Hiroyuki Yamamoto
46 761f2955 Hiroyuki Yamamoto
XFilterKVS *xfilter_kvs_open(const char *dbfile)
47 761f2955 Hiroyuki Yamamoto
{
48 761f2955 Hiroyuki Yamamoto
        g_return_val_if_fail(ke.open != NULL, NULL);
49 761f2955 Hiroyuki Yamamoto
        return ke.open(dbfile);
50 761f2955 Hiroyuki Yamamoto
}
51 761f2955 Hiroyuki Yamamoto
52 761f2955 Hiroyuki Yamamoto
int xfilter_kvs_close(XFilterKVS *kvs)
53 761f2955 Hiroyuki Yamamoto
{
54 761f2955 Hiroyuki Yamamoto
        g_return_val_if_fail(kvs != NULL, -1);
55 761f2955 Hiroyuki Yamamoto
        return ke.close(kvs);
56 761f2955 Hiroyuki Yamamoto
}
57 761f2955 Hiroyuki Yamamoto
58 761f2955 Hiroyuki Yamamoto
int xfilter_kvs_insert(XFilterKVS *kvs, const char *key, void *value, int size)
59 761f2955 Hiroyuki Yamamoto
{
60 761f2955 Hiroyuki Yamamoto
        g_return_val_if_fail(kvs != NULL, -1);
61 761f2955 Hiroyuki Yamamoto
        return ke.insert(kvs, key, value, size);
62 761f2955 Hiroyuki Yamamoto
}
63 761f2955 Hiroyuki Yamamoto
64 761f2955 Hiroyuki Yamamoto
int xfilter_kvs_delete(XFilterKVS *kvs, const char *key)
65 761f2955 Hiroyuki Yamamoto
{
66 761f2955 Hiroyuki Yamamoto
        g_return_val_if_fail(kvs != NULL, -1);
67 761f2955 Hiroyuki Yamamoto
        return ke.delete(kvs, key);
68 761f2955 Hiroyuki Yamamoto
}
69 761f2955 Hiroyuki Yamamoto
70 761f2955 Hiroyuki Yamamoto
int xfilter_kvs_update(XFilterKVS *kvs, const char *key, void *value, int size)
71 761f2955 Hiroyuki Yamamoto
{
72 761f2955 Hiroyuki Yamamoto
        g_return_val_if_fail(kvs != NULL, -1);
73 761f2955 Hiroyuki Yamamoto
        return ke.update(kvs, key, value, size);
74 761f2955 Hiroyuki Yamamoto
}
75 761f2955 Hiroyuki Yamamoto
76 761f2955 Hiroyuki Yamamoto
int xfilter_kvs_fetch(XFilterKVS *kvs, const char *key, void *vbuf, int vsize)
77 761f2955 Hiroyuki Yamamoto
{
78 761f2955 Hiroyuki Yamamoto
        g_return_val_if_fail(kvs != NULL, -1);
79 761f2955 Hiroyuki Yamamoto
        return ke.fetch(kvs, key, vbuf, vsize);
80 761f2955 Hiroyuki Yamamoto
}
81 761f2955 Hiroyuki Yamamoto
82 b45b0705 Hiroyuki Yamamoto
int xfilter_kvs_get_record_size(XFilterKVS *kvs)
83 b45b0705 Hiroyuki Yamamoto
{
84 b45b0705 Hiroyuki Yamamoto
        g_return_val_if_fail(kvs != NULL, -1);
85 b45b0705 Hiroyuki Yamamoto
        return ke.size(kvs);
86 b45b0705 Hiroyuki Yamamoto
}
87 b45b0705 Hiroyuki Yamamoto
88 29dd8dfb Hiroyuki Yamamoto
int xfilter_kvs_foreach(XFilterKVS *kvs, XFilterKVSForeachFunc func, void *data)
89 29dd8dfb Hiroyuki Yamamoto
{
90 29dd8dfb Hiroyuki Yamamoto
        g_return_val_if_fail(kvs != NULL, -1);
91 29dd8dfb Hiroyuki Yamamoto
        return ke.foreach(kvs, func, data);
92 29dd8dfb Hiroyuki Yamamoto
}
93 29dd8dfb Hiroyuki Yamamoto
94 761f2955 Hiroyuki Yamamoto
int xfilter_kvs_fetch_int(XFilterKVS *kvs, const char *key)
95 761f2955 Hiroyuki Yamamoto
{
96 761f2955 Hiroyuki Yamamoto
        int ival = 0;
97 761f2955 Hiroyuki Yamamoto
        int size;
98 761f2955 Hiroyuki Yamamoto
        char vbuf[4];
99 761f2955 Hiroyuki Yamamoto
100 761f2955 Hiroyuki Yamamoto
        g_return_val_if_fail(kvs != NULL, -1);
101 761f2955 Hiroyuki Yamamoto
102 761f2955 Hiroyuki Yamamoto
        size = xfilter_kvs_fetch(kvs, key, vbuf, 4);
103 761f2955 Hiroyuki Yamamoto
        if (size == 4) {
104 761f2955 Hiroyuki Yamamoto
                ival = *(int *)vbuf;
105 761f2955 Hiroyuki Yamamoto
                return ival;
106 761f2955 Hiroyuki Yamamoto
        }
107 761f2955 Hiroyuki Yamamoto
108 761f2955 Hiroyuki Yamamoto
        return 0;
109 761f2955 Hiroyuki Yamamoto
}
110 761f2955 Hiroyuki Yamamoto
111 761f2955 Hiroyuki Yamamoto
int xfilter_kvs_increment(XFilterKVS *kvs, const char *key, int num)
112 761f2955 Hiroyuki Yamamoto
{
113 761f2955 Hiroyuki Yamamoto
        int ival = 0;
114 761f2955 Hiroyuki Yamamoto
        int size;
115 761f2955 Hiroyuki Yamamoto
        char vbuf[4];
116 761f2955 Hiroyuki Yamamoto
117 761f2955 Hiroyuki Yamamoto
        g_return_val_if_fail(kvs != NULL, -1);
118 761f2955 Hiroyuki Yamamoto
119 761f2955 Hiroyuki Yamamoto
        size = xfilter_kvs_fetch(kvs, key, vbuf, 4);
120 761f2955 Hiroyuki Yamamoto
        if (size == 4) {
121 761f2955 Hiroyuki Yamamoto
                ival = *(int *)vbuf;
122 761f2955 Hiroyuki Yamamoto
                ival += num;
123 761f2955 Hiroyuki Yamamoto
                return xfilter_kvs_update(kvs, key, (char *)&ival, 4);
124 761f2955 Hiroyuki Yamamoto
        } else if (size <= 0) {
125 761f2955 Hiroyuki Yamamoto
                return xfilter_kvs_insert(kvs, key, (char *)&num, 4);
126 761f2955 Hiroyuki Yamamoto
        }
127 761f2955 Hiroyuki Yamamoto
128 761f2955 Hiroyuki Yamamoto
        return -1;
129 761f2955 Hiroyuki Yamamoto
}
130 761f2955 Hiroyuki Yamamoto
131 761f2955 Hiroyuki Yamamoto
int xfilter_kvs_decrement(XFilterKVS *kvs, const char *key, int num)
132 761f2955 Hiroyuki Yamamoto
{
133 761f2955 Hiroyuki Yamamoto
        int ival = 0;
134 761f2955 Hiroyuki Yamamoto
        int size;
135 761f2955 Hiroyuki Yamamoto
        char vbuf[4];
136 761f2955 Hiroyuki Yamamoto
137 761f2955 Hiroyuki Yamamoto
        g_return_val_if_fail(kvs != NULL, -1);
138 761f2955 Hiroyuki Yamamoto
139 761f2955 Hiroyuki Yamamoto
        size = xfilter_kvs_fetch(kvs, key, vbuf, 4);
140 761f2955 Hiroyuki Yamamoto
        if (size == 4) {
141 761f2955 Hiroyuki Yamamoto
                ival = *(int *)vbuf;
142 761f2955 Hiroyuki Yamamoto
                ival -= num;
143 761f2955 Hiroyuki Yamamoto
                if (ival <= 0)
144 761f2955 Hiroyuki Yamamoto
                        return xfilter_kvs_delete(kvs, key);
145 761f2955 Hiroyuki Yamamoto
                else
146 761f2955 Hiroyuki Yamamoto
                        return xfilter_kvs_update(kvs, key, (char *)&ival, 4);
147 761f2955 Hiroyuki Yamamoto
        }
148 761f2955 Hiroyuki Yamamoto
149 761f2955 Hiroyuki Yamamoto
        return -1;
150 761f2955 Hiroyuki Yamamoto
}
151 29dd8dfb Hiroyuki Yamamoto
152 29dd8dfb Hiroyuki Yamamoto
static int count_func(XFilterKVS *kvs, const char *key, void *value, int size, void *data)
153 29dd8dfb Hiroyuki Yamamoto
{
154 af7ecefa Hiroyuki Yamamoto
        int *sum = (int *)data;
155 29dd8dfb Hiroyuki Yamamoto
156 29dd8dfb Hiroyuki Yamamoto
        if (size == 4) {
157 29dd8dfb Hiroyuki Yamamoto
                *sum += *(int *)value;
158 29dd8dfb Hiroyuki Yamamoto
        }
159 29dd8dfb Hiroyuki Yamamoto
160 29dd8dfb Hiroyuki Yamamoto
        return 0;
161 29dd8dfb Hiroyuki Yamamoto
}
162 29dd8dfb Hiroyuki Yamamoto
163 29dd8dfb Hiroyuki Yamamoto
int xfilter_kvs_count_sum(XFilterKVS *kvs)
164 29dd8dfb Hiroyuki Yamamoto
{
165 29dd8dfb Hiroyuki Yamamoto
        int sum = 0;
166 29dd8dfb Hiroyuki Yamamoto
167 29dd8dfb Hiroyuki Yamamoto
        g_return_val_if_fail(kvs != NULL, -1);
168 29dd8dfb Hiroyuki Yamamoto
169 29dd8dfb Hiroyuki Yamamoto
        xfilter_kvs_foreach(kvs, count_func, &sum);
170 29dd8dfb Hiroyuki Yamamoto
        return sum;
171 29dd8dfb Hiroyuki Yamamoto
}