From d7641c173c6eb659334a900fb35c66eaa94e055c Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Wed, 19 Nov 2014 11:25:42 -0800 Subject: [PATCH] potentially iterate all ldb values. --- src/bitcoindjs.cc | 99 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 84 insertions(+), 15 deletions(-) diff --git a/src/bitcoindjs.cc b/src/bitcoindjs.cc index db15fa0b..9521c61a 100644 --- a/src/bitcoindjs.cc +++ b/src/bitcoindjs.cc @@ -231,7 +231,7 @@ using namespace v8; // Need this because account names can be an empty string. #define EMPTY ("\\x01") -// #define USE_LEVELDB_ADDR +#define USE_LEVELDB_ADDR /** * Node.js Exposed Function Templates @@ -5901,13 +5901,14 @@ class TwoPartComparator : public leveldb::Comparator { // if a > end: positive result // else: zero result int Compare(const leveldb::Slice& key, const leveldb::Slice& end) const { - std::string key_ = key.ToString(); + return -1; + //std::string key_ = key.ToString(); - const char *k = key_.c_str(); + //const char *k = key_.c_str(); - if (k[0] == 't') return -1; + //if (k[0] == 't') return -1; - return 1; + //return 1; } // Ignore the following methods for now: @@ -5956,6 +5957,82 @@ read_addr(const std::string addr) { TwoPartComparator cmp; options.comparator = &cmp; + + + + + + + const boost::filesystem::path path = GetDataDir() / "blocks" / "index"; + if (fMemory) { + penv = leveldb::NewMemEnv(leveldb::Env::Default()); + options.env = penv; + } + leveldb::Status status = leveldb::DB::Open(options, path.string(), &pdb); + if (!status.ok()) { + return head; + } + + leveldb::Iterator* it = pdb->NewIterator(options); + for (it->SeekToFirst(); it->Valid(); it->Next()) { + std::string strValue = it->value().ToString(); + CTransaction ctx; + + if (it->key().ToString().c_str()[0] != 't') { + continue; + } + + try { + CDataStream ssValue(strValue.data(), strValue.data() + strValue.size(), SER_DISK, CLIENT_VERSION); + ssValue >> ctx; + } catch (const std::exception&) { + // return NULL; + continue; + } + + for (unsigned int vo = 0; vo < ctx.vout.size(); vo++) { + const CTxOut& txout = ctx.vout[vo]; + const CScript& scriptPubKey = txout.scriptPubKey; + int nRequired; + txnouttype type; + vector addresses; + if (!ExtractDestinations(scriptPubKey, type, addresses, nRequired)) { + continue; + } + BOOST_FOREACH(const CTxDestination& address, addresses) { + if (CBitcoinAddress(address).ToString() != addr) { + continue; + } + if (cur == NULL) { + head->ctx = ctx; + uint256 hash(((CMerkleTx)ctx).hashBlock.GetHex()); + head->blockhash = hash; + head->next = NULL; + cur = head; + } else { + ctx_list *item = new ctx_list(); + item->ctx = ctx; + uint256 hash(((CMerkleTx)ctx).hashBlock.GetHex()); + item->blockhash = hash; + item->next = NULL; + cur->next = item; + cur = item; + } + goto found; + } + } + +found: + continue; + } + assert(it->status().ok()); + delete it; + + + + +#if 0 + #ifdef USE_LDB_FILES unsigned int nFile = 0; unsigned int tryFiles = 0xffffffff; @@ -5992,16 +6069,6 @@ read_addr(const std::string addr) { std::string strValue = value.ToString(); CTransaction ctx; - // CDataStream ssKey(SER_DISK, CLIENT_VERSION); - // ssKey.reserve(ssKey.GetSerializeSize(key.ToString())); - // ssKey << key.ToString(); - // leveldb::Slice slKey(&ssKey[0], ssKey.size()); - // leveldb::Status status = pdb->Get(readoptions, slKey, &strValue); - // // leveldb::Status status = pdb->Get(readoptions, key, &strValue); - // if (!status.ok()) { - // if (status.IsNotFound()) continue; - // } - try { CDataStream ssValue(strValue.data(), strValue.data() + strValue.size(), SER_DISK, CLIENT_VERSION); ssValue >> ctx; @@ -6052,6 +6119,8 @@ found: } #else } +#endif + #endif return head;