Skip to content

Commit cb3951c

Browse files
committed
Add/test get_position_tx().
1 parent e66f89a commit cb3951c

4 files changed

Lines changed: 72 additions & 1 deletion

File tree

include/bitcoin/database/impl/query/archive_read.ipp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,17 @@ bool CLASS::get_tx_position(size_t& out, const tx_link& link) const NOEXCEPT
189189
return true;
190190
}
191191

192+
TEMPLATE
193+
tx_link CLASS::get_position_tx(const header_link& link,
194+
size_t position) const NOEXCEPT
195+
{
196+
table::txs::get_at_position txs{ {}, position };
197+
if (!store_.txs.at(to_txs(link), txs))
198+
return {};
199+
200+
return txs.tx_fk;
201+
}
202+
192203
// Sizes.
193204
// ----------------------------------------------------------------------------
194205

include/bitcoin/database/query.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,8 +344,10 @@ class query
344344
inline hash_digest get_point_hash(const point_link& link) const NOEXCEPT;
345345

346346
/// False position implies not confirmed (or fault).
347-
bool get_tx_position(size_t& out, const tx_link& link) const NOEXCEPT;
348347
bool get_tx_height(size_t& out, const tx_link& link) const NOEXCEPT;
348+
bool get_tx_position(size_t& out, const tx_link& link) const NOEXCEPT;
349+
tx_link get_position_tx(const header_link& link,
350+
size_t position) const NOEXCEPT;
349351

350352
/// Sizes.
351353
bool get_tx_size(size_t& out, const tx_link& link,

include/bitcoin/database/tables/archives/txs.hpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,37 @@ struct txs
288288
size_t position{};
289289
};
290290

291+
struct get_at_position
292+
: public schema::txs
293+
{
294+
inline link count() const NOEXCEPT
295+
{
296+
BC_ASSERT(false);
297+
return {};
298+
}
299+
300+
inline bool from_data(reader& source) NOEXCEPT
301+
{
302+
// tx sizes
303+
source.skip_bytes(skip_sizes);
304+
305+
// tx fks
306+
const auto number = source.read_little_endian<ct::integer, ct::size>();
307+
if (position < number)
308+
{
309+
source.skip_bytes(position * tx::size);
310+
tx_fk = source.read_little_endian<tx::integer, tx::size>();
311+
return source;
312+
}
313+
314+
source.invalidate();
315+
return source;
316+
}
317+
318+
const size_t position{};
319+
tx::integer tx_fk{};
320+
};
321+
291322
struct get_coinbase
292323
: public schema::txs
293324
{

test/query/archive_read.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,12 @@ BOOST_AUTO_TEST_CASE(query_archive_read__get_tx_position__confirmed__expected)
428428
BOOST_REQUIRE(query.get_tx_position(out, 4));
429429
BOOST_REQUIRE_EQUAL(out, 0u);
430430
BOOST_REQUIRE(!query.get_tx_position(out, 5));
431+
432+
BOOST_REQUIRE_EQUAL(query.get_position_tx(0, 0), 0u);
433+
BOOST_REQUIRE_EQUAL(query.get_position_tx(1, 0), 1u);
434+
BOOST_REQUIRE_EQUAL(query.get_position_tx(2, 0), 2u);
435+
BOOST_REQUIRE_EQUAL(query.get_position_tx(2, 1), 3u);
436+
BOOST_REQUIRE_EQUAL(query.get_position_tx(3, 0), 4u);
431437
}
432438

433439
BOOST_AUTO_TEST_CASE(query_archive_read__get_tx_position__always__expected)
@@ -474,6 +480,27 @@ BOOST_AUTO_TEST_CASE(query_archive_read__get_tx_position__always__expected)
474480
BOOST_REQUIRE(!query.get_tx_position(out, 5));
475481
}
476482

483+
484+
BOOST_AUTO_TEST_CASE(query_archive_read__get_position_tx__always__expected)
485+
{
486+
settings settings{};
487+
settings.path = TEST_DIRECTORY;
488+
test::chunk_store store{ settings };
489+
test::query_accessor query{ store };
490+
BOOST_REQUIRE(!store.create(events_handler));
491+
BOOST_REQUIRE(query.initialize(test::genesis));
492+
BOOST_REQUIRE(query.set(test::block1a, context{ 0, 1, 0 }, false, false));
493+
BOOST_REQUIRE(query.set(test::block2a, context{ 0, 2, 0 }, false, false));
494+
BOOST_REQUIRE(query.set(test::block3a, context{ 0, 3, 0 }, false, false));
495+
496+
BOOST_REQUIRE_EQUAL(query.get_position_tx(0, 0), 0u);
497+
BOOST_REQUIRE_EQUAL(query.get_position_tx(1, 0), 1u);
498+
BOOST_REQUIRE_EQUAL(query.get_position_tx(2, 0), 2u);
499+
BOOST_REQUIRE_EQUAL(query.get_position_tx(2, 1), 3u);
500+
BOOST_REQUIRE_EQUAL(query.get_position_tx(3, 0), 4u);
501+
BOOST_REQUIRE(query.get_position_tx(3, 1).is_terminal());
502+
}
503+
477504
BOOST_AUTO_TEST_CASE(query_archive_read__get_tx_sizes__coinbase__204)
478505
{
479506
settings settings{};

0 commit comments

Comments
 (0)