2 ** Copyright 1998 - 2000 Double Precision, Inc. See COPYING for
3 ** distribution information.
19 static const char rcsid
[]="$Id: gdbmobj.c,v 1.9 2006/10/28 19:22:52 mrsam Exp $";
21 void gdbmobj_init(struct gdbmobj
*obj
)
28 void gdbmobj_close(struct gdbmobj
*obj
)
42 int gdbmobj_open(struct gdbmobj
*obj
, const char *filename
, const char *modestr
)
46 for ( ; *modestr
; modestr
++)
63 if ((obj
->dbf
=gdbm_open((char *)filename
, 0, mode
, 0664, 0)) != 0)
65 /* Where possible, set the close-on-exec bit */
70 int fd
=gdbm_fdesc(obj
->dbf
);
72 if (fd
>= 0) fcntl(fd
, F_SETFD
, FD_CLOEXEC
);
82 int gdbmobj_store(struct gdbmobj
*obj
, const char *key
, size_t keylen
,
90 dkey
.dptr
=(char *)key
;
93 dval
.dptr
=(char *)data
;
96 return (obj
->has_dbf
? gdbm_store(obj
->dbf
, dkey
, dval
, (
97 *mode
== 'i' || *mode
== 'I' ?
98 GDBM_INSERT
:GDBM_REPLACE
)):-1);
101 int gdbmobj_exists(struct gdbmobj
*obj
, const char *key
, size_t keylen
)
105 if (!obj
->has_dbf
) return (0);
107 dkey
.dptr
=(char *)key
;
110 if (gdbm_exists(obj
->dbf
, dkey
)) return (1);
114 char *gdbm_dofetch(struct gdbmobj
*, const char *, size_t, size_t *);
116 char *gdbmobj_fetch(struct gdbmobj
*obj
, const char *key
, size_t keylen
,
117 size_t *datalen
, const char *options
)
123 if ((p
=gdbm_dofetch(obj
, key
, keylen
, datalen
)) != 0)
128 while (keylen
&& key
[--keylen
] != '.')
137 for (i
=0; i
<keylen
; i
++)
138 if (key
[i
] == '@') { ++i
; break; }
141 if ((p
=gdbm_dofetch(obj
, key
, i
, datalen
)) != 0)
148 for (i
=0; i
<keylen
; i
++)
149 if (key
[i
] == '.') { ++i
; break; }
163 char *gdbm_dofetch(struct gdbmobj
*obj
,
164 const char *key
, size_t keylen
, size_t *datalen
)
168 if (!obj
->has_dbf
) return (0);
170 dkey
.dptr
=(char *)key
;
173 val
=gdbm_fetch(obj
->dbf
, dkey
);
175 if (!val
.dptr
) return (0);