void debug_apply_update( database& db, const fc::variant_object& vo ) { static const uint8_t db_action_nil = 0, db_action_create = 1, db_action_write = 2, db_action_update = 3, db_action_delete = 4; // "_action" : "create" object must not exist, unspecified fields take defaults // "_action" : "write" object may exist, is replaced entirely, unspecified fields take defaults // "_action" : "update" object must exist, unspecified fields don't change // "_action" : "delete" object must exist, will be deleted // if _action is unspecified: // - delete if object contains only ID field // - otherwise, write object_id_type oid; uint8_t action = db_action_nil; auto it_id = vo.find("id"); FC_ASSERT( it_id != vo.end() ); from_variant( it_id->value(), oid ); action = ( vo.size() == 1 ) ? db_action_delete : db_action_write; from_variant( vo["id"], oid ); if( vo.size() == 1 ) action = db_action_delete; auto it_action = vo.find("_action" ); if( it_action != vo.end() ) { const std::string& str_action = it_action->value().get_string(); if( str_action == "create" ) action = db_action_create; else if( str_action == "write" ) action = db_action_write; else if( str_action == "update" ) action = db_action_update; else if( str_action == "delete" ) action = db_action_delete; } auto& idx = db.get_index( oid ); switch( action ) { case db_action_create: FC_ASSERT( false ); break; case db_action_write: db.modify( db.get_object( oid ), [&]( object& obj ) { idx.object_default( obj ); idx.object_from_variant( vo, obj, GRAPHENE_MAX_NESTED_OBJECTS ); } ); break; case db_action_update: db.modify( db.get_object( oid ), [&]( object& obj ) { idx.object_from_variant( vo, obj, GRAPHENE_MAX_NESTED_OBJECTS ); } ); break; case db_action_delete: db.remove( db.get_object( oid ) ); break; default: FC_ASSERT( false ); } }
void debug_apply_update( chain::database& db, const fc::variant_object& vo ) { static const uint8_t db_action_nil = 0, db_action_create = 1, db_action_write = 2, db_action_update = 3, db_action_delete = 4, db_action_set_hardfork = 5; wlog( "debug_apply_update: ${o}", ("o", vo) ); // "_action" : "create" object must not exist, unspecified fields take defaults // "_action" : "write" object may exist, is replaced entirely, unspecified fields take defaults // "_action" : "update" object must exist, unspecified fields don't change // "_action" : "delete" object must exist, will be deleted // if _action is unspecified: // - delete if object contains only ID field // - otherwise, write graphene::db::object_id_type oid; uint8_t action = db_action_nil; auto it_id = vo.find("id"); FC_ASSERT( it_id != vo.end() ); from_variant( it_id->value(), oid ); action = ( vo.size() == 1 ) ? db_action_delete : db_action_write; from_variant( vo["id"], oid ); if( vo.size() == 1 ) action = db_action_delete; auto it_action = vo.find("_action" ); if( it_action != vo.end() ) { const std::string& str_action = it_action->value().get_string(); if( str_action == "create" ) action = db_action_create; else if( str_action == "write" ) action = db_action_write; else if( str_action == "update" ) action = db_action_update; else if( str_action == "delete" ) action = db_action_delete; else if( str_action == "set_hardfork" ) action = db_action_set_hardfork; } auto& idx = db.get_index( oid ); switch( action ) { case db_action_create: /* idx.create( [&]( object& obj ) { idx.object_from_variant( vo, obj ); } ); */ FC_ASSERT( false ); break; case db_action_write: db.modify( db.get_object( oid ), [&]( graphene::db::object& obj ) { idx.object_default( obj ); idx.object_from_variant( vo, obj ); } ); break; case db_action_update: db.modify( db.get_object( oid ), [&]( graphene::db::object& obj ) { idx.object_from_variant( vo, obj ); } ); break; case db_action_delete: db.remove( db.get_object( oid ) ); break; case db_action_set_hardfork: { uint32_t hardfork_id; from_variant( vo[ "hardfork_id" ], hardfork_id ); db.set_hardfork( hardfork_id, false ); } break; default: FC_ASSERT( false ); } }