2 ** Copyright 1998 - 2003 Double Precision, Inc. See COPYING for
3 ** distribution information.
22 void bdbobj_init(struct bdbobj
*obj
)
26 #if DB_VERSION_MAJOR >= 2
31 void bdbobj_close(struct bdbobj
*obj
)
33 #if DB_VERSION_MAJOR >= 2
36 (*obj
->dbc
->c_close
)(obj
->dbc
);
42 #if DB_VERSION_MAJOR < 2
43 (*obj
->dbf
->close
)(obj
->dbf
);
45 (*obj
->dbf
->close
)(obj
->dbf
, 0);
51 int bdbobj_open(struct bdbobj
*obj
, const char *filename
, const char *modestr
)
53 #if DB_VERSION_MAJOR < 2
63 DBTYPE dbtype
=DB_HASH
;
65 for ( ; *modestr
; modestr
++)
69 #if DB_VERSION_MAJOR < 2
77 #if DB_VERSION_MAJOR < 2
85 #if DB_VERSION_MAJOR < 2
86 flags
=O_RDWR
|O_CREAT
|O_TRUNC
;
88 flags
=DB_CREATE
|DB_TRUNCATE
;
106 #if DB_VERSION_MAJOR < 3
107 #if DB_VERSION_MAJOR < 2
108 if ( (obj
->dbf
=dbopen(filename
, flags
, 0664, dbtype
, 0)) != 0)
110 if ( db_open(filename
, dbtype
, flags
, 0664, 0, 0, &obj
->dbf
) == 0)
117 #if DB_VERSION_MAJOR == 4
118 #if DB_VERSION_MINOR == 0
126 #if DB_VERSION_MAJOR == 3
131 if (db_create(&obj
->dbf
, NULL
, 0) == 0)
133 if ( (*obj
->dbf
->open
)(obj
->dbf
,
142 dbtype
, flags
, 0664))
144 (*obj
->dbf
->close
)(obj
->dbf
, DB_NOSYNC
);
154 #if DB_VERSION_MAJOR < 2
155 int fd
=(*obj
->dbf
->fd
)(obj
->dbf
);
159 if ((*obj
->dbf
->fd
)(obj
->dbf
, &fd
))
163 if (fd
>= 0) fcntl(fd
, F_SETFD
, FD_CLOEXEC
);
173 int bdbobj_store(struct bdbobj
*obj
, const char *key
, size_t keylen
,
180 memset(&dkey
, 0, sizeof(dkey
));
181 memset(&dval
, 0, sizeof(dval
));
183 dkey
.data
=(void *)key
;
185 dval
.data
=(void *)data
;
188 #if DB_VERSION_MAJOR < 2
189 return (obj
->has_dbf
? (*obj
->dbf
->put
)(obj
->dbf
, &dkey
, &dval
, (
190 *mode
== 'i' || *mode
== 'I' ? R_NOOVERWRITE
:0)):-1);
192 return (obj
->has_dbf
? (*obj
->dbf
->put
)(obj
->dbf
, 0, &dkey
, &dval
, (
193 *mode
== 'i' || *mode
== 'I' ? DB_NOOVERWRITE
:0)):-1);
197 static char *doquery(struct bdbobj
*obj
,
198 const char *, size_t, size_t *, const char *);
200 char *bdbobj_fetch(struct bdbobj
*obj
, const char *key
, size_t keylen
,
201 size_t *datalen
, const char *options
)
203 char *p
=doquery(obj
, key
, keylen
, datalen
, options
);
208 q
=(char *)malloc(*datalen
);
212 memcpy(q
, p
, *datalen
);
216 char *dofetch(struct bdbobj
*, const char *, size_t, size_t *);
218 static char *doquery(struct bdbobj
*obj
, const char *key
, size_t keylen
,
219 size_t *datalen
, const char *options
)
225 if ((p
=dofetch(obj
, key
, keylen
, datalen
)) != 0)
230 while (keylen
&& key
[--keylen
] != '.')
239 for (i
=0; i
<keylen
; i
++)
240 if (key
[i
] == '@') { ++i
; break; }
243 if ((p
=dofetch(obj
, key
, i
, datalen
)) != 0)
250 for (i
=0; i
<keylen
; i
++)
251 if (key
[i
] == '.') { ++i
; break; }
265 char *dofetch(struct bdbobj
*obj
, const char *key
, size_t keylen
,
270 if (!obj
->has_dbf
) return (0);
272 memset(&dkey
, 0, sizeof(dkey
));
273 memset(&val
, 0, sizeof(val
));
275 dkey
.data
=(void *)key
;
278 #if DB_VERSION_MAJOR < 2
279 if ( (*obj
->dbf
->get
)(obj
->dbf
, &dkey
, &val
, 0)) return (0);
281 if ( (*obj
->dbf
->get
)(obj
->dbf
, 0, &dkey
, &val
, 0)) return (0);
285 return ((char *)val
.data
);
288 int bdbobj_exists(struct bdbobj
*obj
, const char *key
, size_t keylen
)
291 char *p
=doquery(obj
, key
, keylen
, &datalen
, 0);