diff --git a/libraries/app/database_api.cpp b/libraries/app/database_api.cpp index 32217826..cd941b5c 100644 --- a/libraries/app/database_api.cpp +++ b/libraries/app/database_api.cpp @@ -68,6 +68,8 @@ class database_api_impl : public std::enable_shared_from_this map> get_block_header_batch(const vector block_nums)const; optional get_block(uint32_t block_num)const; processed_transaction get_transaction( uint32_t block_num, uint32_t trx_in_block )const; + operation_history_id_type get_operation_history_id(uint32_t block_num, uint32_t trx_in_block, uint32_t op_in_trx)const; + account_transaction_history_id_type get_account_transaction_history_id(operation_history_id_type operation_id)const; // Globals chain_property_object get_chain_properties()const; @@ -410,6 +412,43 @@ processed_transaction database_api_impl::get_transaction(uint32_t block_num, uin return opt_block->transactions[trx_num]; } +operation_history_id_type database_api::get_operation_history_id(uint32_t block_num, uint32_t trx_in_block, uint32_t op_in_trx)const +{ + return my->get_operation_history_id( block_num, trx_in_block, op_in_trx ); +} + +operation_history_id_type database_api_impl::get_operation_history_id(uint32_t block_num, uint32_t trx_in_block, uint32_t op_in_trx)const +{ + const simple_index& op_index = _db.get_index_type>(); + + for( const operation_history_object& op : op_index ) + { + if(op.block_num == block_num and op.trx_in_block == trx_in_block and op.op_in_trx == op_in_trx) { + return op.id; + break; + } + } +} +account_transaction_history_id_type database_api::get_account_transaction_history_id(operation_history_id_type operation_id)const +{ + return my->get_account_transaction_history_id( operation_id ); +} + +account_transaction_history_id_type database_api_impl::get_account_transaction_history_id(operation_history_id_type operation_id)const +{ + const auto& ath_idx = _db.get_index_type(); + const auto& ath_by_seq_idx = ath_idx.indices().get(); + + for( const account_transaction_history_object& ath : ath_by_seq_idx ) + { + if(ath.operation_id == operation_id) { + return ath.id; + break; + } + } +} + + ////////////////////////////////////////////////////////////////////// // // // Globals // diff --git a/libraries/app/include/graphene/app/database_api.hpp b/libraries/app/include/graphene/app/database_api.hpp index 1fe64a09..131d2dc2 100644 --- a/libraries/app/include/graphene/app/database_api.hpp +++ b/libraries/app/include/graphene/app/database_api.hpp @@ -185,6 +185,16 @@ class database_api */ optional get_recent_transaction_by_id( const transaction_id_type& id )const; + /** + * Given a block, transaction in block position and operation position in transaction, get the operation_history_id + */ + operation_history_id_type get_operation_history_id(uint32_t block_num, uint32_t trx_in_block, uint32_t op_in_trx)const; + + /** + * Given a operation_history_id, get the account_transaction_history_id + */ + account_transaction_history_id_type get_account_transaction_history_id(operation_history_id_type operation_id)const; + ///////////// // Globals // ///////////// @@ -600,6 +610,8 @@ FC_API(graphene::app::database_api, (get_block) (get_transaction) (get_recent_transaction_by_id) + (get_operation_history_id) + (get_account_transaction_history_id) // Globals (get_chain_properties)