Encapsulate CLevelDB iterators cleanly

Conflicts:
	src/leveldb.cpp
	src/leveldb.h
	src/txdb.cpp
This commit is contained in:
Pieter Wuille
2015-10-07 17:12:24 -07:00
committed by Jack Grigg
parent 3a8e1d0cf4
commit 1ebf50b6da
3 changed files with 88 additions and 44 deletions

View File

@@ -60,7 +60,64 @@ public:
batch.Delete(slKey);
}
};
class CLevelDBIterator
{
private:
leveldb::Iterator *piter;
public:
CLevelDBIterator(leveldb::Iterator *piterIn) : piter(piterIn) {}
~CLevelDBIterator();
bool Valid();
void SeekToFirst();
void SeekToLast();
template<typename K> void Seek(const K& key) {
CDataStream ssKey(SER_DISK, CLIENT_VERSION);
ssKey.reserve(ssKey.GetSerializeSize(key));
ssKey << key;
leveldb::Slice slKey(&ssKey[0], ssKey.size());
piter->Seek(slKey);
}
void Next();
void Prev();
template<typename K> bool GetKey(K& key) {
leveldb::Slice slKey = piter->key();
try {
CDataStream ssKey(slKey.data(), slKey.data() + slKey.size(), SER_DISK, CLIENT_VERSION);
ssKey >> key;
} catch(std::exception &e) {
return false;
}
return true;
}
unsigned int GetKeySize() {
return piter->key().size();
}
template<typename V> bool GetValue(V& value) {
leveldb::Slice slValue = piter->value();
try {
CDataStream ssValue(slValue.data(), slValue.data() + slValue.size(), SER_DISK, CLIENT_VERSION);
ssValue >> value;
} catch(std::exception &e) {
return false;
}
return true;
}
unsigned int GetValueSize() {
return piter->value().size();
}
};
class CLevelDBWrapper
{
private:
@@ -169,11 +226,10 @@ public:
return WriteBatch(batch, true);
}
// not exactly clean encapsulation, but it's easiest for now
leveldb::Iterator* NewIterator()
CLevelDBIterator *NewIterator()
{
return new CLevelDBIterator(pdb->NewIterator(iteroptions));
{
return pdb->NewIterator(iteroptions);
}
/**
* Return true if the database managed by this class contains no entries.