File: xtdb.cc

package info (click to toggle)
pdns 2.9.20-8%2Betch1
  • links: PTS
  • area: main
  • in suites: etch
  • size: 4,644 kB
  • ctags: 3,511
  • sloc: cpp: 24,567; sh: 17,763; makefile: 360; yacc: 189; lex: 131; sql: 69; perl: 39
file content (86 lines) | stat: -rw-r--r-- 1,804 bytes parent folder | download | duplicates (5)
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