00001
#include <db.h>
00002
00003
#include <qfile.h>
00004
00005
#include "dbwrapper.h"
00006
00007
00008
using namespace Evolution;
00009
00010
struct DBIterator::Data {
00011 DBWrapper *wrapper;
00012
QString key;
00013
QString data;
00014 DBC* cursor;
00015
bool atEnd;
00016 };
00017
00018 DBIterator::DBIterator( DBWrapper* wra) {
00019 data =
new Data;
00020 data->wrapper = wra;
00021 data->atEnd =
false;
00022 data->cursor = 0l;
00023 }
00024 DBIterator::DBIterator(
const DBIterator& copy ) {
00025 data =
new Data;
00026 data->wrapper =
copy.data->wrapper;
00027 data->key =
copy.data->key;
00028 data->data =
copy.data->data;
00029 data->atEnd =
copy.data->atEnd;
00030
if (
copy.data->cursor )
00031
copy.data->cursor->c_dup(
copy.data->cursor, &data->cursor, 0 );
00032
else
00033 data->cursor = 0l;
00034 }
00035 DBIterator::~DBIterator() {
00036
if (data->cursor)
00037 data->cursor->c_close(data->cursor);
00038
delete data;
00039 }
00040 DBIterator& DBIterator::operator=(
const DBIterator& rhs ) {
00041
if ( *
this == rhs )
00042
return *
this;
00043
if (data->cursor)
00044 data->cursor->c_close(data->cursor);
00045
delete data;
00046 data =
new Data;
00047 data->wrapper = rhs.data->wrapper;
00048 data->key = rhs.data->key;
00049 data->data = rhs.data->data;
00050 data->atEnd = rhs.data->atEnd;
00051
if ( rhs.data->cursor )
00052 rhs.data->cursor->c_dup(rhs.data->cursor, &data->cursor, 0 );
00053
else
00054 data->cursor = 0l;
00055
00056
return *
this;
00057 }
00058
QString DBIterator::key()const{
00059
return data->key;
00060 }
00061
QString DBIterator::value()const {
00062
return data->data;
00063 }
00064
QString DBIterator::operator*() {
00065
return data->data;
00066 }
00067 DBIterator& DBIterator::operator++() {
00068 DBT
key, val;
00069 ::memset(&
key, 0,
sizeof(
key) );
00070 ::memset(&val, 0,
sizeof(val) );
00071
if ( data->cursor )
00072
if ( data->cursor->c_get(data->cursor, &key, &val,DB_NEXT ) != 0 )
00073 data->atEnd =
true;
00074 data->key = QString::fromUtf8( (
char*)
key.data,
key.size );
00075 data->data = QString::fromUtf8( (
char*)val.data, val.size );
00076
return *
this;
00077 }
00078 DBIterator& DBIterator::operator--() {
00079 DBT
key, val;
00080 ::memset(&
key, 0,
sizeof(
key) );
00081 ::memset(&val, 0,
sizeof(val) );
00082
if ( data->cursor )
00083
if ( data->cursor->c_get(data->cursor, &key, &val,DB_PREV ) != 0 )
00084 data->atEnd =
true;
00085 data->key = QString::fromUtf8( (
char*)
key.data,
key.size );
00086 data->data = QString::fromUtf8( (
char*)val.data, val.size );
00087
return *
this;
00088 }
00089
bool DBIterator::operator==(
const DBIterator& rhs ) {
00090
if ( data->atEnd && data->atEnd == rhs.data->atEnd )
return true;
00091
00092
return false;
00093 }
00094
bool DBIterator::operator!=(
const DBIterator& rhs ) {
00095
return !this->operator==(rhs );
00096 }
00097
struct DBWrapper::Data {
00098 DB* db;
00099
bool only;
00100 };
00101 DBWrapper::DBWrapper() {
00102 data =
new Data;
00103 (
void)db_create(&data->db, NULL, 0 );
00104 data->only =
false;
00105 }
00106 DBWrapper::~DBWrapper() {
00107 data->db->close(data->db, 0 );
00108
delete data;
00109 }
00110
bool DBWrapper::open(
const QString& file,
bool on) {
00111 data->only = on;
00112
return !data->db->open(data->db, QFile::encodeName( file ), NULL, DB_HASH, 0, 0666 );
00113 }
00114
bool DBWrapper::save() {
00115
return true;
00116 }
00117 DBIterator DBWrapper::begin() {
00118 DBIterator it(
this);
00119 DBC* cursor;
00120 DBT
key, val;
00121
int ret;
00122 ret = data->db->cursor(data->db, NULL, &cursor, 0 );
00123
if (ret ) {
00124 it.data->atEnd =
true;
00125
return it;
00126 }
00127
00128 ::memset(&
key, 0,
sizeof(
key) );
00129 ::memset(&val, 0,
sizeof(val) );
00130 ret = cursor->c_get(cursor, &key, &val, DB_FIRST );
00131
if (ret ) {
00132 it.data->atEnd =
true;
00133
return it;
00134 }
00135
00136 it.data->cursor = cursor;
00137 it.data->key = QString::fromUtf8((
char*)
key.data,
key.size );
00138 it.data->data = QString::fromUtf8((
char*)val.data, val.size );
00139
00140
return it;
00141 }
00142 DBIterator DBWrapper::end() {
00143 DBIterator it(
this);
00144 it.data->atEnd =
true;
00145
00146
return it;
00147 }
00148
bool DBWrapper::find(
const QString& _key,
QString& _val ) {
00149 DBT
key, val;
00150 ::memset(&
key, 0,
sizeof(
key) );
00151 ::memset(&val, 0,
sizeof(val) );
00152
00153
QCString db_key = _key.local8Bit();
00154
key.data = db_key.data();
00155
key.size = db_key.size();
00156
00157
int ret = data->db->get(data->db, NULL, &key, &val, 0 );
00158
if (!ret) {
00159 _val = QString::fromUtf8( (
char*)val.data, val.size );
00160 qWarning(
"key: %s val: %sXXX", (
char*)
key.data, (
char*)val.data );
00161
return true;
00162 }
00163
return false;
00164 }
00165
bool DBWrapper::add(
const QString& _key,
const QString& _val ) {
00166
QCString db_key = _key.local8Bit();
00167
QCString db_val = _val.local8Bit();
00168 DBT
key, val;
00169 ::memset(&
key, 0,
sizeof(
key) );
00170 ::memset(&val, 0,
sizeof(val) );
00171
00172
key.data = db_key.data();
00173
key.size = db_key.size();
00174 val.data = db_val.data();
00175 val.size = db_val.size();
00176
00177
return !data->db->put(data->db, NULL, &key, &val, 0 );
00178 }
00179
bool DBWrapper::remove(
const QString& _key ) {
00180
QCString db_key = _key.local8Bit();
00181 DBT
key;
00182 memset(&key, 0,
sizeof(key) );
00183
key.data = db_key.data();
00184
key.size = db_key.size();
00185
00186
return !data->db->del(data->db, NULL, &key, 0 );
00187 }