From 31f322c9cd712582e5c74d063d5d9918f6d10e64 Mon Sep 17 00:00:00 2001 From: elmato Date: Tue, 14 Feb 2017 21:39:50 +0000 Subject: [PATCH 1/2] Handle new,changed and removed events from the database_object in one generic function --- libraries/app/database_api.cpp | 105 ++++++++++++++------------------- 1 file changed, 43 insertions(+), 62 deletions(-) diff --git a/libraries/app/database_api.cpp b/libraries/app/database_api.cpp index 4df13551..d460662b 100644 --- a/libraries/app/database_api.cpp +++ b/libraries/app/database_api.cpp @@ -182,12 +182,12 @@ class database_api_impl : public std::enable_shared_from_this void broadcast_updates( const vector& updates ); void broadcast_market_updates( const market_queue_type& queue); - void check_for_market_objects(const vector& ids); + void handle_object_changed(bool force_notify, const vector& ids, std::function find_object); /** called every time a block is applied to report the objects that were changed */ void on_objects_new(const vector& ids); void on_objects_changed(const vector& ids); - void on_objects_removed(const vector& objs); + void on_objects_removed(const vector& ids, const vector& objs); void on_applied_block(); bool _notify_remove_create = false; @@ -225,8 +225,8 @@ database_api_impl::database_api_impl( graphene::chain::database& db ):_db(db) _change_connection = _db.changed_objects.connect([this](const vector& ids) { on_objects_changed(ids); }); - _removed_connection = _db.removed_objects.connect([this](const vector& objs) { - on_objects_removed(objs); + _removed_connection = _db.removed_objects.connect([this](const vector& ids, const vector& objs) { + on_objects_removed(ids, objs); }); _applied_block_connection = _db.applied_block.connect([this](const signed_block&){ on_applied_block(); }); @@ -1849,72 +1849,36 @@ void database_api_impl::broadcast_market_updates( const market_queue_type& queue } } -void database_api_impl::on_objects_removed( const vector& objs ) +void database_api_impl::on_objects_removed( const vector& ids, const vector& objs ) { - /// we need to ensure the database_api is not deleted for the life of the async operation - if( _subscribe_callback ) - { - vector updates; + handle_object_changed(_notify_remove_create, ids, [objs](object_id_type id) -> const object* { - for( auto obj : objs ) - { - if ( is_subscribed_to_item(obj->id) ) - { - updates.push_back( fc::variant(obj->id) ); - } - } + auto it = std::find_if( + objs.begin(), objs.end(), + [id](const object* o) {return o != nullptr && o->id == id;}); - broadcast_updates( updates ); - } + if (it != objs.end()) + return *it; - if( _market_subscriptions.size() ) - { - market_queue_type broadcast_queue; - - for( const auto& obj : objs ) - { - if( obj->id.is() ) - { - enqueue_if_subscribed_to_market( obj, broadcast_queue, false ); - } - else if( obj->id.is() ) - { - enqueue_if_subscribed_to_market( obj, broadcast_queue, false ); - } - } - - broadcast_market_updates(broadcast_queue); - } -} - -void database_api_impl::check_for_market_objects(const vector& ids) -{ - if( _market_subscriptions.size() ) - { - market_queue_type broadcast_queue; - - for(auto id : ids) - { - if( id.is() ) - { - enqueue_if_subscribed_to_market( _db.find_object(id), broadcast_queue ); - } - else if( id.is() ) - { - enqueue_if_subscribed_to_market( _db.find_object(id), broadcast_queue ); - } - } - - broadcast_market_updates(broadcast_queue); - } + return nullptr; + }); } void database_api_impl::on_objects_new(const vector& ids) { - check_for_market_objects(ids); + handle_object_changed(_notify_remove_create, ids, + std::bind(&object_database::find_object, &_db, std::placeholders::_1) + ); } void database_api_impl::on_objects_changed(const vector& ids) +{ + handle_object_changed(false, ids, + std::bind(&object_database::find_object, &_db, std::placeholders::_1) + ); +} + +void database_api_impl::handle_object_changed(bool force_notify, const vector& ids, std::function find_object) { if( _subscribe_callback ) { @@ -1923,9 +1887,9 @@ void database_api_impl::on_objects_changed(const vector& ids) for(auto id : ids) { const object* obj = nullptr; - if( is_subscribed_to_item(id) ) + if( force_notify || is_subscribed_to_item(id) ) { - obj = _db.find_object( id ); + obj = find_object(id); if( obj ) { updates.emplace_back( obj->to_variant() ); @@ -1936,7 +1900,24 @@ void database_api_impl::on_objects_changed(const vector& ids) broadcast_updates(updates); } - check_for_market_objects(ids); + if( _market_subscriptions.size() ) + { + market_queue_type broadcast_queue; + + for(auto id : ids) + { + if( id.is() ) + { + enqueue_if_subscribed_to_market( find_object(id), broadcast_queue ); + } + else if( id.is() ) + { + enqueue_if_subscribed_to_market( find_object(id), broadcast_queue ); + } + } + + broadcast_market_updates(broadcast_queue); + } } /** note: this method cannot yield because it is called in the middle of From 030577f6719a483314c6de7b7e42214399704adb Mon Sep 17 00:00:00 2001 From: elmato Date: Tue, 14 Feb 2017 21:41:40 +0000 Subject: [PATCH 2/2] Fix handling of events from database_object in debug_witness_plugin --- libraries/plugins/debug_witness/debug_witness.cpp | 12 +++--------- .../include/graphene/debug_witness/debug_witness.hpp | 2 +- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/libraries/plugins/debug_witness/debug_witness.cpp b/libraries/plugins/debug_witness/debug_witness.cpp index 751d1e82..19cf0f49 100644 --- a/libraries/plugins/debug_witness/debug_witness.cpp +++ b/libraries/plugins/debug_witness/debug_witness.cpp @@ -99,7 +99,7 @@ void debug_witness_plugin::plugin_startup() _applied_block_conn = db.applied_block.connect([this](const graphene::chain::signed_block& b){ on_applied_block(b); }); _changed_objects_conn = db.changed_objects.connect([this](const std::vector& ids){ on_changed_objects(ids); }); - _removed_objects_conn = db.removed_objects.connect([this](const std::vector& objs){ on_removed_objects(objs); }); + _removed_objects_conn = db.removed_objects.connect([this](const std::vector& ids, const std::vector& objs){ on_removed_objects(ids, objs); }); return; } @@ -112,11 +112,7 @@ void debug_witness_plugin::on_changed_objects( const std::vectorto_variant() ) << '\n'; } @@ -124,9 +120,8 @@ void debug_witness_plugin::on_changed_objects( const std::vector objs ) +void debug_witness_plugin::on_removed_objects( const std::vector& ids, const std::vector objs ) { - /* if( _json_object_stream ) { for( const graphene::db::object* obj : objs ) @@ -134,7 +129,6 @@ void debug_witness_plugin::on_removed_objects( const std::vectorid ) << "}\n"; } } - */ } void debug_witness_plugin::on_applied_block( const graphene::chain::signed_block& b ) diff --git a/libraries/plugins/debug_witness/include/graphene/debug_witness/debug_witness.hpp b/libraries/plugins/debug_witness/include/graphene/debug_witness/debug_witness.hpp index 0e5c173f..fa387891 100644 --- a/libraries/plugins/debug_witness/include/graphene/debug_witness/debug_witness.hpp +++ b/libraries/plugins/debug_witness/include/graphene/debug_witness/debug_witness.hpp @@ -51,7 +51,7 @@ public: private: void on_changed_objects( const std::vector& ids ); - void on_removed_objects( const std::vector objs ); + void on_removed_objects( const std::vector& ids, const std::vector objs ); void on_applied_block( const graphene::chain::signed_block& b ); boost::program_options::variables_map _options;