|
|
|
@ -1025,7 +1025,8 @@ void BlockchainLMDB::remove_tx_outputs(const uint64_t tx_id, const transaction&
|
|
|
|
|
{
|
|
|
|
|
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
|
|
|
|
|
|
|
|
|
|
std::vector<uint64_t> amount_output_indices = get_tx_amount_output_indices(tx_id);
|
|
|
|
|
std::vector<std::vector<uint64_t>> amount_output_indices_set = get_tx_amount_output_indices(tx_id, 1);
|
|
|
|
|
const std::vector<uint64_t> &amount_output_indices = amount_output_indices_set.front();
|
|
|
|
|
|
|
|
|
|
if (amount_output_indices.empty())
|
|
|
|
|
{
|
|
|
|
@ -2604,7 +2605,7 @@ tx_out_index BlockchainLMDB::get_output_tx_and_index(const uint64_t& amount, con
|
|
|
|
|
return indices[0];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::vector<uint64_t> BlockchainLMDB::get_tx_amount_output_indices(const uint64_t tx_id) const
|
|
|
|
|
std::vector<std::vector<uint64_t>> BlockchainLMDB::get_tx_amount_output_indices(uint64_t tx_id, size_t n_txes) const
|
|
|
|
|
{
|
|
|
|
|
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
|
|
|
|
|
|
|
|
|
@ -2613,12 +2614,15 @@ std::vector<uint64_t> BlockchainLMDB::get_tx_amount_output_indices(const uint64_
|
|
|
|
|
TXN_PREFIX_RDONLY();
|
|
|
|
|
RCURSOR(tx_outputs);
|
|
|
|
|
|
|
|
|
|
int result = 0;
|
|
|
|
|
MDB_val_set(k_tx_id, tx_id);
|
|
|
|
|
MDB_val v;
|
|
|
|
|
std::vector<uint64_t> amount_output_indices;
|
|
|
|
|
std::vector<std::vector<uint64_t>> amount_output_indices_set;
|
|
|
|
|
amount_output_indices_set.reserve(n_txes);
|
|
|
|
|
|
|
|
|
|
result = mdb_cursor_get(m_cur_tx_outputs, &k_tx_id, &v, MDB_SET);
|
|
|
|
|
MDB_cursor_op op = MDB_SET;
|
|
|
|
|
while (n_txes-- > 0)
|
|
|
|
|
{
|
|
|
|
|
int result = mdb_cursor_get(m_cur_tx_outputs, &k_tx_id, &v, op);
|
|
|
|
|
if (result == MDB_NOTFOUND)
|
|
|
|
|
LOG_PRINT_L0("WARNING: Unexpected: tx has no amount indices stored in "
|
|
|
|
|
"tx_outputs, but it should have an empty entry even if it's a tx without "
|
|
|
|
@ -2626,22 +2630,24 @@ std::vector<uint64_t> BlockchainLMDB::get_tx_amount_output_indices(const uint64_
|
|
|
|
|
else if (result)
|
|
|
|
|
throw0(DB_ERROR(lmdb_error("DB error attempting to get data for tx_outputs[tx_index]", result).c_str()));
|
|
|
|
|
|
|
|
|
|
op = MDB_NEXT;
|
|
|
|
|
|
|
|
|
|
const uint64_t* indices = (const uint64_t*)v.mv_data;
|
|
|
|
|
int num_outputs = v.mv_size / sizeof(uint64_t);
|
|
|
|
|
size_t num_outputs = v.mv_size / sizeof(uint64_t);
|
|
|
|
|
|
|
|
|
|
amount_output_indices_set.resize(amount_output_indices_set.size() + 1);
|
|
|
|
|
std::vector<uint64_t> &amount_output_indices = amount_output_indices_set.back();
|
|
|
|
|
amount_output_indices.reserve(num_outputs);
|
|
|
|
|
for (int i = 0; i < num_outputs; ++i)
|
|
|
|
|
for (size_t i = 0; i < num_outputs; ++i)
|
|
|
|
|
{
|
|
|
|
|
// LOG_PRINT_L0("amount output index[" << 2*i << "]" << ": " << paired_indices[2*i] << " global output index: " << paired_indices[2*i+1]);
|
|
|
|
|
amount_output_indices.push_back(indices[i]);
|
|
|
|
|
}
|
|
|
|
|
indices = nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TXN_POSTFIX_RDONLY();
|
|
|
|
|
return amount_output_indices;
|
|
|
|
|
return amount_output_indices_set;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool BlockchainLMDB::has_key_image(const crypto::key_image& img) const
|
|
|
|
|
{
|
|
|
|
|
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
|
|
|
|
|