#include "db_base.h" db_base::db_base(DbEnv *dbe, string DBfile, string DB) { dbenv = dbe; listView = NULL; data = new Db(dbe, 0); cerr << "DB:" << DBfile <<"\n";// int x; if (( x = data->open(DBfile.c_str(), DB.c_str(), DB_BTREE, DB_CREATE, 0600))) data->err(x,"DB open"); } db_base::~db_base() { data->close(0); } Dbc *db_base::getCursor() { Dbc *cursor; if (int x = data->cursor(NULL, &cursor, 0)) { data->err(x,"DB new Cursor"); return NULL; } return cursor; } bool db_base::freeCursor(Dbc *cursor) { if (int x = cursor->close()) { data->err(x,"DB delete cursor"); return false; } return true; } void *db_base::getData(void *key, int length, int *dsize) { if ((key == NULL) || (length == 0) ) { *dsize = 0; return NULL; } void *p; Dbt k(key, length); Dbt d(NULL, 0); if (int x = data->get(NULL, &k, &d, 0)) { data->err(x,"DB Error get"); *dsize = 0; return NULL; } p = d.get_data(); *dsize = d.get_size(); void *q = malloc(*dsize); memcpy(q,p,*dsize); return q; } void *db_base::getData(string key, int *dsize) { return getData((void *)key.c_str(), key.length()+ 1, dsize); } string db_base::getString(string key) { string x = ""; int dsize; char *p = (char *)getData(key, &dsize); if (p == NULL) { cerr << "getString: p was NULL"<< endl; return x; } if ( p[dsize-1] != '\0' ) { int a =p[dsize-1]; cerr << "getString: stringerror "<< a <<" != 0 (returning empty string) size:" <put(NULL, &k, &d, 0 )) { data->err(x,"DB Error put"); } } void db_base::putString(string key, void *dat, int datalen) { cerr << key << endl; putData((void *)key.c_str(), key.length()+1, dat, datalen); } void db_base::putString(string key, string dat) { cerr << key<get(k, d, DB_NEXT)) { desc = (char *)k->get_data(); p = (unsigned char *)d->get_data(); int size = d->get_size(); pki = newPKI(); if (pki == NULL) continue; cerr << desc.c_str() << endl; if (pki->fromData(p, size)) { pki->setDescription(desc); container.append(pki); } else delete(pki); } delete (k); delete (d); freeCursor(cursor); } bool db_base::updateView() { if (listView == NULL) return false; listView->clear(); pki_base *pki; if (container.isEmpty()) return false; QListIterator it(container); for ( ; it.current(); ++it ) { pki = it.current(); QListViewItem * lvi = new QListViewItem(listView, pki->getDescription().c_str()); lvi->setPixmap(0, *icon); listView->insertItem(lvi); } return true; } bool db_base::insertPKI(pki_base *pki) { string desc = pki->getDescription(); string orig = desc; int size=0; char field[10]; unsigned char *p; p = pki->toData(&size); int cnt=0; int x = DB_KEYEXIST; while (x == DB_KEYEXIST) { Dbt k((void *)desc.c_str(), desc.length() + 1); Dbt d((void *)p, size); cerr << "Size: " << d.get_size() << "\n"; if ((x = data->put(NULL, &k, &d, DB_NOOVERWRITE ))!=0) { data->err(x,"DB Error put"); sprintf(field,"%02i", ++cnt); string z = field; desc = orig + "_" + z ; } } if (x != DB_KEYEXIST && x != 0) { data->err(x,"DB Error put"); //return false; } OPENSSL_free(p); pki->setDescription(desc); container.append(pki); updateView(); return true; } bool db_base::deletePKI(pki_base *pki) { string desc = pki->getDescription(); Dbt k((void *)desc.c_str(), desc.length() + 1); int x = data->del(NULL, &k, 0); if (x){ data->err(x,"DB Error del"); return false; } remFromCont(pki); updateView(); return true; } void db_base::remFromCont(pki_base *pki) { container.remove(pki); } bool db_base::updatePKI(pki_base *pki, string desc) { if (deletePKI(pki)){ pki->setDescription(desc); return insertPKI(pki); } return true; } pki_base *db_base::getSelectedPKI(string desc) { if (desc == "" ) return NULL; pki_base *pki; QListIterator it(container); for ( ; it.current(); ++it ) { pki = it.current(); if (pki->getDescription() == desc) return pki; } } pki_base *db_base::getSelectedPKI() { const char *tp; string desc = ""; QListViewItem *lvi; if ((lvi = listView->selectedItem()) == NULL) return NULL; if ((tp = lvi->text(0).latin1())) desc = tp; cerr << "desc = '"< it(container); for ( ; it.current(); ++it ) { pki = it.current(); if (refpki->compare(pki)) return pki; } return NULL; } QPixmap *db_base::loadImg(const char *name ) { QString path = PREFIX; return new QPixmap(path + name); }