@ -375,39 +375,15 @@ uint64_t BootstrapFile::seek_to_first_chunk(std::ifstream& import_file)
return full_header_size ;
}
uint64_t BootstrapFile : : count_b locks( const std : : string & import_file_path )
uint64_t BootstrapFile : : count_b ytes( std : : ifstream & import_file , uint64_t blocks , uint64_t & h , bool & quit )
{
boost : : filesystem : : path raw_file_path ( import_file_path ) ;
boost : : system : : error_code ec ;
if ( ! boost : : filesystem : : exists ( raw_file_path , ec ) )
{
MFATAL ( " bootstrap file not found: " < < raw_file_path ) ;
throw std : : runtime_error ( " Aborting " ) ;
}
std : : ifstream import_file ;
import_file . open ( import_file_path , std : : ios_base : : binary | std : : ifstream : : in ) ;
uint64_t h = 0 ;
if ( import_file . fail ( ) )
{
MFATAL ( " import_file.open() fail " ) ;
throw std : : runtime_error ( " Aborting " ) ;
}
uint64_t full_header_size ; // 4 byte magic + length of header structures
full_header_size = seek_to_first_chunk ( import_file ) ;
MINFO ( " Scanning blockchain from bootstrap file... " ) ;
block b ;
bool quit = false ;
uint64_t bytes_read = 0 ;
int progress_interval = 10 ;
uint32_t chunk_size ;
char buf1 [ sizeof ( chunk_size ) ] ;
std : : string str1 ;
char buf1 [ 2048 ] ;
while ( ! quit )
h = 0 ;
while ( 1 )
{
uint32_t chunk_size ;
import_file . read ( buf1 , sizeof ( chunk_size ) ) ;
if ( ! import_file ) {
std : : cout < < refresh_string ;
@ -415,15 +391,7 @@ uint64_t BootstrapFile::count_blocks(const std::string& import_file_path)
quit = true ;
break ;
}
h + = NUM_BLOCKS_PER_CHUNK ;
if ( ( h - 1 ) % progress_interval = = 0 )
{
std : : cout < < " \r " < < " block height: " < < h - 1 < <
" " < <
std : : flush ;
}
bytes_read + = sizeof ( chunk_size ) ;
str1 . assign ( buf1 , sizeof ( chunk_size ) ) ;
if ( ! : : serialization : : parse_binary ( str1 , chunk_size ) )
throw std : : runtime_error ( " Error in deserialization of chunk_size " ) ;
@ -456,6 +424,64 @@ uint64_t BootstrapFile::count_blocks(const std::string& import_file_path)
throw std : : runtime_error ( " Aborting " ) ;
}
bytes_read + = chunk_size ;
h + = NUM_BLOCKS_PER_CHUNK ;
if ( h > = blocks )
break ;
}
return bytes_read ;
}
uint64_t BootstrapFile : : count_blocks ( const std : : string & import_file_path )
{
streampos dummy_pos ;
uint64_t dummy_height = 0 ;
return count_blocks ( import_file_path , dummy_pos , dummy_height ) ;
}
// If seek_height is non-zero on entry, return a stream position <= this height when finished.
// And return the actual height corresponding to this position. Allows the caller to locate its
// starting position without having to reread the entire file again.
uint64_t BootstrapFile : : count_blocks ( const std : : string & import_file_path , streampos & start_pos , uint64_t & seek_height )
{
boost : : filesystem : : path raw_file_path ( import_file_path ) ;
boost : : system : : error_code ec ;
if ( ! boost : : filesystem : : exists ( raw_file_path , ec ) )
{
MFATAL ( " bootstrap file not found: " < < raw_file_path ) ;
throw std : : runtime_error ( " Aborting " ) ;
}
std : : ifstream import_file ;
import_file . open ( import_file_path , std : : ios_base : : binary | std : : ifstream : : in ) ;
uint64_t start_height = seek_height ;
uint64_t h = 0 ;
if ( import_file . fail ( ) )
{
MFATAL ( " import_file.open() fail " ) ;
throw std : : runtime_error ( " Aborting " ) ;
}
uint64_t full_header_size ; // 4 byte magic + length of header structures
full_header_size = seek_to_first_chunk ( import_file ) ;
MINFO ( " Scanning blockchain from bootstrap file... " ) ;
bool quit = false ;
uint64_t bytes_read = 0 , blocks ;
int progress_interval = 10 ;
while ( ! quit )
{
if ( start_height & & h + progress_interval > = start_height - 1 )
{
start_height = 0 ;
start_pos = import_file . tellg ( ) ;
seek_height = h ;
}
bytes_read + = count_bytes ( import_file , progress_interval , blocks , quit ) ;
h + = blocks ;
std : : cout < < " \r " < < " block height: " < < h - 1 < <
" " < <
std : : flush ;
// std::cout << refresh_string;
MDEBUG ( " Number bytes scanned: " < < bytes_read ) ;