diff --git a/libraries/db/include/graphene/db/index.hpp b/libraries/db/include/graphene/db/index.hpp index 6a6fb3f1..c02aeb69 100644 --- a/libraries/db/include/graphene/db/index.hpp +++ b/libraries/db/include/graphene/db/index.hpp @@ -183,6 +183,13 @@ namespace graphene { namespace db { FC_THROW_EXCEPTION( fc::assert_exception, "invalid index type" ); } + void delete_secondary_index(const secondary_index& secondary) { + auto itr = std::find_if(_sindex.begin(), _sindex.end(), + [&secondary](const auto& ptr) { return &secondary == ptr.get(); }); + FC_ASSERT(itr != _sindex.end(), "Cannot remove secondary index: secondary index not found"); + _sindex.erase(itr); + } + protected: vector< shared_ptr > _observers; vector< unique_ptr > _sindex; diff --git a/libraries/db/include/graphene/db/object_database.hpp b/libraries/db/include/graphene/db/object_database.hpp index a1efbfff..f96f29c3 100644 --- a/libraries/db/include/graphene/db/object_database.hpp +++ b/libraries/db/include/graphene/db/object_database.hpp @@ -152,6 +152,27 @@ namespace graphene { namespace db { { return get_mutable_index_type().template add_secondary_index(); } + template + SecondaryIndexType* add_secondary_index(const uint8_t space_id, const uint8_t type_id) + { + auto* base_primary = dynamic_cast(&get_mutable_index(space_id, type_id)); + FC_ASSERT(base_primary != nullptr, + "Cannot add secondary index: index for space ID ${S} and type ID ${T} does not support secondary indexes.", + ("S", space_id)("T", type_id)); + return base_primary->template add_secondary_index(); + } + + template + void delete_secondary_index(const secondary_index& secondary) { + get_mutable_index_type().delete_secondary_index(secondary); + } + void delete_secondary_index(const uint8_t space_id, const uint8_t type_id, const secondary_index& secondary) { + auto* base_primary = dynamic_cast(&get_mutable_index(space_id, type_id)); + FC_ASSERT(base_primary != nullptr, + "Cannot add secondary index: index for space ID ${S} and type ID ${T} does not support secondary indexes.", + ("S", space_id)("T", type_id)); + base_primary->delete_secondary_index(secondary); + } void pop_undo();