d9898ee8 |
1 | /* |
2 | ** Copyright 1998 - 1999 Double Precision, Inc. See COPYING for |
3 | ** distribution information. |
4 | */ |
5 | |
6 | #include "gdbmobj.h" |
7 | |
8 | static char *fetchkeyval(struct gdbmobj *obj, size_t *, char **, size_t *); |
9 | extern char *gdbm_dofetch(struct gdbmobj *, const char *, size_t, size_t *); |
10 | |
11 | char *gdbmobj_firstkey(struct gdbmobj *obj, size_t *keylen, char **val, |
12 | size_t *vallen) |
13 | { |
14 | datum key; |
15 | |
16 | if (!obj->has_dbf) return (0); |
17 | |
18 | if (obj->prev_key) free(obj->prev_key); |
19 | obj->prev_key=0; |
20 | |
21 | key=gdbm_firstkey(obj->dbf); |
22 | |
23 | if (!key.dptr) return (0); |
24 | |
25 | obj->prev_key=key.dptr; |
26 | obj->prev_key_len=key.dsize; |
27 | return (fetchkeyval(obj, keylen, val, vallen)); |
28 | } |
29 | |
30 | |
31 | static char *fetchkeyval(struct gdbmobj *obj, size_t *keylen, char **val, |
32 | size_t *vallen) |
33 | { |
34 | if (!obj->prev_key) return (0); |
35 | *val=gdbm_dofetch(obj, obj->prev_key, obj->prev_key_len, vallen); |
36 | *keylen=obj->prev_key_len; |
37 | return (obj->prev_key); |
38 | } |
39 | |
40 | char *gdbmobj_nextkey(struct gdbmobj *obj, size_t *keylen, |
41 | char **val, size_t *vallen) |
42 | { |
43 | datum dkey, key; |
44 | |
45 | if (!obj->has_dbf || !obj->prev_key) return (0); |
46 | |
47 | dkey.dptr=(char *)obj->prev_key; |
48 | dkey.dsize=obj->prev_key_len; |
49 | |
50 | key=gdbm_nextkey(obj->dbf, dkey); |
51 | |
52 | free(obj->prev_key); |
53 | obj->prev_key=key.dptr; |
54 | obj->prev_key_len=key.dsize; |
55 | return (fetchkeyval(obj, keylen, val, vallen)); |
56 | } |