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 }