aboutsummaryrefslogtreecommitdiff
path: root/src/txdb-leveldb.cpp
diff options
context:
space:
mode:
authorPieter Wuille <[email protected]>2012-09-25 23:04:54 +0200
committerPieter Wuille <[email protected]>2012-10-20 23:08:57 +0200
commitbeeb57610cf57c1d802be993ac0e98211bfc5f0c (patch)
treeadf8ec903008407b95da0467a0ea8fcbf4909938 /src/txdb-leveldb.cpp
parentAdd LevelDB MemEnv support (diff)
downloaddiscoin-beeb57610cf57c1d802be993ac0e98211bfc5f0c.tar.xz
discoin-beeb57610cf57c1d802be993ac0e98211bfc5f0c.zip
Add gettxout and gettxoutsetinfo RPCs
Diffstat (limited to 'src/txdb-leveldb.cpp')
-rw-r--r--src/txdb-leveldb.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/txdb-leveldb.cpp b/src/txdb-leveldb.cpp
index 4e2abe63d..7c72ccac0 100644
--- a/src/txdb-leveldb.cpp
+++ b/src/txdb-leveldb.cpp
@@ -97,6 +97,41 @@ bool CBlockTreeDB::ReadLastBlockFile(int &nFile) {
return Read('l', nFile);
}
+bool CCoinsViewDB::GetStats(CCoinsStats &stats) {
+ leveldb::Iterator *pcursor = db.NewIterator();
+ pcursor->SeekToFirst();
+
+ while (pcursor->Valid()) {
+ try {
+ leveldb::Slice slKey = pcursor->key();
+ CDataStream ssKey(slKey.data(), slKey.data()+slKey.size(), SER_DISK, CLIENT_VERSION);
+ char chType;
+ ssKey >> chType;
+ if (chType == 'c' && !fRequestShutdown) {
+ leveldb::Slice slValue = pcursor->value();
+ CDataStream ssValue(slValue.data(), slValue.data()+slValue.size(), SER_DISK, CLIENT_VERSION);
+ CCoins coins;
+ ssValue >> coins;
+ uint256 txhash;
+ ssKey >> txhash;
+
+ stats.nTransactions++;
+ BOOST_FOREACH(const CTxOut &out, coins.vout) {
+ if (!out.IsNull())
+ stats.nTransactionOutputs++;
+ }
+ stats.nSerializedSize += 32 + slValue.size();
+ }
+ pcursor->Next();
+ } catch (std::exception &e) {
+ return error("%s() : deserialize error", __PRETTY_FUNCTION__);
+ }
+ }
+ delete pcursor;
+ stats.nHeight = GetBestBlock()->nHeight;
+ return true;
+}
+
bool CBlockTreeDB::LoadBlockIndexGuts()
{
leveldb::Iterator *pcursor = NewIterator();