diff --git a/nano/node/wallet.cpp b/nano/node/wallet.cpp index 6d85ed3a..ebd7c4b4 100644 --- a/nano/node/wallet.cpp +++ b/nano/node/wallet.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -280,7 +281,7 @@ nano::wallet_store::wallet_store (bool & init_a, nano::kdf & kdf_a, store::trans { MDB_val junk; nano::store::lmdb::db_val version_key (version_special); - MDB_val mdb_version_key{ version_key.size (), version_key.data () }; + auto mdb_version_key = nano::store::lmdb::to_mdb_val (version_key); debug_assert (mdb_get (env.tx (transaction_a), handle, &mdb_version_key, &junk) == MDB_NOTFOUND); boost::property_tree::ptree wallet_l; std::stringstream istream (json_a); @@ -317,16 +318,16 @@ nano::wallet_store::wallet_store (bool & init_a, nano::kdf & kdf_a, store::trans nano::store::lmdb::db_val wallet_key_key (wallet_key_special); nano::store::lmdb::db_val salt_key (salt_special); nano::store::lmdb::db_val check_key (check_special); - MDB_val mdb_version_key2{ version_key.size (), version_key.data () }; - MDB_val mdb_wallet_key_key{ wallet_key_key.size (), wallet_key_key.data () }; - MDB_val mdb_salt_key{ salt_key.size (), salt_key.data () }; - MDB_val mdb_check_key{ check_key.size (), check_key.data () }; + auto mdb_version_key2 = nano::store::lmdb::to_mdb_val (version_key); + auto mdb_wallet_key_key = nano::store::lmdb::to_mdb_val (wallet_key_key); + auto mdb_salt_key = nano::store::lmdb::to_mdb_val (salt_key); + auto mdb_check_key = nano::store::lmdb::to_mdb_val (check_key); init_a |= mdb_get (env.tx (transaction_a), handle, &mdb_version_key2, &junk) != 0; init_a |= mdb_get (env.tx (transaction_a), handle, &mdb_wallet_key_key, &junk) != 0; init_a |= mdb_get (env.tx (transaction_a), handle, &mdb_salt_key, &junk) != 0; init_a |= mdb_get (env.tx (transaction_a), handle, &mdb_check_key, &junk) != 0; nano::store::lmdb::db_val rep_key (representative_special); - MDB_val mdb_rep_key{ rep_key.size (), rep_key.data () }; + auto mdb_rep_key = nano::store::lmdb::to_mdb_val (rep_key); init_a |= mdb_get (env.tx (transaction_a), handle, &mdb_rep_key, &junk) != 0; nano::raw_key key; key.clear (); @@ -349,7 +350,7 @@ nano::wallet_store::wallet_store (bool & init_a, nano::kdf & kdf_a, store::trans int version_status; MDB_val version_value; nano::store::lmdb::db_val version_lookup_key (version_special); - MDB_val mdb_version_lookup_key{ version_lookup_key.size (), version_lookup_key.data () }; + auto mdb_version_lookup_key = nano::store::lmdb::to_mdb_val (version_lookup_key); version_status = mdb_get (env.tx (transaction_a), handle, &mdb_version_lookup_key, &version_value); if (version_status == MDB_NOTFOUND) { @@ -464,12 +465,12 @@ nano::wallet_value nano::wallet_store::entry_get_raw (store::transaction const & nano::wallet_value result; nano::store::lmdb::db_val value; nano::store::lmdb::db_val pub_key (pub_a); - MDB_val mdb_pub_key{ pub_key.size (), pub_key.data () }; + auto mdb_pub_key = nano::store::lmdb::to_mdb_val (pub_key); MDB_val mdb_value{}; auto status (mdb_get (env.tx (transaction_a), handle, &mdb_pub_key, &mdb_value)); if (status == 0) { - value.span_view = std::span (static_cast (mdb_value.mv_data), mdb_value.mv_size); + value = nano::store::lmdb::from_mdb_val (mdb_value); result = nano::wallet_value (value); } else @@ -484,8 +485,8 @@ void nano::wallet_store::entry_put_raw (store::transaction const & transaction_a { nano::store::lmdb::db_val pub_key (pub_a); nano::store::lmdb::db_val entry_val (sizeof (entry_a), const_cast (&entry_a)); - MDB_val mdb_pub_key{ pub_key.size (), pub_key.data () }; - MDB_val mdb_entry_val{ entry_val.size (), entry_val.data () }; + auto mdb_pub_key = nano::store::lmdb::to_mdb_val (pub_key); + auto mdb_entry_val = nano::store::lmdb::to_mdb_val (entry_val); auto status (mdb_put (env.tx (transaction_a), handle, &mdb_pub_key, &mdb_entry_val, 0)); (void)status; debug_assert (status == 0); @@ -1031,7 +1032,7 @@ std::shared_ptr nano::wallet::send_action (nano::account const & so auto status (mdb_get (wallets.env.tx (transaction), wallets.node.wallets.send_action_ids, &mdb_id_key, &mdb_result)); if (status == 0) { - result.span_view = std::span (static_cast (mdb_result.mv_data), mdb_result.mv_size); + result = nano::store::lmdb::from_mdb_val (mdb_result); nano::block_hash hash (result); block = wallets.node.ledger.any.block_get (block_transaction, hash); if (block != nullptr) @@ -1085,8 +1086,8 @@ std::shared_ptr nano::wallet::send_action (nano::account const & so if (id_mdb_val && block != nullptr) { nano::store::lmdb::db_val hash_val (block->hash ()); - MDB_val mdb_id_key{ id_mdb_val->size (), id_mdb_val->data () }; - MDB_val mdb_hash_val{ hash_val.size (), hash_val.data () }; + auto mdb_id_key = nano::store::lmdb::to_mdb_val (*id_mdb_val); + auto mdb_hash_val = nano::store::lmdb::to_mdb_val (hash_val); auto status (mdb_put (wallets.env.tx (transaction), wallets.node.wallets.send_action_ids, &mdb_id_key, &mdb_hash_val, 0)); if (status != 0) { @@ -1473,8 +1474,8 @@ nano::wallets::wallets (bool error_a, nano::node & node_a) : nano::store::lmdb::db_val beginning_val{ beginning.size (), const_cast (beginning.c_str ()) }; std::string end ((nano::uint256_union (nano::uint256_t (0) - nano::uint256_t (1))).to_string ()); nano::store::lmdb::db_val end_val{ end.size (), const_cast (end.c_str ()) }; - MDB_val mdb_beginning_val{ beginning_val.size (), beginning_val.data () }; - MDB_val mdb_end_val{ end_val.size (), end_val.data () }; + auto mdb_beginning_val = nano::store::lmdb::to_mdb_val (beginning_val); + auto mdb_end_val = nano::store::lmdb::to_mdb_val (end_val); store::iterator i{ store::lmdb::iterator::lower_bound (env.tx (transaction), handle, mdb_beginning_val) }; store::iterator n{ store::lmdb::iterator::lower_bound (env.tx (transaction), handle, mdb_end_val) }; for (; i != n; ++i) @@ -1635,8 +1636,8 @@ void nano::wallets::reload () nano::store::lmdb::db_val beginning_val{ beginning.size (), const_cast (beginning.c_str ()) }; std::string end ((nano::uint256_union (nano::uint256_t (0) - nano::uint256_t (1))).to_string ()); nano::store::lmdb::db_val end_val{ end.size (), const_cast (end.c_str ()) }; - MDB_val mdb_beginning_val{ beginning_val.size (), beginning_val.data () }; - MDB_val mdb_end_val{ end_val.size (), end_val.data () }; + auto mdb_beginning_val = nano::store::lmdb::to_mdb_val (beginning_val); + auto mdb_end_val = nano::store::lmdb::to_mdb_val (end_val); store::iterator i{ store::lmdb::iterator::lower_bound (env.tx (transaction), handle, mdb_beginning_val) }; store::iterator n{ store::lmdb::iterator::lower_bound (env.tx (transaction), handle, mdb_end_val) }; for (; i != n; ++i) @@ -1882,17 +1883,13 @@ nano::uint128_t const nano::wallets::high_priority = std::numeric_limits iterator { nano::account account{ special_count }; - nano::store::lmdb::db_val val{ account }; - MDB_val mdb_val{ val.size (), val.data () }; - return iterator{ store::iterator{ store::lmdb::iterator::lower_bound (env.tx (transaction_a), handle, mdb_val) } }; + return iterator{ store::iterator{ store::lmdb::iterator::lower_bound (env.tx (transaction_a), handle, store::lmdb::to_mdb_val (account)) } }; } auto nano::wallet_store::begin (store::transaction const & transaction_a, nano::account const & key) -> iterator { nano::account account (key); - nano::store::lmdb::db_val val{ account }; - MDB_val mdb_val{ val.size (), val.data () }; - return iterator{ store::iterator{ store::lmdb::iterator::lower_bound (env.tx (transaction_a), handle, mdb_val) } }; + return iterator{ store::iterator{ store::lmdb::iterator::lower_bound (env.tx (transaction_a), handle, store::lmdb::to_mdb_val (account)) } }; } auto nano::wallet_store::find (store::transaction const & transaction_a, nano::account const & key) -> iterator diff --git a/nano/store/db_val.hpp b/nano/store/db_val.hpp index 3e4d8af5..42fdb59b 100644 --- a/nano/store/db_val.hpp +++ b/nano/store/db_val.hpp @@ -42,6 +42,12 @@ public: { } + db_val (std::shared_ptr> buffer_a) : + buffer (buffer_a) + { + convert_buffer_to_value (); + } + db_val (nano::uint128_union const & val_a) : span_view (val_a.bytes.data (), sizeof (val_a)) { diff --git a/nano/store/lmdb/account.cpp b/nano/store/lmdb/account.cpp index 607bee11..58072a42 100644 --- a/nano/store/lmdb/account.cpp +++ b/nano/store/lmdb/account.cpp @@ -2,6 +2,7 @@ #include #include #include +#include nano::store::lmdb::account::account (nano::store::lmdb::component & store_a) : store (store_a){}; @@ -45,9 +46,7 @@ size_t nano::store::lmdb::account::count (store::transaction const & transaction auto nano::store::lmdb::account::begin (store::transaction const & transaction, nano::account const & account) const -> iterator { - lmdb::db_val val{ account }; - MDB_val mdb_val{ val.size (), val.data () }; - return iterator{ store::iterator{ lmdb::iterator::lower_bound (store.env.tx (transaction), accounts_handle, mdb_val) } }; + return iterator{ store::iterator{ lmdb::iterator::lower_bound (store.env.tx (transaction), accounts_handle, to_mdb_val (account)) } }; } auto nano::store::lmdb::account::begin (store::transaction const & transaction) const -> iterator diff --git a/nano/store/lmdb/block.cpp b/nano/store/lmdb/block.cpp index dbd23167..e2b823ca 100644 --- a/nano/store/lmdb/block.cpp +++ b/nano/store/lmdb/block.cpp @@ -2,6 +2,7 @@ #include #include #include +#include namespace nano::store::lmdb { @@ -129,9 +130,7 @@ auto nano::store::lmdb::block::begin (store::transaction const & transaction) co auto nano::store::lmdb::block::begin (store::transaction const & transaction, nano::block_hash const & hash) const -> iterator { - lmdb::db_val val{ hash }; - MDB_val mdb_val{ val.size (), val.data () }; - return iterator{ store::iterator{ lmdb::iterator::lower_bound (store.env.tx (transaction), blocks_handle, mdb_val) } }; + return iterator{ store::iterator{ lmdb::iterator::lower_bound (store.env.tx (transaction), blocks_handle, to_mdb_val (hash)) } }; } auto nano::store::lmdb::block::end (store::transaction const & transaction_a) const -> iterator diff --git a/nano/store/lmdb/confirmation_height.cpp b/nano/store/lmdb/confirmation_height.cpp index 3dd6cf6e..f175d33c 100644 --- a/nano/store/lmdb/confirmation_height.cpp +++ b/nano/store/lmdb/confirmation_height.cpp @@ -1,6 +1,7 @@ #include #include #include +#include nano::store::lmdb::confirmation_height::confirmation_height (nano::store::lmdb::component & store) : store{ store } @@ -61,9 +62,7 @@ void nano::store::lmdb::confirmation_height::clear (store::write_transaction con auto nano::store::lmdb::confirmation_height::begin (store::transaction const & transaction, nano::account const & account) const -> iterator { - lmdb::db_val val{ account }; - MDB_val mdb_val{ val.size (), val.data () }; - return iterator{ store::iterator{ lmdb::iterator::lower_bound (store.env.tx (transaction), confirmation_height_handle, mdb_val) } }; + return iterator{ store::iterator{ lmdb::iterator::lower_bound (store.env.tx (transaction), confirmation_height_handle, to_mdb_val (account)) } }; } auto nano::store::lmdb::confirmation_height::begin (store::transaction const & transaction) const -> iterator diff --git a/nano/store/lmdb/final_vote.cpp b/nano/store/lmdb/final_vote.cpp index dcd52549..c27f3f70 100644 --- a/nano/store/lmdb/final_vote.cpp +++ b/nano/store/lmdb/final_vote.cpp @@ -1,6 +1,7 @@ #include #include #include +#include nano::store::lmdb::final_vote::final_vote (nano::store::lmdb::component & store) : store{ store } {}; @@ -53,9 +54,7 @@ void nano::store::lmdb::final_vote::clear (store::write_transaction const & tran auto nano::store::lmdb::final_vote::begin (store::transaction const & transaction, nano::qualified_root const & root) const -> iterator { - lmdb::db_val val{ root }; - MDB_val mdb_val{ val.size (), val.data () }; - return iterator{ store::iterator{ lmdb::iterator::lower_bound (store.env.tx (transaction), final_votes_handle, mdb_val) } }; + return iterator{ store::iterator{ lmdb::iterator::lower_bound (store.env.tx (transaction), final_votes_handle, to_mdb_val (root)) } }; } auto nano::store::lmdb::final_vote::begin (store::transaction const & transaction) const -> iterator diff --git a/nano/store/lmdb/lmdb.cpp b/nano/store/lmdb/lmdb.cpp index 2ed6febe..bbfa6b76 100644 --- a/nano/store/lmdb/lmdb.cpp +++ b/nano/store/lmdb/lmdb.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -405,28 +406,27 @@ bool nano::store::lmdb::component::exists (store::transaction const & transactio int nano::store::lmdb::component::get (store::transaction const & transaction_a, tables table_a, nano::store::lmdb::db_val const & key_a, nano::store::lmdb::db_val & value_a) const { - MDB_val mdb_key{ key_a.size (), key_a.data () }; + auto mdb_key = to_mdb_val (key_a); MDB_val mdb_value{}; - + auto result = mdb_get (env.tx (transaction_a), table_to_dbi (table_a), &mdb_key, &mdb_value); if (result == MDB_SUCCESS) { - // Update value_a span_view to point to the retrieved data - value_a.span_view = std::span (static_cast (mdb_value.mv_data), mdb_value.mv_size); + value_a = from_mdb_val (mdb_value); } return result; } int nano::store::lmdb::component::put (store::write_transaction const & transaction_a, tables table_a, nano::store::lmdb::db_val const & key_a, nano::store::lmdb::db_val const & value_a) const { - MDB_val mdb_key{ key_a.size (), key_a.data () }; - MDB_val mdb_value{ value_a.size (), value_a.data () }; + auto mdb_key = to_mdb_val (key_a); + auto mdb_value = to_mdb_val (value_a); return (mdb_put (env.tx (transaction_a), table_to_dbi (table_a), &mdb_key, &mdb_value, 0)); } int nano::store::lmdb::component::del (store::write_transaction const & transaction_a, tables table_a, nano::store::lmdb::db_val const & key_a) const { - MDB_val mdb_key{ key_a.size (), key_a.data () }; + auto mdb_key = to_mdb_val (key_a); return (mdb_del (env.tx (transaction_a), table_to_dbi (table_a), &mdb_key, nullptr)); } @@ -515,8 +515,8 @@ void nano::store::lmdb::component::rebuild_db (store::write_transaction const & for (typed_iterator i{ store::iterator{ iterator::begin (env.tx (transaction_a), table) } }, n{ store::iterator{ iterator::end (env.tx (transaction_a), table) } }; i != n; ++i) { nano::store::lmdb::db_val key_val (i->first); - MDB_val mdb_key{ key_val.size (), key_val.data () }; - MDB_val mdb_value{ i->second.size (), i->second.data () }; + auto mdb_key = to_mdb_val (key_val); + auto mdb_value = to_mdb_val (i->second); auto s = mdb_put (env.tx (transaction_a), temp, &mdb_key, &mdb_value, MDB_APPEND); release_assert_success (s); } @@ -527,8 +527,8 @@ void nano::store::lmdb::component::rebuild_db (store::write_transaction const & for (typed_iterator i{ store::iterator{ iterator::begin (env.tx (transaction_a), temp) } }, n{ store::iterator{ iterator::end (env.tx (transaction_a), temp) } }; i != n; ++i) { nano::store::lmdb::db_val key_val (i->first); - MDB_val mdb_key{ key_val.size (), key_val.data () }; - MDB_val mdb_value{ i->second.size (), i->second.data () }; + auto mdb_key = to_mdb_val (key_val); + auto mdb_value = to_mdb_val (i->second); auto s = mdb_put (env.tx (transaction_a), table, &mdb_key, &mdb_value, MDB_APPEND); release_assert_success (s); } @@ -545,8 +545,8 @@ void nano::store::lmdb::component::rebuild_db (store::write_transaction const & { nano::store::lmdb::db_val key_val (i->first); nano::store::lmdb::db_val value_val (i->second); - MDB_val mdb_key{ key_val.size (), key_val.data () }; - MDB_val mdb_value{ value_val.size (), value_val.data () }; + auto mdb_key = to_mdb_val (key_val); + auto mdb_value = to_mdb_val (value_val); auto s = mdb_put (env.tx (transaction_a), temp, &mdb_key, &mdb_value, MDB_APPEND); release_assert_success (s); } @@ -557,8 +557,8 @@ void nano::store::lmdb::component::rebuild_db (store::write_transaction const & { nano::store::lmdb::db_val key_val (i->first); nano::store::lmdb::db_val value_val (i->second); - MDB_val mdb_key{ key_val.size (), key_val.data () }; - MDB_val mdb_value{ value_val.size (), value_val.data () }; + auto mdb_key = to_mdb_val (key_val); + auto mdb_value = to_mdb_val (value_val); auto s = mdb_put (env.tx (transaction_a), pending_store.pending_handle, &mdb_key, &mdb_value, MDB_APPEND); release_assert_success (s); } diff --git a/nano/store/lmdb/pending.cpp b/nano/store/lmdb/pending.cpp index 1cc116fd..fb9b17e9 100644 --- a/nano/store/lmdb/pending.cpp +++ b/nano/store/lmdb/pending.cpp @@ -1,6 +1,7 @@ #include #include #include +#include nano::store::lmdb::pending::pending (nano::store::lmdb::component & store) : store{ store } {}; @@ -47,9 +48,7 @@ bool nano::store::lmdb::pending::any (store::transaction const & transaction_a, auto nano::store::lmdb::pending::begin (store::transaction const & transaction_a, nano::pending_key const & key_a) const -> iterator { - lmdb::db_val val{ key_a }; - MDB_val mdb_val{ val.size (), val.data () }; - return iterator{ store::iterator{ lmdb::iterator::lower_bound (store.env.tx (transaction_a), pending_handle, mdb_val) } }; + return iterator{ store::iterator{ lmdb::iterator::lower_bound (store.env.tx (transaction_a), pending_handle, to_mdb_val (key_a)) } }; } auto nano::store::lmdb::pending::begin (store::transaction const & transaction_a) const -> iterator diff --git a/nano/store/lmdb/pruned.cpp b/nano/store/lmdb/pruned.cpp index 2d425c16..2eeedf91 100644 --- a/nano/store/lmdb/pruned.cpp +++ b/nano/store/lmdb/pruned.cpp @@ -1,6 +1,7 @@ #include #include #include +#include nano::store::lmdb::pruned::pruned (nano::store::lmdb::component & store_a) : store{ store_a } {}; @@ -47,9 +48,7 @@ void nano::store::lmdb::pruned::clear (store::write_transaction const & transact auto nano::store::lmdb::pruned::begin (store::transaction const & transaction, nano::block_hash const & hash) const -> iterator { - lmdb::db_val val{ hash }; - MDB_val mdb_val{ val.size (), val.data () }; - return iterator{ store::iterator{ lmdb::iterator::lower_bound (store.env.tx (transaction), pruned_handle, mdb_val) } }; + return iterator{ store::iterator{ lmdb::iterator::lower_bound (store.env.tx (transaction), pruned_handle, to_mdb_val (hash)) } }; } auto nano::store::lmdb::pruned::begin (store::transaction const & transaction) const -> iterator diff --git a/nano/store/lmdb/rep_weight.cpp b/nano/store/lmdb/rep_weight.cpp index 6b51c3e7..d5e180d3 100644 --- a/nano/store/lmdb/rep_weight.cpp +++ b/nano/store/lmdb/rep_weight.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -45,9 +46,7 @@ void nano::store::lmdb::rep_weight::del (store::write_transaction const & txn_a, auto nano::store::lmdb::rep_weight::begin (store::transaction const & transaction_a, nano::account const & representative_a) const -> iterator { - lmdb::db_val val{ representative_a }; - MDB_val mdb_val{ val.size (), val.data () }; - return iterator{ store::iterator{ lmdb::iterator::lower_bound (store.env.tx (transaction_a), rep_weights_handle, mdb_val) } }; + return iterator{ store::iterator{ lmdb::iterator::lower_bound (store.env.tx (transaction_a), rep_weights_handle, to_mdb_val (representative_a)) } }; } auto nano::store::lmdb::rep_weight::begin (store::transaction const & transaction_a) const -> iterator diff --git a/nano/store/lmdb/utility.hpp b/nano/store/lmdb/utility.hpp new file mode 100644 index 00000000..bbf4d0b5 --- /dev/null +++ b/nano/store/lmdb/utility.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include + +#include + +namespace nano::store::lmdb +{ +/** + * Converts a db_val to MDB_val for LMDB operations + */ +inline MDB_val to_mdb_val (nano::store::db_val const & val) +{ + return MDB_val{ val.size (), val.data () }; +} + +/** + * Creates a db_val from MDB_val for read operations + */ +inline nano::store::db_val from_mdb_val (MDB_val const & val) +{ + auto span = std::span{ static_cast (val.mv_data), val.mv_size }; + return nano::store::db_val (span); +} +} \ No newline at end of file diff --git a/nano/store/rocksdb/account.cpp b/nano/store/rocksdb/account.cpp index 35d17d34..0ba2e4cb 100644 --- a/nano/store/rocksdb/account.cpp +++ b/nano/store/rocksdb/account.cpp @@ -45,9 +45,7 @@ size_t nano::store::rocksdb::account::count (store::transaction const & transact auto nano::store::rocksdb::account::begin (store::transaction const & transaction, nano::account const & account) const -> iterator { - rocksdb::db_val val{ account }; - ::rocksdb::Slice slice{ reinterpret_cast (val.data ()), val.size () }; - return iterator{ store::iterator{ rocksdb::iterator::lower_bound (store.db.get (), rocksdb::tx (transaction), store.table_to_column_family (tables::accounts), slice) } }; + return iterator{ store::iterator{ rocksdb::iterator::lower_bound (store.db.get (), rocksdb::tx (transaction), store.table_to_column_family (tables::accounts), to_slice (account)) } }; } auto nano::store::rocksdb::account::begin (store::transaction const & transaction) const -> iterator diff --git a/nano/store/rocksdb/block.cpp b/nano/store/rocksdb/block.cpp index 9b3882cc..8ac63885 100644 --- a/nano/store/rocksdb/block.cpp +++ b/nano/store/rocksdb/block.cpp @@ -130,9 +130,7 @@ auto nano::store::rocksdb::block::begin (store::transaction const & transaction) auto nano::store::rocksdb::block::begin (store::transaction const & transaction, nano::block_hash const & hash) const -> iterator { - rocksdb::db_val val{ hash }; - ::rocksdb::Slice slice{ reinterpret_cast (val.data ()), val.size () }; - return iterator{ store::iterator{ rocksdb::iterator::lower_bound (store.db.get (), rocksdb::tx (transaction), store.table_to_column_family (tables::blocks), slice) } }; + return iterator{ store::iterator{ rocksdb::iterator::lower_bound (store.db.get (), rocksdb::tx (transaction), store.table_to_column_family (tables::blocks), to_slice (hash)) } }; } auto nano::store::rocksdb::block::end (store::transaction const & transaction_a) const -> iterator diff --git a/nano/store/rocksdb/confirmation_height.cpp b/nano/store/rocksdb/confirmation_height.cpp index 229acdfd..d76d7b81 100644 --- a/nano/store/rocksdb/confirmation_height.cpp +++ b/nano/store/rocksdb/confirmation_height.cpp @@ -62,9 +62,7 @@ void nano::store::rocksdb::confirmation_height::clear (store::write_transaction auto nano::store::rocksdb::confirmation_height::begin (store::transaction const & transaction, nano::account const & account) const -> iterator { - rocksdb::db_val val{ account }; - ::rocksdb::Slice slice{ reinterpret_cast (val.data ()), val.size () }; - return iterator{ store::iterator{ rocksdb::iterator::lower_bound (store.db.get (), rocksdb::tx (transaction), store.table_to_column_family (tables::confirmation_height), slice) } }; + return iterator{ store::iterator{ rocksdb::iterator::lower_bound (store.db.get (), rocksdb::tx (transaction), store.table_to_column_family (tables::confirmation_height), to_slice (account)) } }; } auto nano::store::rocksdb::confirmation_height::begin (store::transaction const & transaction) const -> iterator diff --git a/nano/store/rocksdb/final_vote.cpp b/nano/store/rocksdb/final_vote.cpp index f57f2fbd..7de8f991 100644 --- a/nano/store/rocksdb/final_vote.cpp +++ b/nano/store/rocksdb/final_vote.cpp @@ -54,9 +54,7 @@ void nano::store::rocksdb::final_vote::clear (store::write_transaction const & t auto nano::store::rocksdb::final_vote::begin (store::transaction const & transaction, nano::qualified_root const & root) const -> iterator { - rocksdb::db_val val{ root }; - ::rocksdb::Slice slice{ reinterpret_cast (val.data ()), val.size () }; - return iterator{ store::iterator{ rocksdb::iterator::lower_bound (store.db.get (), rocksdb::tx (transaction), store.table_to_column_family (tables::final_votes), slice) } }; + return iterator{ store::iterator{ rocksdb::iterator::lower_bound (store.db.get (), rocksdb::tx (transaction), store.table_to_column_family (tables::final_votes), to_slice (root)) } }; } auto nano::store::rocksdb::final_vote::begin (store::transaction const & transaction) const -> iterator diff --git a/nano/store/rocksdb/pending.cpp b/nano/store/rocksdb/pending.cpp index 40fe743b..ab958883 100644 --- a/nano/store/rocksdb/pending.cpp +++ b/nano/store/rocksdb/pending.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include @@ -48,9 +48,7 @@ bool nano::store::rocksdb::pending::any (store::transaction const & transaction_ auto nano::store::rocksdb::pending::begin (store::transaction const & transaction_a, nano::pending_key const & key_a) const -> iterator { - rocksdb::db_val val{ key_a }; - ::rocksdb::Slice slice{ reinterpret_cast (val.data ()), val.size () }; - return iterator{ store::iterator{ rocksdb::iterator::lower_bound (store.db.get (), rocksdb::tx (transaction_a), store.table_to_column_family (tables::pending), slice) } }; + return iterator{ store::iterator{ rocksdb::iterator::lower_bound (store.db.get (), rocksdb::tx (transaction_a), store.table_to_column_family (tables::pending), to_slice (key_a)) } }; } auto nano::store::rocksdb::pending::begin (store::transaction const & transaction_a) const -> iterator diff --git a/nano/store/rocksdb/pending.hpp b/nano/store/rocksdb/pending.hpp index 061d0031..45274975 100644 --- a/nano/store/rocksdb/pending.hpp +++ b/nano/store/rocksdb/pending.hpp @@ -2,6 +2,10 @@ #include +namespace nano::store::rocksdb +{ +class component; +} namespace nano::store::rocksdb { class pending : public nano::store::pending diff --git a/nano/store/rocksdb/pruned.cpp b/nano/store/rocksdb/pruned.cpp index c3f387ef..0a2f869b 100644 --- a/nano/store/rocksdb/pruned.cpp +++ b/nano/store/rocksdb/pruned.cpp @@ -48,9 +48,7 @@ void nano::store::rocksdb::pruned::clear (store::write_transaction const & trans auto nano::store::rocksdb::pruned::begin (store::transaction const & transaction_a, nano::block_hash const & hash_a) const -> iterator { - rocksdb::db_val val{ hash_a }; - ::rocksdb::Slice slice{ reinterpret_cast (val.data ()), val.size () }; - return iterator{ store::iterator{ rocksdb::iterator::lower_bound (store.db.get (), rocksdb::tx (transaction_a), store.table_to_column_family (tables::pruned), slice) } }; + return iterator{ store::iterator{ rocksdb::iterator::lower_bound (store.db.get (), rocksdb::tx (transaction_a), store.table_to_column_family (tables::pruned), to_slice (hash_a)) } }; } auto nano::store::rocksdb::pruned::begin (store::transaction const & transaction_a) const -> iterator diff --git a/nano/store/rocksdb/rep_weight.cpp b/nano/store/rocksdb/rep_weight.cpp index bea73196..eeb1b560 100644 --- a/nano/store/rocksdb/rep_weight.cpp +++ b/nano/store/rocksdb/rep_weight.cpp @@ -45,9 +45,7 @@ void nano::store::rocksdb::rep_weight::del (store::write_transaction const & txn auto nano::store::rocksdb::rep_weight::begin (store::transaction const & txn_a, nano::account const & representative_a) const -> iterator { - rocksdb::db_val val{ representative_a }; - ::rocksdb::Slice slice{ reinterpret_cast (val.data ()), val.size () }; - return iterator{ store::iterator{ rocksdb::iterator::lower_bound (store.db.get (), rocksdb::tx (txn_a), store.table_to_column_family (tables::rep_weights), slice) } }; + return iterator{ store::iterator{ rocksdb::iterator::lower_bound (store.db.get (), rocksdb::tx (txn_a), store.table_to_column_family (tables::rep_weights), to_slice (representative_a)) } }; } auto nano::store::rocksdb::rep_weight::begin (store::transaction const & txn_a) const -> iterator diff --git a/nano/store/rocksdb/rocksdb.cpp b/nano/store/rocksdb/rocksdb.cpp index 755ef153..fa69b66d 100644 --- a/nano/store/rocksdb/rocksdb.cpp +++ b/nano/store/rocksdb/rocksdb.cpp @@ -533,7 +533,7 @@ rocksdb::ColumnFamilyHandle * nano::store::rocksdb::component::table_to_column_f bool nano::store::rocksdb::component::exists (store::transaction const & transaction_a, tables table_a, nano::store::rocksdb::db_val const & key_a) const { ::rocksdb::PinnableSlice slice; - ::rocksdb::Slice key_slice{ reinterpret_cast (key_a.data ()), key_a.size () }; + auto key_slice = to_slice (key_a); auto internals = rocksdb::tx (transaction_a); auto status = std::visit ([&] (auto && ptr) { using V = std::remove_cvref_t; @@ -563,7 +563,7 @@ int nano::store::rocksdb::component::del (store::write_transaction const & trans // RocksDB does not report not_found status, it is a pre-condition that the key exists debug_assert (exists (transaction_a, table_a, key_a)); flush_tombstones_check (table_a); - ::rocksdb::Slice key_slice{ reinterpret_cast (key_a.data ()), key_a.size () }; + auto key_slice = to_slice (key_a); return std::get<::rocksdb::Transaction *> (rocksdb::tx (transaction_a))->Delete (table_to_column_family (table_a), key_slice).code (); } @@ -591,7 +591,7 @@ int nano::store::rocksdb::component::get (store::transaction const & transaction { ::rocksdb::ReadOptions options; ::rocksdb::PinnableSlice slice; - ::rocksdb::Slice key_slice{ reinterpret_cast (key_a.data ()), key_a.size () }; + auto key_slice = to_slice (key_a); auto handle = table_to_column_family (table_a); auto internals = rocksdb::tx (transaction_a); auto status = std::visit ([&] (auto && ptr) { @@ -613,9 +613,7 @@ int nano::store::rocksdb::component::get (store::transaction const & transaction if (status.ok ()) { - value_a.buffer = std::make_shared> (slice.size ()); - std::memcpy (value_a.buffer->data (), slice.data (), slice.size ()); - value_a.convert_buffer_to_value (); + value_a = from_slice (slice); } return status.code (); } @@ -623,8 +621,8 @@ int nano::store::rocksdb::component::get (store::transaction const & transaction int nano::store::rocksdb::component::put (store::write_transaction const & transaction_a, tables table_a, nano::store::rocksdb::db_val const & key_a, nano::store::rocksdb::db_val const & value_a) { debug_assert (transaction_a.contains (table_a)); - ::rocksdb::Slice key_slice{ reinterpret_cast (key_a.data ()), key_a.size () }; - ::rocksdb::Slice value_slice{ reinterpret_cast (value_a.data ()), value_a.size () }; + auto key_slice = to_slice (key_a); + auto value_slice = to_slice (value_a); return std::get<::rocksdb::Transaction *> (rocksdb::tx (transaction_a))->Put (table_to_column_family (table_a), key_slice, value_slice).code (); } diff --git a/nano/store/rocksdb/utility.hpp b/nano/store/rocksdb/utility.hpp index 7686b6b4..aff0e32d 100644 --- a/nano/store/rocksdb/utility.hpp +++ b/nano/store/rocksdb/utility.hpp @@ -1,7 +1,10 @@ #pragma once +#include + #include +#include #include namespace nano::store @@ -12,4 +15,23 @@ class transaction; namespace nano::store::rocksdb { auto tx (store::transaction const & transaction_a) -> std::variant<::rocksdb::Transaction *, ::rocksdb::ReadOptions *>; + +/** + * Converts a db_val to rocksdb::Slice for RocksDB operations + */ +inline ::rocksdb::Slice to_slice (nano::store::db_val const & val) +{ + return ::rocksdb::Slice{ reinterpret_cast (val.data ()), val.size () }; +} + +/** + * Creates a db_val from rocksdb::Slice for read operations + */ +inline nano::store::db_val from_slice (::rocksdb::Slice const & slice) +{ + auto buffer = std::make_shared> ( + reinterpret_cast (slice.data ()), + reinterpret_cast (slice.data ()) + slice.size ()); + return nano::store::db_val (buffer); +} }