From 5f397e441275d0e282a371bcdeed963c9a9b69f1 Mon Sep 17 00:00:00 2001 From: moneromooo-monero Date: Sun, 25 Oct 2015 10:45:25 +0000 Subject: Add functions to iterate through blocks, txes, outputs, key images --- src/blockchain_db/berkeleydb/db_bdb.cpp | 120 ++++++++++++++++++++++++++++++++ src/blockchain_db/berkeleydb/db_bdb.h | 5 ++ 2 files changed, 125 insertions(+) (limited to 'src/blockchain_db/berkeleydb') diff --git a/src/blockchain_db/berkeleydb/db_bdb.cpp b/src/blockchain_db/berkeleydb/db_bdb.cpp index 7648d657d..6560ce5c2 100644 --- a/src/blockchain_db/berkeleydb/db_bdb.cpp +++ b/src/blockchain_db/berkeleydb/db_bdb.cpp @@ -533,6 +533,126 @@ void BlockchainBDB::remove_spent_key(const crypto::key_image& k_image) throw1(DB_ERROR("Error adding removal of key image to db transaction")); } +bool BlockchainBDB::for_all_key_images(std::function f) const +{ + LOG_PRINT_L3("BlockchainBDB::" << __func__); + check_open(); + + bdb_cur cur(DB_DEFAULT_TX, m_spent_keys); + + Dbt_copy k; + Dbt_copy v; + bool ret = true; + int result; + while ((result = cur->get(&k, &v, DB_NEXT)) == 0) + { + if (!f(k)) + { + ret = false; + break; + } + } + if (result != DB_NOTFOUND) + ret = false; + + cur.close(); + return ret; +} + +bool BlockchainBDB::for_all_blocks(std::function f) const +{ + LOG_PRINT_L3("BlockchainBDB::" << __func__); + check_open(); + + bdb_cur cur(DB_DEFAULT_TX, m_blocks); + + Dbt_copy k; + Dbt_safe v; + bool ret = true; + int result; + while ((result = cur->get(&k, &v, DB_NEXT)) == 0) + { + uint64_t height = k - 1; + blobdata bd; + bd.assign(reinterpret_cast(v.get_data()), v.get_size()); + block b; + if (!parse_and_validate_block_from_blob(bd, b)) + throw0(DB_ERROR("Failed to parse block from blob retrieved from the db")); + crypto::hash hash; + if (!get_block_hash(b, hash)) + throw0(DB_ERROR("Failed to get block hash from blob retrieved from the db")); + if (!f(height, hash, b)) + { + ret = false; + break; + } + } + if (result != DB_NOTFOUND) + ret = false; + + cur.close(); + return ret; +} + +bool BlockchainBDB::for_all_transactions(std::function f) const +{ + LOG_PRINT_L3("BlockchainBDB::" << __func__); + check_open(); + + bdb_cur cur(DB_DEFAULT_TX, m_txs); + + Dbt_copy k; + Dbt_safe v; + bool ret = true; + int result; + while ((result = cur->get(&k, &v, DB_NEXT)) == 0) + { + blobdata bd; + bd.assign(reinterpret_cast(v.get_data()), v.get_size()); + transaction tx; + if (!parse_and_validate_tx_from_blob(bd, tx)) + throw0(DB_ERROR("Failed to parse tx from blob retrieved from the db")); + if (!f(k, tx)) + { + ret = false; + break; + } + } + if (result != DB_NOTFOUND) + ret = false; + + cur.close(); + return ret; +} + +bool BlockchainBDB::for_all_outputs(std::function f) const +{ + LOG_PRINT_L3("BlockchainBDB::" << __func__); + check_open(); + + bdb_cur cur(DB_DEFAULT_TX, m_output_amounts); + + Dbt_copy k; + Dbt_copy v; + bool ret = true; + int result; + while ((result = cur->get(&k, &v, DB_NEXT)) == 0) + { + uint32_t global_index = v - 1; + tx_out_index toi = get_output_tx_and_index_from_global(global_index); + if (!f(k, toi.first, toi.second)) + { + ret = false; + break; + } + } + if (result != DB_NOTFOUND) + ret = false; + + cur.close(); + return ret; +} + blobdata BlockchainBDB::output_to_blob(const tx_out& output) const { LOG_PRINT_L3("BlockchainBDB::" << __func__); diff --git a/src/blockchain_db/berkeleydb/db_bdb.h b/src/blockchain_db/berkeleydb/db_bdb.h index 54edcf0ad..b51d745d8 100644 --- a/src/blockchain_db/berkeleydb/db_bdb.h +++ b/src/blockchain_db/berkeleydb/db_bdb.h @@ -375,6 +375,11 @@ private: void get_output_global_indices(const uint64_t& amount, const std::vector &offsets, std::vector &global_indices); + virtual bool for_all_key_images(std::function) const; + virtual bool for_all_blocks(std::function) const; + virtual bool for_all_transactions(std::function) const; + virtual bool for_all_outputs(std::function f) const; + // Hard fork related storage virtual void set_hard_fork_starting_height(uint8_t version, uint64_t height); virtual uint64_t get_hard_fork_starting_height(uint8_t version) const; -- cgit v1.2.3