diff --git a/src/mylmdb.h b/src/mylmdb.h index 346e2c8..26aa5da 100644 --- a/src/mylmdb.h +++ b/src/mylmdb.h @@ -189,7 +189,9 @@ namespace xmreg uint64_t index_in_tx = std::get<2>(output); - output_info out_info {out_pub_key, tx_hash, tx_pub_key, amount, index_in_tx}; + output_info out_info {out_pub_key, tx_hash, + tx_pub_key, amount, + index_in_tx}; uint64_t out_timestamp = blk.timestamp; @@ -342,6 +344,37 @@ namespace xmreg return true; } +// // this seems to be not needed as outputs are written based on timestamps +// +// bool +// write_block_timestamp(uint64_t& blk_timestamp, uint64_t& blk_height) +// { +// +// unsigned int flags = MDB_CREATE | MDB_INTEGERKEY; +// +// try +// { +// lmdb::txn wtxn = lmdb::txn::begin(m_env); +// lmdb::dbi wdbi = lmdb::dbi::open(wtxn, "block_timestamps", flags); +// +// lmdb::val blk_timestamp_val {static_cast(&blk_timestamp), +// sizeof(blk_timestamp)}; +// lmdb::val blk_height_val {static_cast(&blk_height), +// sizeof(blk_height)}; +// +// wdbi.put(wtxn, blk_timestamp_val, blk_height_val); +// +// wtxn.commit(); +// } +// catch (lmdb::error& e) +// { +// cerr << e.what() << endl; +// return false; +// } +// +// return true; +// } + bool search(const string& key, vector& found_tx_hashes, @@ -479,6 +512,66 @@ namespace xmreg return true; } + bool + get_output_info_range(uint64_t key_timestamp_start, + uint64_t key_timestamp_end, + vector& out_infos, + const string& db_name = "output_info") + { + + unsigned int flags = 0; + + try + { + + lmdb::txn rtxn = lmdb::txn::begin(m_env, nullptr, MDB_RDONLY); + lmdb::dbi rdbi = lmdb::dbi::open(rtxn, db_name.c_str(), flags); + + lmdb::val key_to_find{static_cast(&key_timestamp_start), + sizeof(key_timestamp_start)}; + lmdb::val info_val; + + + + lmdb::cursor cr = lmdb::cursor::open(rtxn, rdbi); + + uint64_t current_timestamp = key_timestamp_start; + + + // set cursor the the first item + if (cr.get(key_to_find, info_val, MDB_SET_RANGE)) + { + out_infos.push_back(*(info_val.data())); + + // process other values for the same key + while (cr.get(key_to_find, info_val, MDB_NEXT)) + { + current_timestamp = *key_to_find.data(); + //cout << current_timestamp << endl; + out_infos.push_back(*(info_val.data())); + if (current_timestamp > key_timestamp_end) + { + break; + } + } + } + else + { + return false; + } + + rtxn.abort(); + + } + catch (lmdb::error& e) + { + cerr << e.what() << endl; + return false; + } + + return true; + } + void for_all_outputs( @@ -590,7 +683,7 @@ namespace xmreg return height; } - // cout << height << endl; + cout << height << endl; return height;