1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
#include "xtdb.hh"
#include "pdns/lock.hh"
#include <tdb.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <iostream>
using namespace std;
TDB_CONTEXT *XTDBWrapper::s_db;
int XTDBWrapper::s_usecount;
pthread_mutex_t XTDBWrapper::s_lock=PTHREAD_MUTEX_INITIALIZER;
XTDBWrapper::XTDBWrapper(const string &fname)
{
Lock l(&s_lock);
if(!s_db) {
s_db = tdb_open(const_cast<char *>(fname.c_str()), 5213331,
TDB_NOLOCK,
O_RDWR | O_CREAT , 0600);
if(!s_db)
throw XDBException("Unable to open database: "+string(strerror(errno)));
}
s_usecount++;
}
XTDBWrapper::~XTDBWrapper()
{
if(!--s_usecount) {
tdb_close(s_db);
cerr<<"closed"<<endl;
}
}
bool XTDBWrapper::get(const string &key, string &value)
{
TDB_DATA kdatum={const_cast<char *>(key.c_str()),key.size()+1};
TDB_DATA vdatum;
{
//Lock l(&s_lock);
vdatum=tdb_fetch(s_db,kdatum);
}
if(!vdatum.dptr)
return false;
value.assign(vdatum.dptr,vdatum.dsize);
free(vdatum.dptr);
return true;
}
void XTDBWrapper::put(const string &key, const string &value)
{
TDB_DATA kdatum={const_cast<char *>(key.c_str()),key.size()+1};
TDB_DATA vdatum={const_cast<char *>(value.c_str()),value.size()};
if(tdb_store(s_db, kdatum, vdatum,TDB_REPLACE)<0)
throw XDBException("Error storing key: "+string(strerror(errno)));
}
void XTDBWrapper::del(const string &key)
{
}
#ifdef TESTDRIVER
main()
{
XDBWrapper *xdb=new XTDBWrapper("wuh");
xdb->put("ahu","toffe gast");
xdb->append("ahu",", echt waar!");
string tst;
xdb->get("ahu",tst);
cout<<"Database zegt over ahu: '"<<tst<<"'"<<endl;
xdb->append("ahu"," Toch niet!");
xdb->get("ahu",tst);
cout<<"Database zegt over ahu: '"<<tst<<"'"<<endl;
}
#endif
|