Merge branch 'debian'
[hcoop/debian/courier-authlib.git] / libs / gdbmobj / gdbmobj.h
CommitLineData
d9898ee8 1#ifndef gdbmobj_h
2#define gdbmobj_h
3
4/*
5** Copyright 1998 - 2007 Double Precision, Inc. See COPYING for
6** distribution information.
7*/
8
d9898ee8 9
b0322a85
CE
10#include "config.h"
11#include <gdbm.h>
d9898ee8 12
13#include <stdlib.h>
14
15#ifdef __cplusplus
16extern "C" {
17#endif
18
19struct gdbmobj {
20 GDBM_FILE dbf;
21 int has_dbf;
22 char *prev_key;
23 size_t prev_key_len;
24 } ;
25
26void gdbmobj_init(struct gdbmobj *);
27
28int gdbmobj_open(struct gdbmobj *, const char *, const char *);
29void gdbmobj_close(struct gdbmobj *);
30
31#define gdbmobj_isopen(p) (!!(p)->has_dbf)
32
33char *gdbmobj_fetch(struct gdbmobj *, const char *, size_t, size_t *, const char *);
34int gdbmobj_exists(struct gdbmobj *, const char *, size_t);
35int gdbmobj_delete(struct gdbmobj *, const char *, size_t);
36int gdbmobj_store(struct gdbmobj *, const char *, size_t, const char *,
37 size_t, const char *);
38
39char *gdbmobj_firstkey(struct gdbmobj *, size_t *, char **, size_t *);
40char *gdbmobj_nextkey(struct gdbmobj *, size_t *, char **, size_t *);
41
42#ifdef __cplusplus
8d138742 43}
d9898ee8 44
45#include <string>
46
47class GdbmObj {
48
49 struct gdbmobj obj;
50
8d138742
CE
51 GdbmObj(const GdbmObj &); /* Undefined */
52 GdbmObj &operator=(const GdbmObj &); /* Undefined */
d9898ee8 53
54public:
55 GdbmObj() { gdbmobj_init(&obj); }
56 ~GdbmObj() { gdbmobj_close(&obj); }
57 int Open(std::string filename, const char *mode)
58 {
59 return ( gdbmobj_open(&obj, filename.c_str(), mode));
60 }
61
62 int IsOpen() { return (gdbmobj_isopen(&obj)); }
63 void Close() { gdbmobj_close(&obj); }
64
65 std::string Fetch(std::string key, std::string mode)
66 {
67 size_t l;
68 char *p=Fetch(key.c_str(), key.size(), l, mode.c_str());
69
70 if (!p) return "";
71
72 std::string v(p, p+l);
73
74 free(p);
75 return v;
76 }
77
78 bool Exists(std::string key)
79 {
80 return !!Exists(key.c_str(), key.size());
81 }
82
83 bool Delete(std::string key)
84 {
85 return !!Delete(key.c_str(), key.size());
86 }
87
88 int Store(std::string key, std::string val, std::string mode)
89 {
90 return Store(key.c_str(), key.size(),
91 val.c_str(), val.size(), mode.c_str());
92 }
93
94 std::string FetchFirstKeyVal(std::string &valRet)
95 {
96 char *key;
97 size_t keyLen;
98 char *val;
99 size_t valLen;
100
101 key=FetchFirstKeyVal(keyLen, val, valLen);
102
103 if (!key)
104 return "";
105
106 std::string r(key, key+keyLen);
107
108 valRet=std::string(val, val+valLen);
109 free(val);
110 return r;
111 }
112
113 std::string FetchNextKeyVal(std::string &valRet)
114 {
115 char *key;
116 size_t keyLen;
117 char *val;
118 size_t valLen;
119
120 key=FetchNextKeyVal(keyLen, val, valLen);
121
122 if (!key)
123 return "";
124
125 std::string r(key, key+keyLen);
126
127 valRet=std::string(val, val+valLen);
128 free(val);
129 return r;
130 }
131
132
133 char *Fetch(const char *key, size_t keylen,
134 size_t &valuelen, const char *mode)
135 {
136 return (gdbmobj_fetch(&obj, key, keylen,
137 &valuelen, mode));
138 }
139
140 int Exists(const char *key, size_t keylen)
141 {
142 return (gdbmobj_exists(&obj, key, keylen));
143 }
144
145 int Delete(const char *key, size_t keylen)
146 {
147 return (gdbmobj_delete(&obj, key, keylen));
148 }
149
150 int Store(const char *key, size_t keylen,
151 const char *value, size_t valuelen,
152 const char *mode)
153 {
154 return (gdbmobj_store(&obj, key, keylen, value,
155 valuelen, mode));
156 }
157
158 char *FetchFirstKeyVal(size_t &keylen, char *&val, size_t &vallen)
159 {
160 return (gdbmobj_firstkey(&obj, &keylen, &val, &vallen));
161 }
162 char *FetchNextKeyVal(size_t &keylen, char *&val, size_t &vallen)
163 {
164 return (gdbmobj_nextkey(&obj, &keylen, &val, &vallen));
165 }
166} ;
167
168#endif
169
170#endif