update subscriptions to work with keys

This commit is contained in:
Daniel Larimer 2015-08-28 13:58:49 -04:00
parent a23e2ec3fe
commit c1b5eb95e1
3 changed files with 59 additions and 21 deletions

View file

@ -67,14 +67,6 @@ namespace graphene { namespace app {
} }
} }
void database_api::subscribe_to_id( object_id_type id )const
{
idump((id));
if( _subscribe_callback )
_subscribe_filter.insert( (const unsigned char*)&id, sizeof(id) );
else
elog( "unable to subscribe to id because there is no subscribe callback set" );
}
fc::variants database_api::get_objects(const vector<object_id_type>& ids)const fc::variants database_api::get_objects(const vector<object_id_type>& ids)const
{ {
if( _subscribe_callback ) { if( _subscribe_callback ) {
@ -83,7 +75,7 @@ namespace graphene { namespace app {
if( id.type() == operation_history_object_type && id.space() == protocol_ids ) continue; if( id.type() == operation_history_object_type && id.space() == protocol_ids ) continue;
if( id.type() == impl_account_transaction_history_object_type && id.space() == implementation_ids ) continue; if( id.type() == impl_account_transaction_history_object_type && id.space() == implementation_ids ) continue;
subscribe_to_id( id ); this->subscribe_to_item( id );
} }
} }
else else
@ -188,7 +180,7 @@ namespace graphene { namespace app {
[this](account_id_type id) -> optional<account_object> { [this](account_id_type id) -> optional<account_object> {
if(auto o = _db.find(id)) if(auto o = _db.find(id))
{ {
subscribe_to_id( id ); subscribe_to_item( id );
return *o; return *o;
} }
return {}; return {};
@ -203,7 +195,7 @@ namespace graphene { namespace app {
[this](asset_id_type id) -> optional<asset_object> { [this](asset_id_type id) -> optional<asset_object> {
if(auto o = _db.find(id)) if(auto o = _db.find(id))
{ {
subscribe_to_id( id ); subscribe_to_item( id );
return *o; return *o;
} }
return {}; return {};
@ -228,7 +220,7 @@ namespace graphene { namespace app {
{ {
result.insert(make_pair(itr->name, itr->get_id())); result.insert(make_pair(itr->name, itr->get_id()));
if( limit == 1 ) if( limit == 1 )
subscribe_to_id( itr->get_id() ); subscribe_to_item( itr->get_id() );
} }
return result; return result;
@ -256,7 +248,7 @@ namespace graphene { namespace app {
if( subscribe ) if( subscribe )
{ {
ilog( "subscribe to ${id}", ("id",account->name) ); ilog( "subscribe to ${id}", ("id",account->name) );
subscribe_to_id( account->id ); subscribe_to_item( account->id );
} }
// fc::mutable_variant_object full_account; // fc::mutable_variant_object full_account;
@ -881,6 +873,28 @@ namespace graphene { namespace app {
obj = _db.find_object( id ); obj = _db.find_object( id );
if( obj ) if( obj )
{ {
auto acnt = dynamic_cast<const account_object*>(obj);
if( acnt )
{
bool added_account = false;
for( const auto& key : acnt->owner.key_auths )
if( is_subscribed_to_item( key.first ) )
{
updates.emplace_back( obj->to_variant() );
added_account = true;
break;
}
for( const auto& key : acnt->active.key_auths )
if( is_subscribed_to_item( key.first ) )
{
updates.emplace_back( obj->to_variant() );
added_account = true;
break;
}
if( added_account )
continue;
}
vector<account_id_type> relevant = get_relevant_accounts( obj ); vector<account_id_type> relevant = get_relevant_accounts( obj );
for( const auto& r : relevant ) for( const auto& r : relevant )
{ {
@ -1080,11 +1094,19 @@ namespace graphene { namespace app {
for( auto& key : keys ) for( auto& key : keys )
{ {
address a1( pts_address(key, false, 56) );
address a2( pts_address(key, true, 56) ); address a1( pts_address(key, false, 56) );
address a3( pts_address(key, false, 0) ); address a2( pts_address(key, true, 56) );
address a4( pts_address(key, true, 0) ); address a3( pts_address(key, false, 0) );
address a5( key ); address a4( pts_address(key, true, 0) );
address a5( key );
subscribe_to_item( key );
subscribe_to_item( a1 );
subscribe_to_item( a2 );
subscribe_to_item( a3 );
subscribe_to_item( a4 );
subscribe_to_item( a5 );
const auto& idx = _db.get_index_type<account_index>(); const auto& idx = _db.get_index_type<account_index>();
const auto& aidx = dynamic_cast<const primary_index<account_index>&>(idx); const auto& aidx = dynamic_cast<const primary_index<account_index>&>(idx);
@ -1113,6 +1135,10 @@ namespace graphene { namespace app {
} }
final_result.emplace_back( std::move(result) ); final_result.emplace_back( std::move(result) );
} }
for( auto i : final_result )
subscribe_to_item(i);
return final_result; return final_result;
} }
@ -1169,6 +1195,7 @@ namespace graphene { namespace app {
for( const auto& owner : addrs ) for( const auto& owner : addrs )
{ {
subscribe_to_item( owner );
auto itr = by_owner_idx.lower_bound( boost::make_tuple( owner, asset_id_type(0) ) ); auto itr = by_owner_idx.lower_bound( boost::make_tuple( owner, asset_id_type(0) ) );
while( itr != by_owner_idx.end() && itr->owner == owner ) while( itr != by_owner_idx.end() && itr->owner == owner )
{ {

View file

@ -297,7 +297,6 @@ namespace graphene { namespace app {
*/ */
void cancel_all_subscriptions() void cancel_all_subscriptions()
{ set_subscribe_callback( std::function<void(const fc::variant&)>(), true); _market_subscriptions.clear(); } { set_subscribe_callback( std::function<void(const fc::variant&)>(), true); _market_subscriptions.clear(); }
///@}
/// @brief Get a hexdump of the serialized binary form of a transaction /// @brief Get a hexdump of the serialized binary form of a transaction
std::string get_transaction_hex(const signed_transaction& trx)const; std::string get_transaction_hex(const signed_transaction& trx)const;
@ -357,7 +356,19 @@ namespace graphene { namespace app {
void set_subscribe_callback( std::function<void(const variant&)> cb, bool clear_filter ); void set_subscribe_callback( std::function<void(const variant&)> cb, bool clear_filter );
private: private:
void subscribe_to_id( object_id_type id )const; template<typename T>
void subscribe_to_item( const T& i )const
{
if( !_subscribe_callback ) return;
_subscribe_filter.insert( (const char*)&i, sizeof(i) );
}
template<typename T>
bool is_subscribed_to_item( const T& i )const
{
if( !_subscribe_callback ) return false;
return _subscribe_filter.contains( i );
}
/** called every time a block is applied to report the objects that were changed */ /** called every time a block is applied to report the objects that were changed */
void on_objects_changed(const vector<object_id_type>& ids); void on_objects_changed(const vector<object_id_type>& ids);

View file

@ -46,7 +46,7 @@ witness_id_type database::get_scheduled_witness( uint32_t slot_num )const
const flat_set< witness_id_type >& active_witnesses = get_global_properties().active_witnesses; const flat_set< witness_id_type >& active_witnesses = get_global_properties().active_witnesses;
uint32_t n = active_witnesses.size(); uint32_t n = active_witnesses.size();
uint64_t min_witness_separation; uint64_t min_witness_separation;
if( BOOST_UNLIKELY( n < 5 ) ) if( GRAPHENE_DEFAULT_MIN_WITNESS_COUNT < 5 && BOOST_UNLIKELY( n < 5 ) )
{ {
// special-case 0 and 1. // special-case 0 and 1.
// for 2 give a value which results in witnesses alternating slots // for 2 give a value which results in witnesses alternating slots