00001
00002
00003
00004
00005
00006
00007
#include "wvautoconf.h"
00008
00009
#if HAVE_LIBGDBM
00010
00011
#include "wvgdbmhash.h"
00012
00013
00014 WvGdbmHashBase::WvGdbmHashBase(
WvStringParm dbfile)
00015 {
00016 dbf = gdbm_open((
char *)dbfile.
cstr(), 0, GDBM_WRCREAT|GDBM_FAST, 0600, 0);
00017
if (!dbf)
00018 fprintf (stderr,
"Could not open database '%s': %s\n",
00019 dbfile.
cstr(), gdbm_strerror(gdbm_errno));
00020 }
00021
00022
00023 WvGdbmHashBase::~WvGdbmHashBase()
00024 {
00025 gdbm_close(dbf);
00026 }
00027
00028
00029 int WvGdbmHashBase::add(
const datum &key,
const datum &data,
bool replace)
00030 {
00031
return gdbm_store(dbf, key, data,
00032 replace ? GDBM_REPLACE : GDBM_INSERT);
00033 }
00034
00035
00036 int WvGdbmHashBase::remove(
const datum &key)
00037 {
00038
return gdbm_delete(dbf, key);
00039 }
00040
00041
00042 datum
WvGdbmHashBase::find(
const datum &key)
00043 {
00044
return gdbm_fetch(dbf, key);
00045 }
00046
00047
00048 bool WvGdbmHashBase::exists(
const datum &key)
00049 {
00050
return gdbm_exists(dbf, key);
00051 }
00052
00053
00054 void WvGdbmHashBase::zap()
00055 {
00056 datum key;
00057
while ((key = gdbm_firstkey(dbf)).dptr != NULL)
00058 gdbm_delete(dbf, key);
00059 }
00060
00061
00062 WvGdbmHashBase::IterBase::IterBase(
WvGdbmHashBase &_gdbmhash)
00063 : gdbmhash(_gdbmhash)
00064 {
00065
curkey.dptr =
nextkey.dptr =
curdata.dptr = NULL;
00066 }
00067
00068
00069 WvGdbmHashBase::IterBase::~IterBase()
00070 {
00071 free(
curkey.dptr);
00072 free(
nextkey.dptr);
00073 free(
curdata.dptr);
00074 }
00075
00076
00077 void WvGdbmHashBase::IterBase::rewind()
00078 {
00079 free(
curkey.dptr);
00080 free(
nextkey.dptr);
00081
curkey.dptr = NULL;
00082
nextkey = gdbm_firstkey(
gdbmhash.
dbf);
00083 }
00084
00085
00086 void WvGdbmHashBase::IterBase::next()
00087 {
00088 free(
curkey.dptr);
00089 free(
curdata.dptr);
00090
curkey =
nextkey;
00091 nextkey = gdbm_nextkey(
gdbmhash.
dbf,
curkey);
00092
curdata = gdbm_fetch(
gdbmhash.
dbf,
curkey);
00093 }
00094
00095
#endif