Use span in db_val
instead of database specific types
This commit is contained in:
parent
986aa92187
commit
e8f8e581c4
13 changed files with 187 additions and 195 deletions
|
@ -279,7 +279,8 @@ nano::wallet_store::wallet_store (bool & init_a, nano::kdf & kdf_a, store::trans
|
|||
if (!init_a)
|
||||
{
|
||||
MDB_val junk;
|
||||
debug_assert (mdb_get (env.tx (transaction_a), handle, nano::store::lmdb::db_val (version_special), &junk) == MDB_NOTFOUND);
|
||||
nano::store::lmdb::db_val version_key (version_special);
|
||||
debug_assert (mdb_get (env.tx (transaction_a), handle, version_key.mdb_val_ptr (), &junk) == MDB_NOTFOUND);
|
||||
boost::property_tree::ptree wallet_l;
|
||||
std::stringstream istream (json_a);
|
||||
try
|
||||
|
@ -312,11 +313,15 @@ nano::wallet_store::wallet_store (bool & init_a, nano::kdf & kdf_a, store::trans
|
|||
init_a = true;
|
||||
}
|
||||
}
|
||||
init_a |= mdb_get (env.tx (transaction_a), handle, nano::store::lmdb::db_val (version_special), &junk) != 0;
|
||||
init_a |= mdb_get (env.tx (transaction_a), handle, nano::store::lmdb::db_val (wallet_key_special), &junk) != 0;
|
||||
init_a |= mdb_get (env.tx (transaction_a), handle, nano::store::lmdb::db_val (salt_special), &junk) != 0;
|
||||
init_a |= mdb_get (env.tx (transaction_a), handle, nano::store::lmdb::db_val (check_special), &junk) != 0;
|
||||
init_a |= mdb_get (env.tx (transaction_a), handle, nano::store::lmdb::db_val (representative_special), &junk) != 0;
|
||||
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);
|
||||
init_a |= mdb_get (env.tx (transaction_a), handle, version_key.mdb_val_ptr (), &junk) != 0;
|
||||
init_a |= mdb_get (env.tx (transaction_a), handle, wallet_key_key.mdb_val_ptr (), &junk) != 0;
|
||||
init_a |= mdb_get (env.tx (transaction_a), handle, salt_key.mdb_val_ptr (), &junk) != 0;
|
||||
init_a |= mdb_get (env.tx (transaction_a), handle, check_key.mdb_val_ptr (), &junk) != 0;
|
||||
nano::store::lmdb::db_val rep_key (representative_special);
|
||||
init_a |= mdb_get (env.tx (transaction_a), handle, rep_key.mdb_val_ptr (), &junk) != 0;
|
||||
nano::raw_key key;
|
||||
key.clear ();
|
||||
password.value_set (key);
|
||||
|
@ -337,7 +342,8 @@ nano::wallet_store::wallet_store (bool & init_a, nano::kdf & kdf_a, store::trans
|
|||
{
|
||||
int version_status;
|
||||
MDB_val version_value;
|
||||
version_status = mdb_get (env.tx (transaction_a), handle, nano::store::lmdb::db_val (version_special), &version_value);
|
||||
nano::store::lmdb::db_val version_lookup_key (version_special);
|
||||
version_status = mdb_get (env.tx (transaction_a), handle, version_lookup_key.mdb_val_ptr (), &version_value);
|
||||
if (version_status == MDB_NOTFOUND)
|
||||
{
|
||||
version_put (transaction_a, version_current);
|
||||
|
@ -439,7 +445,8 @@ bool nano::wallet_store::insert_watch (store::transaction const & transaction_a,
|
|||
|
||||
void nano::wallet_store::erase (store::transaction const & transaction_a, nano::account const & pub)
|
||||
{
|
||||
auto status (mdb_del (env.tx (transaction_a), handle, nano::store::lmdb::db_val (pub), nullptr));
|
||||
nano::store::lmdb::db_val pub_key (pub);
|
||||
auto status (mdb_del (env.tx (transaction_a), handle, pub_key.mdb_val_ptr (), nullptr));
|
||||
(void)status;
|
||||
debug_assert (status == 0);
|
||||
}
|
||||
|
@ -448,7 +455,8 @@ nano::wallet_value nano::wallet_store::entry_get_raw (store::transaction const &
|
|||
{
|
||||
nano::wallet_value result;
|
||||
nano::store::lmdb::db_val value;
|
||||
auto status (mdb_get (env.tx (transaction_a), handle, nano::store::lmdb::db_val (pub_a), value));
|
||||
nano::store::lmdb::db_val pub_key (pub_a);
|
||||
auto status (mdb_get (env.tx (transaction_a), handle, pub_key.mdb_val_ptr (), value.mdb_val_ptr ()));
|
||||
if (status == 0)
|
||||
{
|
||||
result = nano::wallet_value (value);
|
||||
|
@ -463,7 +471,9 @@ nano::wallet_value nano::wallet_store::entry_get_raw (store::transaction const &
|
|||
|
||||
void nano::wallet_store::entry_put_raw (store::transaction const & transaction_a, nano::account const & pub_a, nano::wallet_value const & entry_a)
|
||||
{
|
||||
auto status (mdb_put (env.tx (transaction_a), handle, nano::store::lmdb::db_val (pub_a), nano::store::lmdb::db_val (sizeof (entry_a), const_cast<nano::wallet_value *> (&entry_a)), 0));
|
||||
nano::store::lmdb::db_val pub_key (pub_a);
|
||||
nano::store::lmdb::db_val entry_val (sizeof (entry_a), const_cast<nano::wallet_value *> (&entry_a));
|
||||
auto status (mdb_put (env.tx (transaction_a), handle, pub_key.mdb_val_ptr (), entry_val.mdb_val_ptr (), 0));
|
||||
(void)status;
|
||||
debug_assert (status == 0);
|
||||
}
|
||||
|
@ -1003,9 +1013,10 @@ std::shared_ptr<nano::block> nano::wallet::send_action (nano::account const & so
|
|||
if (id_mdb_val)
|
||||
{
|
||||
nano::store::lmdb::db_val result;
|
||||
auto status (mdb_get (wallets.env.tx (transaction), wallets.node.wallets.send_action_ids, *id_mdb_val, result));
|
||||
auto status (mdb_get (wallets.env.tx (transaction), wallets.node.wallets.send_action_ids, id_mdb_val->mdb_val_ptr (), result.mdb_val_ptr ()));
|
||||
if (status == 0)
|
||||
{
|
||||
result.span_view = std::span<uint8_t const> (static_cast<uint8_t const *> (result.cached_mdb_val.mv_data), result.cached_mdb_val.mv_size);
|
||||
nano::block_hash hash (result);
|
||||
block = wallets.node.ledger.any.block_get (block_transaction, hash);
|
||||
if (block != nullptr)
|
||||
|
@ -1058,7 +1069,8 @@ std::shared_ptr<nano::block> nano::wallet::send_action (nano::account const & so
|
|||
details.epoch = info->epoch ();
|
||||
if (id_mdb_val && block != nullptr)
|
||||
{
|
||||
auto status (mdb_put (wallets.env.tx (transaction), wallets.node.wallets.send_action_ids, *id_mdb_val, nano::store::lmdb::db_val (block->hash ()), 0));
|
||||
nano::store::lmdb::db_val hash_val (block->hash ());
|
||||
auto status (mdb_put (wallets.env.tx (transaction), wallets.node.wallets.send_action_ids, id_mdb_val->mdb_val_ptr (), hash_val.mdb_val_ptr (), 0));
|
||||
if (status != 0)
|
||||
{
|
||||
block = nullptr;
|
||||
|
|
|
@ -61,13 +61,11 @@ add_library(
|
|||
block.cpp
|
||||
component.cpp
|
||||
confirmation_height.cpp
|
||||
db_val.cpp
|
||||
iterator.cpp
|
||||
final_vote.cpp
|
||||
lmdb/account.cpp
|
||||
lmdb/block.cpp
|
||||
lmdb/confirmation_height.cpp
|
||||
lmdb/db_val.cpp
|
||||
lmdb/final_vote.cpp
|
||||
lmdb/iterator.cpp
|
||||
lmdb/lmdb.cpp
|
||||
|
@ -88,7 +86,6 @@ add_library(
|
|||
rocksdb/account.cpp
|
||||
rocksdb/block.cpp
|
||||
rocksdb/confirmation_height.cpp
|
||||
rocksdb/db_val.cpp
|
||||
rocksdb/final_vote.cpp
|
||||
rocksdb/iterator.cpp
|
||||
rocksdb/online_weight.cpp
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
#include <nano/store/db_val.hpp>
|
|
@ -8,6 +8,10 @@
|
|||
#include <nano/store/versioning.hpp>
|
||||
|
||||
#include <cstddef>
|
||||
#include <span>
|
||||
|
||||
#include <lmdb/libraries/liblmdb/lmdb.h>
|
||||
#include <rocksdb/slice.h>
|
||||
|
||||
namespace nano
|
||||
{
|
||||
|
@ -22,44 +26,45 @@ class vote;
|
|||
namespace nano::store
|
||||
{
|
||||
/**
|
||||
* Encapsulates database specific container
|
||||
* Encapsulates database values using std::span for type safety and backend independence
|
||||
*/
|
||||
template <typename Val>
|
||||
class db_val
|
||||
{
|
||||
public:
|
||||
db_val (Val const & value_a) :
|
||||
value (value_a)
|
||||
db_val () = default;
|
||||
|
||||
db_val (std::span<uint8_t const> span) :
|
||||
span_view (span)
|
||||
{
|
||||
}
|
||||
|
||||
db_val () :
|
||||
db_val (0, nullptr)
|
||||
db_val (size_t size, void const * data) :
|
||||
span_view (static_cast<uint8_t const *> (data), size)
|
||||
{
|
||||
}
|
||||
|
||||
db_val (std::nullptr_t) :
|
||||
db_val (0, this)
|
||||
span_view ()
|
||||
{
|
||||
}
|
||||
|
||||
db_val (nano::uint128_union const & val_a) :
|
||||
db_val (sizeof (val_a), const_cast<nano::uint128_union *> (&val_a))
|
||||
span_view (val_a.bytes.data (), sizeof (val_a))
|
||||
{
|
||||
}
|
||||
|
||||
db_val (nano::uint256_union const & val_a) :
|
||||
db_val (sizeof (val_a), const_cast<nano::uint256_union *> (&val_a))
|
||||
span_view (val_a.bytes.data (), sizeof (val_a))
|
||||
{
|
||||
}
|
||||
|
||||
db_val (nano::uint512_union const & val_a) :
|
||||
db_val (sizeof (val_a), const_cast<nano::uint512_union *> (&val_a))
|
||||
span_view (val_a.bytes.data (), sizeof (val_a))
|
||||
{
|
||||
}
|
||||
|
||||
db_val (nano::qualified_root const & val_a) :
|
||||
db_val (sizeof (val_a), const_cast<nano::qualified_root *> (&val_a))
|
||||
span_view (reinterpret_cast<uint8_t const *> (&val_a), sizeof (val_a))
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -82,13 +87,13 @@ public:
|
|||
}
|
||||
|
||||
db_val (nano::block_info const & val_a) :
|
||||
db_val (sizeof (val_a), const_cast<nano::block_info *> (&val_a))
|
||||
span_view (reinterpret_cast<uint8_t const *> (&val_a), sizeof (val_a))
|
||||
{
|
||||
static_assert (std::is_standard_layout<nano::block_info>::value, "Standard layout is required");
|
||||
}
|
||||
|
||||
db_val (nano::endpoint_key const & val_a) :
|
||||
db_val (sizeof (val_a), const_cast<nano::endpoint_key *> (&val_a))
|
||||
span_view (reinterpret_cast<uint8_t const *> (&val_a), sizeof (val_a))
|
||||
{
|
||||
static_assert (std::is_standard_layout<nano::endpoint_key>::value, "Standard layout is required");
|
||||
}
|
||||
|
@ -114,7 +119,7 @@ public:
|
|||
nano::block_info result;
|
||||
debug_assert (size () == sizeof (result));
|
||||
static_assert (sizeof (nano::block_info::account) + sizeof (nano::block_info::balance) == sizeof (result), "Packed class");
|
||||
std::copy (reinterpret_cast<uint8_t const *> (data ()), reinterpret_cast<uint8_t const *> (data ()) + sizeof (result), reinterpret_cast<uint8_t *> (&result));
|
||||
std::copy (span_view.begin (), span_view.end (), reinterpret_cast<uint8_t *> (&result));
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -124,7 +129,7 @@ public:
|
|||
|
||||
explicit operator nano::confirmation_height_info () const
|
||||
{
|
||||
nano::bufferstream stream (reinterpret_cast<uint8_t const *> (data ()), size ());
|
||||
nano::bufferstream stream (span_view.data (), span_view.size ());
|
||||
nano::confirmation_height_info result;
|
||||
bool error (result.deserialize (stream));
|
||||
(void)error;
|
||||
|
@ -169,7 +174,7 @@ public:
|
|||
|
||||
explicit operator std::array<char, 64> () const
|
||||
{
|
||||
nano::bufferstream stream (reinterpret_cast<uint8_t const *> (data ()), size ());
|
||||
nano::bufferstream stream (span_view.data (), span_view.size ());
|
||||
std::array<char, 64> result;
|
||||
auto error = nano::try_read (stream, result);
|
||||
(void)error;
|
||||
|
@ -180,7 +185,8 @@ public:
|
|||
explicit operator nano::endpoint_key () const
|
||||
{
|
||||
nano::endpoint_key result;
|
||||
std::copy (reinterpret_cast<uint8_t const *> (data ()), reinterpret_cast<uint8_t const *> (data ()) + sizeof (result), reinterpret_cast<uint8_t *> (&result));
|
||||
debug_assert (span_view.size () == sizeof (result));
|
||||
std::copy (span_view.begin (), span_view.end (), reinterpret_cast<uint8_t *> (&result));
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -199,53 +205,20 @@ public:
|
|||
explicit operator std::shared_ptr<nano::block> () const;
|
||||
|
||||
template <typename Block>
|
||||
std::shared_ptr<Block> convert_to_block () const
|
||||
{
|
||||
nano::bufferstream stream (reinterpret_cast<uint8_t const *> (data ()), size ());
|
||||
auto error (false);
|
||||
auto result (std::make_shared<Block> (error, stream));
|
||||
debug_assert (!error);
|
||||
return result;
|
||||
}
|
||||
std::shared_ptr<Block> convert_to_block () const;
|
||||
|
||||
explicit operator std::shared_ptr<nano::send_block> () const
|
||||
{
|
||||
return convert_to_block<nano::send_block> ();
|
||||
}
|
||||
explicit operator std::shared_ptr<nano::send_block> () const;
|
||||
explicit operator std::shared_ptr<nano::receive_block> () const;
|
||||
explicit operator std::shared_ptr<nano::open_block> () const;
|
||||
explicit operator std::shared_ptr<nano::change_block> () const;
|
||||
explicit operator std::shared_ptr<nano::state_block> () const;
|
||||
|
||||
explicit operator std::shared_ptr<nano::receive_block> () const
|
||||
{
|
||||
return convert_to_block<nano::receive_block> ();
|
||||
}
|
||||
|
||||
explicit operator std::shared_ptr<nano::open_block> () const
|
||||
{
|
||||
return convert_to_block<nano::open_block> ();
|
||||
}
|
||||
|
||||
explicit operator std::shared_ptr<nano::change_block> () const
|
||||
{
|
||||
return convert_to_block<nano::change_block> ();
|
||||
}
|
||||
|
||||
explicit operator std::shared_ptr<nano::state_block> () const
|
||||
{
|
||||
return convert_to_block<nano::state_block> ();
|
||||
}
|
||||
|
||||
explicit operator std::shared_ptr<nano::vote> () const
|
||||
{
|
||||
nano::bufferstream stream (reinterpret_cast<uint8_t const *> (data ()), size ());
|
||||
auto error (false);
|
||||
auto result (nano::make_shared<nano::vote> (error, stream));
|
||||
debug_assert (!error);
|
||||
return result;
|
||||
}
|
||||
explicit operator std::shared_ptr<nano::vote> () const;
|
||||
|
||||
explicit operator uint64_t () const
|
||||
{
|
||||
uint64_t result;
|
||||
nano::bufferstream stream (reinterpret_cast<uint8_t const *> (data ()), size ());
|
||||
nano::bufferstream stream (span_view.data (), span_view.size ());
|
||||
auto error (nano::try_read (stream, result));
|
||||
(void)error;
|
||||
debug_assert (!error);
|
||||
|
@ -253,33 +226,54 @@ public:
|
|||
return result;
|
||||
}
|
||||
|
||||
operator Val * () const
|
||||
void * data () const
|
||||
{
|
||||
// Allow passing a temporary to a non-c++ function which doesn't have constness
|
||||
return const_cast<Val *> (&value);
|
||||
return const_cast<void *> (static_cast<void const *> (span_view.data ()));
|
||||
}
|
||||
|
||||
operator Val const & () const
|
||||
size_t size () const
|
||||
{
|
||||
return value;
|
||||
return span_view.size ();
|
||||
}
|
||||
|
||||
// Must be specialized
|
||||
void * data () const;
|
||||
size_t size () const;
|
||||
db_val (size_t size_a, void * data_a);
|
||||
void convert_buffer_to_value ();
|
||||
// Conversion to MDB_val for LMDB compatibility
|
||||
operator MDB_val () const
|
||||
{
|
||||
return MDB_val{ span_view.size (), const_cast<void *> (static_cast<void const *> (span_view.data ())) };
|
||||
}
|
||||
|
||||
Val value;
|
||||
// Conversion to rocksdb::Slice for RocksDB compatibility
|
||||
operator ::rocksdb::Slice () const
|
||||
{
|
||||
return ::rocksdb::Slice{ reinterpret_cast<char const *> (span_view.data ()), span_view.size () };
|
||||
}
|
||||
|
||||
// Get MDB_val* for LMDB functions that need pointers
|
||||
MDB_val * mdb_val_ptr () const
|
||||
{
|
||||
cached_mdb_val = MDB_val{ span_view.size (), const_cast<void *> (static_cast<void const *> (span_view.data ())) };
|
||||
return &cached_mdb_val;
|
||||
}
|
||||
|
||||
void convert_buffer_to_value ()
|
||||
{
|
||||
if (buffer)
|
||||
{
|
||||
span_view = std::span<uint8_t const> (buffer->data (), buffer->size ());
|
||||
}
|
||||
}
|
||||
|
||||
std::span<uint8_t const> span_view;
|
||||
std::shared_ptr<std::vector<uint8_t>> buffer;
|
||||
mutable MDB_val cached_mdb_val; // For LMDB compatibility
|
||||
|
||||
private:
|
||||
template <typename T>
|
||||
T convert () const
|
||||
{
|
||||
T result;
|
||||
debug_assert (size () == sizeof (result));
|
||||
std::copy (reinterpret_cast<uint8_t const *> (data ()), reinterpret_cast<uint8_t const *> (data ()) + sizeof (result), result.bytes.data ());
|
||||
debug_assert (span_view.size () == sizeof (result));
|
||||
std::copy (span_view.begin (), span_view.end (), result.bytes.data ());
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
|
|
@ -3,22 +3,20 @@
|
|||
#include <nano/lib/blocks.hpp>
|
||||
#include <nano/secure/account_info.hpp>
|
||||
#include <nano/secure/pending_info.hpp>
|
||||
#include <nano/secure/vote.hpp>
|
||||
#include <nano/store/db_val.hpp>
|
||||
|
||||
template <typename T>
|
||||
nano::store::db_val<T>::db_val (nano::account_info const & val_a) :
|
||||
db_val (val_a.db_size (), const_cast<nano::account_info *> (&val_a))
|
||||
inline nano::store::db_val::db_val (nano::account_info const & val_a) :
|
||||
span_view (reinterpret_cast<uint8_t const *> (&val_a), val_a.db_size ())
|
||||
{
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
nano::store::db_val<T>::db_val (nano::account_info_v22 const & val_a) :
|
||||
db_val (val_a.db_size (), const_cast<nano::account_info_v22 *> (&val_a))
|
||||
inline nano::store::db_val::db_val (nano::account_info_v22 const & val_a) :
|
||||
span_view (reinterpret_cast<uint8_t const *> (&val_a), val_a.db_size ())
|
||||
{
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
nano::store::db_val<T>::db_val (std::shared_ptr<nano::block> const & val_a) :
|
||||
inline nano::store::db_val::db_val (std::shared_ptr<nano::block> const & val_a) :
|
||||
buffer (std::make_shared<std::vector<uint8_t>> ())
|
||||
{
|
||||
{
|
||||
|
@ -28,50 +26,44 @@ nano::store::db_val<T>::db_val (std::shared_ptr<nano::block> const & val_a) :
|
|||
convert_buffer_to_value ();
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
nano::store::db_val<T>::db_val (nano::pending_info const & val_a) :
|
||||
db_val (val_a.db_size (), const_cast<nano::pending_info *> (&val_a))
|
||||
inline nano::store::db_val::db_val (nano::pending_info const & val_a) :
|
||||
span_view (reinterpret_cast<uint8_t const *> (&val_a), val_a.db_size ())
|
||||
{
|
||||
static_assert (std::is_standard_layout<nano::pending_info>::value, "Standard layout is required");
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
nano::store::db_val<T>::db_val (nano::pending_key const & val_a) :
|
||||
db_val (sizeof (val_a), const_cast<nano::pending_key *> (&val_a))
|
||||
inline nano::store::db_val::db_val (nano::pending_key const & val_a) :
|
||||
span_view (reinterpret_cast<uint8_t const *> (&val_a), sizeof (val_a))
|
||||
{
|
||||
static_assert (std::is_standard_layout<nano::pending_key>::value, "Standard layout is required");
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
nano::store::db_val<T>::operator nano::account_info () const
|
||||
inline nano::store::db_val::operator nano::account_info () const
|
||||
{
|
||||
nano::account_info result;
|
||||
debug_assert (size () == result.db_size ());
|
||||
std::copy (reinterpret_cast<uint8_t const *> (data ()), reinterpret_cast<uint8_t const *> (data ()) + result.db_size (), reinterpret_cast<uint8_t *> (&result));
|
||||
debug_assert (span_view.size () == result.db_size ());
|
||||
std::copy (span_view.begin (), span_view.end (), reinterpret_cast<uint8_t *> (&result));
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
nano::store::db_val<T>::operator nano::account_info_v22 () const
|
||||
inline nano::store::db_val::operator nano::account_info_v22 () const
|
||||
{
|
||||
nano::account_info_v22 result;
|
||||
debug_assert (size () == result.db_size ());
|
||||
std::copy (reinterpret_cast<uint8_t const *> (data ()), reinterpret_cast<uint8_t const *> (data ()) + result.db_size (), reinterpret_cast<uint8_t *> (&result));
|
||||
debug_assert (span_view.size () == result.db_size ());
|
||||
std::copy (span_view.begin (), span_view.end (), reinterpret_cast<uint8_t *> (&result));
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
nano::store::db_val<T>::operator std::shared_ptr<nano::block> () const
|
||||
inline nano::store::db_val::operator std::shared_ptr<nano::block> () const
|
||||
{
|
||||
nano::bufferstream stream (reinterpret_cast<uint8_t const *> (data ()), size ());
|
||||
nano::bufferstream stream (span_view.data (), span_view.size ());
|
||||
std::shared_ptr<nano::block> result (nano::deserialize_block (stream));
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
nano::store::db_val<T>::operator nano::store::block_w_sideband () const
|
||||
inline nano::store::db_val::operator nano::store::block_w_sideband () const
|
||||
{
|
||||
nano::bufferstream stream (reinterpret_cast<uint8_t const *> (data ()), size ());
|
||||
nano::bufferstream stream (span_view.data (), span_view.size ());
|
||||
nano::store::block_w_sideband block_w_sideband;
|
||||
block_w_sideband.block = (nano::deserialize_block (stream));
|
||||
auto error = block_w_sideband.sideband.deserialize (stream, block_w_sideband.block->type ());
|
||||
|
@ -80,21 +72,63 @@ nano::store::db_val<T>::operator nano::store::block_w_sideband () const
|
|||
return block_w_sideband;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
nano::store::db_val<T>::operator nano::pending_info () const
|
||||
inline nano::store::db_val::operator nano::pending_info () const
|
||||
{
|
||||
nano::pending_info result;
|
||||
debug_assert (size () == result.db_size ());
|
||||
std::copy (reinterpret_cast<uint8_t const *> (data ()), reinterpret_cast<uint8_t const *> (data ()) + result.db_size (), reinterpret_cast<uint8_t *> (&result));
|
||||
debug_assert (span_view.size () == result.db_size ());
|
||||
std::copy (span_view.begin (), span_view.end (), reinterpret_cast<uint8_t *> (&result));
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
nano::store::db_val<T>::operator nano::pending_key () const
|
||||
inline nano::store::db_val::operator nano::pending_key () const
|
||||
{
|
||||
nano::pending_key result;
|
||||
debug_assert (size () == sizeof (result));
|
||||
debug_assert (span_view.size () == sizeof (result));
|
||||
static_assert (sizeof (nano::pending_key::account) + sizeof (nano::pending_key::hash) == sizeof (result), "Packed class");
|
||||
std::copy (reinterpret_cast<uint8_t const *> (data ()), reinterpret_cast<uint8_t const *> (data ()) + sizeof (result), reinterpret_cast<uint8_t *> (&result));
|
||||
std::copy (span_view.begin (), span_view.end (), reinterpret_cast<uint8_t *> (&result));
|
||||
return result;
|
||||
}
|
||||
|
||||
inline nano::store::db_val::operator std::shared_ptr<nano::vote> () const
|
||||
{
|
||||
nano::bufferstream stream (span_view.data (), span_view.size ());
|
||||
auto error (false);
|
||||
auto result (nano::make_shared<nano::vote> (error, stream));
|
||||
debug_assert (!error);
|
||||
return result;
|
||||
}
|
||||
|
||||
inline nano::store::db_val::operator std::shared_ptr<nano::send_block> () const
|
||||
{
|
||||
return convert_to_block<nano::send_block> ();
|
||||
}
|
||||
|
||||
inline nano::store::db_val::operator std::shared_ptr<nano::receive_block> () const
|
||||
{
|
||||
return convert_to_block<nano::receive_block> ();
|
||||
}
|
||||
|
||||
inline nano::store::db_val::operator std::shared_ptr<nano::open_block> () const
|
||||
{
|
||||
return convert_to_block<nano::open_block> ();
|
||||
}
|
||||
|
||||
inline nano::store::db_val::operator std::shared_ptr<nano::change_block> () const
|
||||
{
|
||||
return convert_to_block<nano::change_block> ();
|
||||
}
|
||||
|
||||
inline nano::store::db_val::operator std::shared_ptr<nano::state_block> () const
|
||||
{
|
||||
return convert_to_block<nano::state_block> ();
|
||||
}
|
||||
|
||||
template <typename Block>
|
||||
inline std::shared_ptr<Block> nano::store::db_val::convert_to_block () const
|
||||
{
|
||||
nano::bufferstream stream (span_view.data (), span_view.size ());
|
||||
auto error (false);
|
||||
auto result (nano::make_shared<Block> (error, stream));
|
||||
debug_assert (!error);
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -1,25 +0,0 @@
|
|||
#include <nano/store/lmdb/db_val.hpp>
|
||||
|
||||
template <>
|
||||
void * nano::store::lmdb::db_val::data () const
|
||||
{
|
||||
return value.mv_data;
|
||||
}
|
||||
|
||||
template <>
|
||||
std::size_t nano::store::lmdb::db_val::size () const
|
||||
{
|
||||
return value.mv_size;
|
||||
}
|
||||
|
||||
template <>
|
||||
nano::store::lmdb::db_val::db_val (std::size_t size_a, void * data_a) :
|
||||
value ({ size_a, data_a })
|
||||
{
|
||||
}
|
||||
|
||||
template <>
|
||||
void nano::store::lmdb::db_val::convert_buffer_to_value ()
|
||||
{
|
||||
value = { buffer->size (), const_cast<uint8_t *> (buffer->data ()) };
|
||||
}
|
|
@ -2,9 +2,7 @@
|
|||
|
||||
#include <nano/store/db_val.hpp>
|
||||
|
||||
#include <lmdb/libraries/liblmdb/lmdb.h>
|
||||
|
||||
namespace nano::store::lmdb
|
||||
{
|
||||
using db_val = store::db_val<MDB_val>;
|
||||
using db_val = store::db_val;
|
||||
}
|
||||
|
|
|
@ -405,17 +405,23 @@ 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
|
||||
{
|
||||
return mdb_get (env.tx (transaction_a), table_to_dbi (table_a), key_a, value_a);
|
||||
auto result = mdb_get (env.tx (transaction_a), table_to_dbi (table_a), key_a.mdb_val_ptr (), value_a.mdb_val_ptr ());
|
||||
if (result == MDB_SUCCESS)
|
||||
{
|
||||
// Update value_a span_view to point to the retrieved data
|
||||
value_a.span_view = std::span<uint8_t const> (static_cast<uint8_t const *> (value_a.cached_mdb_val.mv_data), value_a.cached_mdb_val.mv_size);
|
||||
}
|
||||
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
|
||||
{
|
||||
return (mdb_put (env.tx (transaction_a), table_to_dbi (table_a), key_a, value_a, 0));
|
||||
return (mdb_put (env.tx (transaction_a), table_to_dbi (table_a), key_a.mdb_val_ptr (), value_a.mdb_val_ptr (), 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
|
||||
{
|
||||
return (mdb_del (env.tx (transaction_a), table_to_dbi (table_a), key_a, nullptr));
|
||||
return (mdb_del (env.tx (transaction_a), table_to_dbi (table_a), key_a.mdb_val_ptr (), nullptr));
|
||||
}
|
||||
|
||||
int nano::store::lmdb::component::drop (store::write_transaction const & transaction_a, tables table_a)
|
||||
|
@ -502,7 +508,8 @@ void nano::store::lmdb::component::rebuild_db (store::write_transaction const &
|
|||
// Copy all values to temporary table
|
||||
for (typed_iterator<nano::uint256_union, nano::store::lmdb::db_val> i{ store::iterator{ iterator::begin (env.tx (transaction_a), table) } }, n{ store::iterator{ iterator::end (env.tx (transaction_a), table) } }; i != n; ++i)
|
||||
{
|
||||
auto s = mdb_put (env.tx (transaction_a), temp, nano::store::lmdb::db_val (i->first), i->second, MDB_APPEND);
|
||||
nano::store::lmdb::db_val key_val (i->first);
|
||||
auto s = mdb_put (env.tx (transaction_a), temp, key_val.mdb_val_ptr (), i->second.mdb_val_ptr (), MDB_APPEND);
|
||||
release_assert_success (s);
|
||||
}
|
||||
release_assert (count (transaction_a, table) == count (transaction_a, temp));
|
||||
|
@ -511,7 +518,8 @@ void nano::store::lmdb::component::rebuild_db (store::write_transaction const &
|
|||
// Put values from copy
|
||||
for (typed_iterator<nano::uint256_union, nano::store::lmdb::db_val> i{ store::iterator{ iterator::begin (env.tx (transaction_a), temp) } }, n{ store::iterator{ iterator::end (env.tx (transaction_a), temp) } }; i != n; ++i)
|
||||
{
|
||||
auto s = mdb_put (env.tx (transaction_a), table, nano::store::lmdb::db_val (i->first), i->second, MDB_APPEND);
|
||||
nano::store::lmdb::db_val key_val (i->first);
|
||||
auto s = mdb_put (env.tx (transaction_a), table, key_val.mdb_val_ptr (), i->second.mdb_val_ptr (), MDB_APPEND);
|
||||
release_assert_success (s);
|
||||
}
|
||||
release_assert (count (transaction_a, table) == count (transaction_a, temp));
|
||||
|
@ -525,7 +533,9 @@ void nano::store::lmdb::component::rebuild_db (store::write_transaction const &
|
|||
// Copy all values to temporary table
|
||||
for (typed_iterator<nano::pending_key, nano::pending_info> i{ store::iterator{ iterator::begin (env.tx (transaction_a), pending_store.pending_handle) } }, n{ store::iterator{ iterator::end (env.tx (transaction_a), pending_store.pending_handle) } }; i != n; ++i)
|
||||
{
|
||||
auto s = mdb_put (env.tx (transaction_a), temp, nano::store::lmdb::db_val (i->first), nano::store::lmdb::db_val (i->second), MDB_APPEND);
|
||||
nano::store::lmdb::db_val key_val (i->first);
|
||||
nano::store::lmdb::db_val value_val (i->second);
|
||||
auto s = mdb_put (env.tx (transaction_a), temp, key_val.mdb_val_ptr (), value_val.mdb_val_ptr (), MDB_APPEND);
|
||||
release_assert_success (s);
|
||||
}
|
||||
release_assert (count (transaction_a, pending_store.pending_handle) == count (transaction_a, temp));
|
||||
|
@ -533,7 +543,9 @@ void nano::store::lmdb::component::rebuild_db (store::write_transaction const &
|
|||
// Put values from copy
|
||||
for (typed_iterator<nano::pending_key, nano::pending_info> i{ store::iterator{ iterator::begin (env.tx (transaction_a), temp) } }, n{ store::iterator{ iterator::end (env.tx (transaction_a), temp) } }; i != n; ++i)
|
||||
{
|
||||
auto s = mdb_put (env.tx (transaction_a), pending_store.pending_handle, nano::store::lmdb::db_val (i->first), nano::store::lmdb::db_val (i->second), MDB_APPEND);
|
||||
nano::store::lmdb::db_val key_val (i->first);
|
||||
nano::store::lmdb::db_val value_val (i->second);
|
||||
auto s = mdb_put (env.tx (transaction_a), pending_store.pending_handle, key_val.mdb_val_ptr (), value_val.mdb_val_ptr (), MDB_APPEND);
|
||||
release_assert_success (s);
|
||||
}
|
||||
release_assert (count (transaction_a, pending_store.pending_handle) == count (transaction_a, temp));
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#include <nano/store/lmdb/wallet_value.hpp>
|
||||
|
||||
nano::wallet_value::wallet_value (nano::store::db_val<MDB_val> const & val_a)
|
||||
nano::wallet_value::wallet_value (nano::store::db_val const & val_a)
|
||||
{
|
||||
debug_assert (val_a.size () == sizeof (*this));
|
||||
std::copy (reinterpret_cast<uint8_t const *> (val_a.data ()), reinterpret_cast<uint8_t const *> (val_a.data ()) + sizeof (key), key.chars.begin ());
|
||||
|
@ -13,8 +13,8 @@ nano::wallet_value::wallet_value (nano::raw_key const & key_a, uint64_t work_a)
|
|||
{
|
||||
}
|
||||
|
||||
nano::store::db_val<MDB_val> nano::wallet_value::val () const
|
||||
nano::store::db_val nano::wallet_value::val () const
|
||||
{
|
||||
static_assert (sizeof (*this) == sizeof (key) + sizeof (work), "Class not packed");
|
||||
return nano::store::db_val<MDB_val> (sizeof (*this), const_cast<nano::wallet_value *> (this));
|
||||
return nano::store::db_val (sizeof (*this), const_cast<nano::wallet_value *> (this));
|
||||
}
|
||||
|
|
|
@ -11,9 +11,9 @@ class wallet_value
|
|||
{
|
||||
public:
|
||||
wallet_value () = default;
|
||||
wallet_value (store::db_val<MDB_val> const &);
|
||||
wallet_value (store::db_val const &);
|
||||
wallet_value (nano::raw_key const &, uint64_t);
|
||||
store::db_val<MDB_val> val () const;
|
||||
store::db_val val () const;
|
||||
nano::raw_key key;
|
||||
uint64_t work;
|
||||
};
|
||||
|
|
|
@ -1,25 +0,0 @@
|
|||
#include <nano/store/rocksdb/db_val.hpp>
|
||||
|
||||
template <>
|
||||
void * nano::store::rocksdb::db_val::data () const
|
||||
{
|
||||
return (void *)value.data ();
|
||||
}
|
||||
|
||||
template <>
|
||||
std::size_t nano::store::rocksdb::db_val::size () const
|
||||
{
|
||||
return value.size ();
|
||||
}
|
||||
|
||||
template <>
|
||||
nano::store::rocksdb::db_val::db_val (std::size_t size_a, void * data_a) :
|
||||
value (static_cast<char const *> (data_a), size_a)
|
||||
{
|
||||
}
|
||||
|
||||
template <>
|
||||
void nano::store::rocksdb::db_val::convert_buffer_to_value ()
|
||||
{
|
||||
value = ::rocksdb::Slice (reinterpret_cast<char const *> (buffer->data ()), buffer->size ());
|
||||
}
|
|
@ -2,9 +2,7 @@
|
|||
|
||||
#include <nano/store/db_val.hpp>
|
||||
|
||||
#include <rocksdb/slice.h>
|
||||
|
||||
namespace nano::store::rocksdb
|
||||
{
|
||||
using db_val = store::db_val<::rocksdb::Slice>;
|
||||
using db_val = store::db_val;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
#include <nano/lib/utility.hpp>
|
||||
#include <nano/store/db_val_impl.hpp>
|
||||
#include <nano/store/lmdb/db_val.hpp>
|
||||
#include <nano/store/typed_iterator.hpp>
|
||||
|
||||
namespace nano::store
|
||||
|
@ -10,10 +9,9 @@ void typed_iterator<Key, Value>::update ()
|
|||
{
|
||||
if (!iter.is_end ())
|
||||
{
|
||||
// FIXME Don't convert via lmdb::db_val, this is just a placeholder
|
||||
auto const & data = *iter;
|
||||
lmdb::db_val key_val{ MDB_val{ data.first.size (), const_cast<void *> (reinterpret_cast<void const *> (data.first.data ())) } };
|
||||
lmdb::db_val value_val{ MDB_val{ data.second.size (), const_cast<void *> (reinterpret_cast<void const *> (data.second.data ())) } };
|
||||
db_val key_val{ data.first };
|
||||
db_val value_val{ data.second };
|
||||
current = std::make_pair (static_cast<Key> (key_val), static_cast<Value> (value_val));
|
||||
}
|
||||
else
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue