From 1138604d814cbd91651a5d363c9db7ae2733dad4 Mon Sep 17 00:00:00 2001 From: evoskuil Date: Tue, 27 Aug 2024 14:11:04 -0400 Subject: [PATCH] Add get_tx_count and get_tx_sizes, tests. --- .../bitcoin/database/impl/query/archive.ipp | 23 ++++++++++++++++ include/bitcoin/database/query.hpp | 5 +++- .../database/tables/archives/transaction.hpp | 16 +++++++++++ .../bitcoin/database/tables/archives/txs.hpp | 12 +++++++++ test/query/archive.cpp | 27 +++++++++++++++++++ 5 files changed, 82 insertions(+), 1 deletion(-) diff --git a/include/bitcoin/database/impl/query/archive.ipp b/include/bitcoin/database/impl/query/archive.ipp index 14df1426..17c706e2 100644 --- a/include/bitcoin/database/impl/query/archive.ipp +++ b/include/bitcoin/database/impl/query/archive.ipp @@ -298,6 +298,16 @@ hashes CLASS::get_tx_keys(const header_link& link) const NOEXCEPT return hashes; } +TEMPLATE +size_t CLASS::get_tx_count(const header_link& link) const NOEXCEPT +{ + table::txs::get_tx_quantity txs{}; + if (!store_.txs.find(link, txs)) + return {}; + + return txs.quantity; +} + TEMPLATE inline hash_digest CLASS::get_header_key(const header_link& link) const NOEXCEPT { @@ -364,6 +374,19 @@ bool CLASS::get_tx_position(size_t& out, const tx_link& link) const NOEXCEPT return true; } +TEMPLATE +bool CLASS::get_tx_sizes(size_t& light, size_t& heavy, + const tx_link& link) const NOEXCEPT +{ + table::transaction::get_sizes sizes{}; + if (!store_.tx.get(link, sizes)) + return false; + + light = sizes.light; + heavy = sizes.heavy; + return true; +} + TEMPLATE bool CLASS::get_value(uint64_t& out, const output_link& link) const NOEXCEPT { diff --git a/include/bitcoin/database/query.hpp b/include/bitcoin/database/query.hpp index fe398f0d..4ca6b069 100644 --- a/include/bitcoin/database/query.hpp +++ b/include/bitcoin/database/query.hpp @@ -336,8 +336,9 @@ class query /// Archival (surrogate-keyed). /// ----------------------------------------------------------------------- - /// Empty/null_hash implies fault. + /// Empty/null_hash implies fault, zero count implies unassociated. hashes get_tx_keys(const header_link& link) const NOEXCEPT; + size_t get_tx_count(const header_link& link) const NOEXCEPT; inline hash_digest get_header_key(const header_link& link) const NOEXCEPT; inline hash_digest get_point_key(const point_link& link) const NOEXCEPT; inline hash_digest get_tx_key(const tx_link& link) const NOEXCEPT; @@ -345,6 +346,8 @@ class query /// False implies not confirmed. bool get_tx_height(size_t& out, const tx_link& link) const NOEXCEPT; bool get_tx_position(size_t& out, const tx_link& link) const NOEXCEPT; + bool get_tx_sizes(size_t& light, size_t& heavy, + const tx_link& link) const NOEXCEPT; /// Terminal implies not found, false implies fault. height_link get_height(const hash_digest& key) const NOEXCEPT; diff --git a/include/bitcoin/database/tables/archives/transaction.hpp b/include/bitcoin/database/tables/archives/transaction.hpp index cf04d5c2..ccf16738 100644 --- a/include/bitcoin/database/tables/archives/transaction.hpp +++ b/include/bitcoin/database/tables/archives/transaction.hpp @@ -297,6 +297,22 @@ struct transaction bool coinbase{}; }; + + struct get_sizes + : public schema::transaction + { + inline bool from_data(reader& source) NOEXCEPT + { + source.skip_byte(); + light = source.read_little_endian(); + heavy = source.read_little_endian(); + return source; + } + + size_t light{}; + size_t heavy{}; + }; + }; } // namespace table diff --git a/include/bitcoin/database/tables/archives/txs.hpp b/include/bitcoin/database/tables/archives/txs.hpp index e2771f49..34f1b17f 100644 --- a/include/bitcoin/database/tables/archives/txs.hpp +++ b/include/bitcoin/database/tables/archives/txs.hpp @@ -168,6 +168,18 @@ struct txs keys tx_fks{}; }; + + struct get_tx_quantity + : public schema::txs + { + inline bool from_data(reader& source) NOEXCEPT + { + quantity = source.read_little_endian(); + return source; + } + + size_t quantity{}; + }; }; } // namespace table diff --git a/test/query/archive.cpp b/test/query/archive.cpp index 57f41a6e..64b54a80 100644 --- a/test/query/archive.cpp +++ b/test/query/archive.cpp @@ -1221,6 +1221,33 @@ BOOST_AUTO_TEST_CASE(query_archive__get_tx_position__always__expected) BOOST_REQUIRE(!query.get_tx_position(out, 5)); } +BOOST_AUTO_TEST_CASE(query_archive__get_tx_sizes__coinbase__204) +{ + settings settings{}; + settings.path = TEST_DIRECTORY; + test::chunk_store store{ settings }; + test::query_accessor query{ store }; + BOOST_REQUIRE(!store.create(events_handler)); + BOOST_REQUIRE(query.initialize(test::genesis)); + + size_t light{}; + size_t heavy{}; + BOOST_REQUIRE(query.get_tx_sizes(light, heavy, 0)); + BOOST_REQUIRE_EQUAL(light, 204u); + BOOST_REQUIRE_EQUAL(heavy, 204u); +} + +BOOST_AUTO_TEST_CASE(query_archive__get_tx_count__coinbase__1) +{ + settings settings{}; + settings.path = TEST_DIRECTORY; + test::chunk_store store{ settings }; + test::query_accessor query{ store }; + BOOST_REQUIRE(!store.create(events_handler)); + BOOST_REQUIRE(query.initialize(test::genesis)); + BOOST_REQUIRE_EQUAL(query.get_tx_count(0), 1u); +} + BOOST_AUTO_TEST_CASE(query_archive__get_input__not_found__nullptr) { settings settings{};