@ -85,6 +85,10 @@ inline void throw1(const T &e)
# define MDB_val_set(var, val) MDB_val var = {sizeof(val), (void *)&val}
# define MDB_val_sized(var, val) MDB_val var = {val.size(), (void *)val.data()}
# define MDB_val_str(var, val) MDB_val var = {strlen(val) + 1, (void *)val}
template < typename T >
struct MDB_val_copy : public MDB_val
{
@ -714,7 +718,8 @@ void BlockchainLMDB::add_block(const block& blk, size_t block_weight, const diff
CURSOR ( block_info )
// this call to mdb_cursor_put will change height()
MDB_val_copy < blobdata > blob ( block_to_blob ( blk ) ) ;
cryptonote : : blobdata block_blob ( block_to_blob ( blk ) ) ;
MDB_val_sized ( blob , block_blob ) ;
result = mdb_cursor_put ( m_cur_blocks , & key , & blob , MDB_APPEND ) ;
if ( result )
throw0 ( DB_ERROR ( lmdb_error ( " Failed to add block blob to db transaction: " , result ) . c_str ( ) ) ) ;
@ -828,7 +833,7 @@ uint64_t BlockchainLMDB::add_transaction_data(const crypto::hash& blk_hash, cons
throw0 ( DB_ERROR ( lmdb_error ( " Failed to add tx data to db transaction: " , result ) . c_str ( ) ) ) ;
cryptonote : : blobdata blob = tx_to_blob ( tx ) ;
MDB_val_ copy< blobdata > blobval ( blob ) ;
MDB_val_ sized( blobval , blob ) ;
std : : stringstream ss ;
binary_archive < true > ba ( ss ) ;
@ -836,7 +841,7 @@ uint64_t BlockchainLMDB::add_transaction_data(const crypto::hash& blk_hash, cons
if ( ! r )
throw0 ( DB_ERROR ( " Failed to serialize pruned tx " ) ) ;
std : : string pruned = ss . str ( ) ;
MDB_val_ copy< blobdata > pruned_blob ( pruned ) ;
MDB_val_ sized( pruned_blob , pruned ) ;
result = mdb_cursor_put ( m_cur_txs_pruned , & val_tx_id , & pruned_blob , MDB_APPEND ) ;
if ( result )
throw0 ( DB_ERROR ( lmdb_error ( " Failed to add pruned tx blob to db transaction: " , result ) . c_str ( ) ) ) ;
@ -844,7 +849,7 @@ uint64_t BlockchainLMDB::add_transaction_data(const crypto::hash& blk_hash, cons
if ( pruned . size ( ) > blob . size ( ) )
throw0 ( DB_ERROR ( " pruned tx size is larger than tx size " ) ) ;
cryptonote : : blobdata prunable ( blob . data ( ) + pruned . size ( ) , blob . size ( ) - pruned . size ( ) ) ;
MDB_val_ copy< blobdata > prunable_blob ( prunable ) ;
MDB_val_ sized( prunable_blob , prunable ) ;
result = mdb_cursor_put ( m_cur_txs_prunable , & val_tx_id , & prunable_blob , MDB_APPEND ) ;
if ( result )
throw0 ( DB_ERROR ( lmdb_error ( " Failed to add prunable tx blob to db transaction: " , result ) . c_str ( ) ) ) ;
@ -1331,7 +1336,7 @@ void BlockchainLMDB::open(const std::string& filename, const int db_flags)
bool compatible = true ;
MDB_val_ copy< const char * > k ( " version " ) ;
MDB_val_ str( k , " version " ) ;
MDB_val v ;
auto get_result = mdb_get ( txn , m_properties , & k , & v ) ;
if ( get_result = = MDB_SUCCESS )
@ -1379,7 +1384,7 @@ void BlockchainLMDB::open(const std::string& filename, const int db_flags)
// only write version on an empty DB
if ( m_height = = 0 )
{
MDB_val_ copy< const char * > k ( " version " ) ;
MDB_val_ str( k , " version " ) ;
MDB_val_copy < uint32_t > v ( VERSION ) ;
auto put_result = mdb_put ( txn , m_properties , & k , & v , 0 ) ;
if ( put_result ! = MDB_SUCCESS )
@ -1476,7 +1481,7 @@ void BlockchainLMDB::reset()
throw0 ( DB_ERROR ( lmdb_error ( " Failed to drop m_properties: " , result ) . c_str ( ) ) ) ;
// init with current version
MDB_val_ copy< const char * > k ( " version " ) ;
MDB_val_ str( k , " version " ) ;
MDB_val_copy < uint32_t > v ( VERSION ) ;
if ( auto result = mdb_put ( txn , m_properties , & k , & v , 0 ) )
throw0 ( DB_ERROR ( lmdb_error ( " Failed to write version to database: " , result ) . c_str ( ) ) ) ;
@ -1591,7 +1596,7 @@ void BlockchainLMDB::unlock()
auto_txn . commit ( ) ; \
} while ( 0 )
void BlockchainLMDB : : add_txpool_tx ( const transaction & tx , const txpool_tx_meta_t & meta )
void BlockchainLMDB : : add_txpool_tx ( const crypto: : hash & txid , const cryptonote : : blobdata & blob , const txpool_tx_meta_t & meta )
{
LOG_PRINT_L3 ( " BlockchainLMDB:: " < < __func__ ) ;
check_open ( ) ;
@ -1600,8 +1605,6 @@ void BlockchainLMDB::add_txpool_tx(const transaction &tx, const txpool_tx_meta_t
CURSOR ( txpool_meta )
CURSOR ( txpool_blob )
const crypto : : hash txid = get_transaction_hash ( tx ) ;
MDB_val k = { sizeof ( txid ) , ( void * ) & txid } ;
MDB_val v = { sizeof ( meta ) , ( void * ) & meta } ;
if ( auto result = mdb_cursor_put ( m_cur_txpool_meta , & k , & v , MDB_NODUPDATA ) ) {
@ -1610,7 +1613,7 @@ void BlockchainLMDB::add_txpool_tx(const transaction &tx, const txpool_tx_meta_t
else
throw1 ( DB_ERROR ( lmdb_error ( " Error adding txpool tx metadata to db transaction: " , result ) . c_str ( ) ) ) ;
}
MDB_val_ copy< cryptonote : : blobdata > blob_val ( tx_to_blob ( tx ) ) ;
MDB_val_ sized( blob_val , blob ) ;
if ( auto result = mdb_cursor_put ( m_cur_txpool_blob , & k , & blob_val , MDB_NODUPDATA ) ) {
if ( result = = MDB_KEYEXIST )
throw1 ( DB_ERROR ( " Attempting to add txpool tx blob that's already in the db " ) ) ;
@ -3172,6 +3175,7 @@ void BlockchainLMDB::get_output_tx_and_index_from_global(const std::vector<uint6
LOG_PRINT_L3 ( " BlockchainLMDB:: " < < __func__ ) ;
check_open ( ) ;
tx_out_indices . clear ( ) ;
tx_out_indices . reserve ( global_indices . size ( ) ) ;
TXN_PREFIX_RDONLY ( ) ;
RCURSOR ( output_txs ) ;
@ -3186,9 +3190,8 @@ void BlockchainLMDB::get_output_tx_and_index_from_global(const std::vector<uint6
else if ( get_result )
throw0 ( DB_ERROR ( " DB error attempting to fetch output tx hash " ) ) ;
outtx * ot = ( outtx * ) v . mv_data ;
auto result = tx_out_index ( ot - > tx_hash , ot - > local_index ) ;
tx_out_indices . push_back ( result ) ;
const outtx * ot = ( const outtx * ) v . mv_data ;
tx_out_indices . push_back ( tx_out_index ( ot - > tx_hash , ot - > local_index ) ) ;
}
TXN_POSTFIX_RDONLY ( ) ;
@ -3200,6 +3203,7 @@ void BlockchainLMDB::get_output_key(const uint64_t &amount, const std::vector<ui
TIME_MEASURE_START ( db3 ) ;
check_open ( ) ;
outputs . clear ( ) ;
outputs . reserve ( offsets . size ( ) ) ;
TXN_PREFIX_RDONLY ( ) ;
@ -3223,19 +3227,19 @@ void BlockchainLMDB::get_output_key(const uint64_t &amount, const std::vector<ui
else if ( get_result )
throw0 ( DB_ERROR ( lmdb_error ( " Error attempting to retrieve an output pubkey from the db " , get_result ) . c_str ( ) ) ) ;
output_data_t data ;
if ( amount = = 0 )
{
const outkey * okp = ( const outkey * ) v . mv_data ;
data = okp - > data ;
outputs. push_back ( okp - > data ) ;
}
else
{
const pre_rct_outkey * okp = ( const pre_rct_outkey * ) v . mv_data ;
outputs . resize ( outputs . size ( ) + 1 ) ;
output_data_t & data = outputs . back ( ) ;
memcpy ( & data , & okp - > data , sizeof ( pre_rct_output_data_t ) ) ;
data . commitment = rct : : zeroCommit ( amount ) ;
}
outputs . push_back ( data ) ;
}
TXN_POSTFIX_RDONLY ( ) ;
@ -3251,6 +3255,7 @@ void BlockchainLMDB::get_output_tx_and_index(const uint64_t& amount, const std::
indices . clear ( ) ;
std : : vector < uint64_t > tx_indices ;
tx_indices . reserve ( offsets . size ( ) ) ;
TXN_PREFIX_RDONLY ( ) ;
RCURSOR ( output_amounts ) ;
@ -4064,7 +4069,7 @@ void BlockchainLMDB::migrate_0_1()
uint32_t version = 1 ;
v . mv_data = ( void * ) & version ;
v . mv_size = sizeof ( version ) ;
MDB_val_ copy< const char * > vk ( " version " ) ;
MDB_val_ str( vk , " version " ) ;
result = mdb_txn_begin ( m_env , NULL , 0 , txn ) ;
if ( result )
throw0 ( DB_ERROR ( lmdb_error ( " Failed to create a transaction for the db: " , result ) . c_str ( ) ) ) ;
@ -4206,7 +4211,7 @@ void BlockchainLMDB::migrate_1_2()
uint32_t version = 2 ;
v . mv_data = ( void * ) & version ;
v . mv_size = sizeof ( version ) ;
MDB_val_ copy< const char * > vk ( " version " ) ;
MDB_val_ str( vk , " version " ) ;
result = mdb_txn_begin ( m_env , NULL , 0 , txn ) ;
if ( result )
throw0 ( DB_ERROR ( lmdb_error ( " Failed to create a transaction for the db: " , result ) . c_str ( ) ) ) ;
@ -4341,7 +4346,7 @@ void BlockchainLMDB::migrate_2_3()
uint32_t version = 3 ;
v . mv_data = ( void * ) & version ;
v . mv_size = sizeof ( version ) ;
MDB_val_ copy< const char * > vk ( " version " ) ;
MDB_val_ str( vk , " version " ) ;
result = mdb_txn_begin ( m_env , NULL , 0 , txn ) ;
if ( result )
throw0 ( DB_ERROR ( lmdb_error ( " Failed to create a transaction for the db: " , result ) . c_str ( ) ) ) ;