diff --git a/libraries/chain/include/eos/chain/message_handling_contexts.hpp b/libraries/chain/include/eos/chain/message_handling_contexts.hpp index 1cd51206ddc62c52b5dfe0a36c62f09db7bbbd45..74c59ff3fa4ad882abac07a70fac52faf050e653 100644 --- a/libraries/chain/include/eos/chain/message_handling_contexts.hpp +++ b/libraries/chain/include/eos/chain/message_handling_contexts.hpp @@ -52,6 +52,8 @@ public: uint128_t* primary, uint128_t* secondary, char* data, uint32_t maxlen ); int32_t load_primary_i128i128( Name scope, Name code, Name table, uint128_t* primary, uint128_t* secondary, char* data, uint32_t maxlen ); + int32_t load_secondary_i128i128( Name scope, Name code, Name table, + uint128_t* primary, uint128_t* secondary, char* data, uint32_t maxlen ); int32_t lowerbound_primary_i128i128( Name scope, Name code, Name table, uint128_t* primary, uint128_t* secondary, char* data, uint32_t maxlen ); int32_t lowerbound_secondary_i128i128( Name scope, Name code, Name table, diff --git a/libraries/chain/message_handling_contexts.cpp b/libraries/chain/message_handling_contexts.cpp index d3a451ebf4406ed4585e2503b6f29a6c5cf2d9cc..11c64cb6d869c5a86965dd2b3075d2aaf1568d5e 100644 --- a/libraries/chain/message_handling_contexts.cpp +++ b/libraries/chain/message_handling_contexts.cpp @@ -229,6 +229,32 @@ int32_t message_validate_context::load_primary_i128i128( Name scope, Name code, } return copylen; } + +int32_t message_validate_context::load_secondary_i128i128( Name scope, Name code, Name table, + uint128_t* primary, uint128_t* secondary, char* value, uint32_t valuelen ) { + + require_scope( scope ); + const auto& idx = db.get_index(); + auto itr = idx.lower_bound( boost::make_tuple( uint64_t(scope), + uint64_t(code), + uint64_t(table), + *secondary, uint128_t(0) ) ); + + if( itr == idx.end() || + itr->scope != (scope) || + itr->code != (code) || + itr->table != (table) || + itr->secondary_key != *secondary ) return -1; + + *primary = itr->primary_key; + + auto copylen = std::min(itr->value.size(),valuelen); + if( copylen ) { + itr->value.copy(value, copylen); + } + return copylen; +} + int32_t message_validate_context::lowerbound_primary_i128i128( Name scope, Name code, Name table, uint128_t* primary, uint128_t* secondary, char* value, uint32_t valuelen ) {