aboutsummaryrefslogtreecommitdiff
path: root/src/blockchain_db/berkeleydb
diff options
context:
space:
mode:
authormoneromooo-monero <moneromooo-monero@users.noreply.github.com>2015-10-25 10:45:25 +0000
committermoneromooo-monero <moneromooo-monero@users.noreply.github.com>2015-10-25 12:36:11 +0000
commit5f397e441275d0e282a371bcdeed963c9a9b69f1 (patch)
tree4ed5d4039320b142710befac10cbb7e816cfe173 /src/blockchain_db/berkeleydb
parentdb_bdb: record numbers for recno databases start at 1 (diff)
downloadmonero-5f397e441275d0e282a371bcdeed963c9a9b69f1.tar.xz
Add functions to iterate through blocks, txes, outputs, key images
Diffstat (limited to 'src/blockchain_db/berkeleydb')
-rw-r--r--src/blockchain_db/berkeleydb/db_bdb.cpp120
-rw-r--r--src/blockchain_db/berkeleydb/db_bdb.h5
2 files changed, 125 insertions, 0 deletions
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<bool(const crypto::key_image&)> f) const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+
+ bdb_cur cur(DB_DEFAULT_TX, m_spent_keys);
+
+ Dbt_copy<crypto::key_image> k;
+ Dbt_copy<char> 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<bool(uint64_t, const crypto::hash&, const cryptonote::block&)> f) const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+
+ bdb_cur cur(DB_DEFAULT_TX, m_blocks);
+
+ Dbt_copy<uint64_t> 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<char*>(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<bool(const crypto::hash&, const cryptonote::transaction&)> f) const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+
+ bdb_cur cur(DB_DEFAULT_TX, m_txs);
+
+ Dbt_copy<crypto::hash> k;
+ Dbt_safe v;
+ bool ret = true;
+ int result;
+ while ((result = cur->get(&k, &v, DB_NEXT)) == 0)
+ {
+ blobdata bd;
+ bd.assign(reinterpret_cast<char*>(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<bool(uint64_t amount, const crypto::hash &tx_hash, size_t tx_idx)> f) const
+{
+ LOG_PRINT_L3("BlockchainBDB::" << __func__);
+ check_open();
+
+ bdb_cur cur(DB_DEFAULT_TX, m_output_amounts);
+
+ Dbt_copy<uint64_t> k;
+ Dbt_copy<uint32_t> 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<uint64_t> &offsets, std::vector<uint64_t> &global_indices);
+ virtual bool for_all_key_images(std::function<bool(const crypto::key_image&)>) const;
+ virtual bool for_all_blocks(std::function<bool(uint64_t, const crypto::hash&, const cryptonote::block&)>) const;
+ virtual bool for_all_transactions(std::function<bool(const crypto::hash&, const cryptonote::transaction&)>) const;
+ virtual bool for_all_outputs(std::function<bool(uint64_t amount, const crypto::hash &tx_hash, size_t tx_idx)> 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;