2 ** Copyright 1998 - 2000 Double Precision, Inc. See COPYING for
3 ** distribution information.
20 void gdbmobj_init(struct gdbmobj
*obj
)
27 void gdbmobj_close(struct gdbmobj
*obj
)
41 int gdbmobj_open(struct gdbmobj
*obj
, const char *filename
, const char *modestr
)
45 for ( ; *modestr
; modestr
++)
62 if ((obj
->dbf
=gdbm_open((char *)filename
, 0, mode
, 0664, 0)) != 0)
64 /* Where possible, set the close-on-exec bit */
69 int fd
=gdbm_fdesc(obj
->dbf
);
71 if (fd
>= 0) fcntl(fd
, F_SETFD
, FD_CLOEXEC
);
81 int gdbmobj_store(struct gdbmobj
*obj
, const char *key
, size_t keylen
,
89 dkey
.dptr
=(char *)key
;
92 dval
.dptr
=(char *)data
;
95 return (obj
->has_dbf
? gdbm_store(obj
->dbf
, dkey
, dval
, (
96 *mode
== 'i' || *mode
== 'I' ?
97 GDBM_INSERT
:GDBM_REPLACE
)):-1);
100 int gdbmobj_exists(struct gdbmobj
*obj
, const char *key
, size_t keylen
)
104 if (!obj
->has_dbf
) return (0);
106 dkey
.dptr
=(char *)key
;
109 if (gdbm_exists(obj
->dbf
, dkey
)) return (1);
113 char *gdbm_dofetch(struct gdbmobj
*, const char *, size_t, size_t *);
115 char *gdbmobj_fetch(struct gdbmobj
*obj
, const char *key
, size_t keylen
,
116 size_t *datalen
, const char *options
)
122 if ((p
=gdbm_dofetch(obj
, key
, keylen
, datalen
)) != 0)
127 while (keylen
&& key
[--keylen
] != '.')
136 for (i
=0; i
<keylen
; i
++)
137 if (key
[i
] == '@') { ++i
; break; }
140 if ((p
=gdbm_dofetch(obj
, key
, i
, datalen
)) != 0)
147 for (i
=0; i
<keylen
; i
++)
148 if (key
[i
] == '.') { ++i
; break; }
162 char *gdbm_dofetch(struct gdbmobj
*obj
,
163 const char *key
, size_t keylen
, size_t *datalen
)
167 if (!obj
->has_dbf
) return (0);
169 dkey
.dptr
=(char *)key
;
172 val
=gdbm_fetch(obj
->dbf
, dkey
);
174 if (!val
.dptr
) return (0);