void  fork_database::_push_block(const item_ptr& item)
{
   if( _head ) // make sure the block is within the range that we are caching
   {
      FC_ASSERT( item->num > std::max<int64_t>( 0, int64_t(_head->num) - (_max_size) ),
                 "attempting to push a block that is too old", 
                 ("item->num",item->num)("head",_head->num)("max_size",_max_size));
   }

   if( _head && item->previous_id() != block_id_type() )
   {
      auto& index = _index.get<block_id>();
      auto itr = index.find(item->previous_id());
      GRAPHENE_ASSERT(itr != index.end(), unlinkable_block_exception, "block does not link to known chain");
      item->prev = *itr;
   }

   _index.insert(item);
   if( !_head ) _head = item;
   else if( item->num > _head->num )
   {
      _head = item;
      uint32_t min_num = _head->num - std::min( _max_size, _head->num );
//      ilog( "min block in fork DB ${n}, max_size: ${m}", ("n",min_num)("m",_max_size) );
      auto& num_idx = _index.get<block_num>();
      while( num_idx.size() && (*num_idx.begin())->num < min_num )
         num_idx.erase( num_idx.begin() );
      
      _unlinked_index.get<block_num>().erase(_head->num - _max_size);
   }
   //_push_next( item );
}
Exemple #2
0
void  fork_database::_push_block(const item_ptr& item)
{
    if( _head ) // make sure the block is within the range that we are caching
    {
        FC_ASSERT( item->num > std::max<int64_t>( 0, int64_t(_head->num) - (_max_size) ),
                   "attempting to push a block that is too old",
                   ("item->num",item->num)("head",_head->num)("max_size",_max_size));
        FC_ASSERT( item->num < _head->num + MAX_BLOCK_REORDERING );
    }

    if( _head && item->previous_id() != block_id_type() )
    {
        auto& index = _index.get<block_id>();
        auto itr = index.find(item->previous_id());
        GRAPHENE_ASSERT(itr != index.end(), unlinkable_block_exception, "block does not link to known chain");
        FC_ASSERT(!(*itr)->invalid);
        item->prev = *itr;
    }

    _index.insert(item);
    if( !_head ) _head = item;
    else if( item->num > _head->num )
    {
        _head = item;
        _index.get<block_num>().erase(_head->num - _max_size);
        _unlinked_index.get<block_num>().erase(_head->num - _max_size);
    }

    _push_next( item );
}
Exemple #3
0
			item_ptr remove(item_ptr i, unsigned int n)
			{
				auto part = std::make_shared<item_type>();

				if (i->split(n, *part) == 0) remove(i);

				return part;
			}
Exemple #4
0
			void add(item_ptr i)
			{
				for (item_ptr stack : m_items)
				{
					if (stack->can_stack(*i))
					{
						stack->stack(*i);

						if (i->stack_size() == 0) return;
					}
				}
				m_items.push_back(i);
			}
Exemple #5
0
item_list eval(item_ptr &item) {
    item->eval();
    return item->output;
}