Imported Upstream version 0.66.1
[hcoop/debian/courier-authlib.git] / libs / bdbobj / bdbobj2.c
1 /*
2 ** Copyright 1998 - 1999 Double Precision, Inc. See COPYING for
3 ** distribution information.
4 */
5
6 #include "config.h"
7 #include <string.h>
8 #include <stdlib.h>
9 #include "bdbobj.h"
10
11 char *bdbobj_firstkey(struct bdbobj *obj, size_t *keylen, char **val,
12 size_t *vallen)
13 {
14 DBT key, value;
15
16 if (!obj->has_dbf) return (0);
17
18 memset(&key, 0, sizeof(key));
19 memset(&value, 0, sizeof(value));
20
21 #if DB_VERSION_MAJOR < 2
22 if ((*obj->dbf->seq)(obj->dbf, &key, &value, R_FIRST)) return (0);
23 #else
24 if (obj->has_dbc)
25 {
26 (*obj->dbc->c_close)(obj->dbc);
27 obj->has_dbc=0;
28 }
29
30 #if DB_VERSION_MAJOR > 2
31 if ((*obj->dbf->cursor)(obj->dbf, 0, &obj->dbc, 0)) return (0);
32 #else
33 #if DB_VERSION_MINOR >= 5
34 if ((*obj->dbf->cursor)(obj->dbf, 0, &obj->dbc, 0)) return (0);
35 #else
36 if ((*obj->dbf->cursor)(obj->dbf, 0, &obj->dbc)) return (0);
37 #endif
38 #endif
39 obj->has_dbc=1;
40
41 if ((*obj->dbc->c_get)(obj->dbc, &key, &value, DB_FIRST)) return (0);
42 #endif
43 *keylen=key.size;
44 *vallen=value.size;
45 if ((*val=(char *)malloc(*vallen)) == 0) return (0);
46
47 memcpy(*val, value.data, *vallen);
48 return ((char *)key.data);
49 }
50
51 char *bdbobj_nextkey(struct bdbobj *obj, size_t *keylen, char **val,
52 size_t *vallen)
53 {
54 DBT key, value;
55
56 if (!obj->has_dbf) return (0);
57
58 memset(&key, 0, sizeof(key));
59 memset(&value, 0, sizeof(value));
60
61 #if DB_VERSION_MAJOR < 2
62 if ((*obj->dbf->seq)(obj->dbf, &key, &value, R_NEXT)) return (0);
63 #else
64 if (!obj->has_dbc) return (0);
65
66 if ((*obj->dbc->c_get)(obj->dbc, &key, &value, DB_NEXT))
67 {
68 (*obj->dbc->c_close)(obj->dbc);
69 obj->has_dbc=0;
70 }
71 #endif
72
73 *keylen=key.size;
74 *vallen=value.size;
75 if ((*val=(char *)malloc(*vallen + 1)) == 0) return (0);
76
77 memcpy(*val, value.data, *vallen);
78 (*val)[*vallen]=0;
79
80 return ((char *)key.data);
81 }