Fix block_database::fetch_optional() and friends, which were throwing in

some cases where the requested block was not available instead of
returing an invalid optional.
This commit is contained in:
Eric Frias 2015-06-18 14:47:53 -04:00
parent f44bb5d1eb
commit 52a1db3700

View file

@ -135,7 +135,9 @@ block_id_type block_database::fetch_block_id( uint32_t block_num )const
optional<signed_block> block_database::fetch_optional( const block_id_type& id )const optional<signed_block> block_database::fetch_optional( const block_id_type& id )const
{ try { {
try
{
index_entry e; index_entry e;
auto index_pos = sizeof(e)*block_header::num_from_id(id); auto index_pos = sizeof(e)*block_header::num_from_id(id);
_block_num_to_pos.seekg( 0, _block_num_to_pos.end ); _block_num_to_pos.seekg( 0, _block_num_to_pos.end );
@ -152,11 +154,20 @@ optional<signed_block> block_database::fetch_optional( const block_id_type& id )
auto result = fc::raw::unpack<signed_block>(data); auto result = fc::raw::unpack<signed_block>(data);
FC_ASSERT( result.id() == e.block_id ); FC_ASSERT( result.id() == e.block_id );
return result; return result;
} FC_CAPTURE_AND_RETHROW( (id) ) } }
catch (const fc::exception&)
{
}
catch (const std::exception&)
{
}
return optional<signed_block>();
}
optional<signed_block> block_database::fetch_by_number( uint32_t block_num )const optional<signed_block> block_database::fetch_by_number( uint32_t block_num )const
{ try { {
try
{
index_entry e; index_entry e;
auto index_pos = sizeof(e)*block_num; auto index_pos = sizeof(e)*block_num;
_block_num_to_pos.seekg( 0, _block_num_to_pos.end ); _block_num_to_pos.seekg( 0, _block_num_to_pos.end );
@ -171,11 +182,21 @@ optional<signed_block> block_database::fetch_by_number( uint32_t block_num )cons
auto result = fc::raw::unpack<signed_block>(data); auto result = fc::raw::unpack<signed_block>(data);
FC_ASSERT( result.id() == e.block_id ); FC_ASSERT( result.id() == e.block_id );
return result; return result;
} FC_CAPTURE_AND_RETHROW( (block_num) ) } }
catch (const fc::exception&)
{
}
catch (const std::exception&)
{
}
return optional<signed_block>();
}
optional<signed_block> block_database::last()const optional<signed_block> block_database::last()const
{ {
try
{
index_entry e; index_entry e;
_block_num_to_pos.seekg( 0, _block_num_to_pos.end ); _block_num_to_pos.seekg( 0, _block_num_to_pos.end );
@ -198,7 +219,14 @@ optional<signed_block> block_database::last()const
_blocks.read( data.data(), e.block_size ); _blocks.read( data.data(), e.block_size );
auto result = fc::raw::unpack<signed_block>(data); auto result = fc::raw::unpack<signed_block>(data);
return result; return result;
}
catch (const fc::exception&)
{
}
catch (const std::exception&)
{
}
return optional<signed_block>();
} }
} } } }