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