@ -14,6 +14,64 @@
@@ -14,6 +14,64 @@
# include <leveldb/filter_policy.h>
# include <memenv.h>
# include <stdint.h>
# include <algorithm>
class CBitcoinLevelDBLogger : public leveldb : : Logger {
public :
// This code is adapted from posix_logger.h, which is why it is using vsprintf.
// Please do not do this in normal code
virtual void Logv ( const char * format , va_list ap ) override {
if ( ! LogAcceptCategory ( " leveldb " ) )
return ;
char buffer [ 500 ] ;
for ( int iter = 0 ; iter < 2 ; iter + + ) {
char * base ;
int bufsize ;
if ( iter = = 0 ) {
bufsize = sizeof ( buffer ) ;
base = buffer ;
}
else {
bufsize = 30000 ;
base = new char [ bufsize ] ;
}
char * p = base ;
char * limit = base + bufsize ;
// Print the message
if ( p < limit ) {
va_list backup_ap ;
va_copy ( backup_ap , ap ) ;
// Do not use vsnprintf elsewhere in bitcoin source code, see above.
p + = vsnprintf ( p , limit - p , format , backup_ap ) ;
va_end ( backup_ap ) ;
}
// Truncate to available space if necessary
if ( p > = limit ) {
if ( iter = = 0 ) {
continue ; // Try again with larger buffer
}
else {
p = limit - 1 ;
}
}
// Add newline if necessary
if ( p = = base | | p [ - 1 ] ! = ' \n ' ) {
* p + + = ' \n ' ;
}
assert ( p < = limit ) ;
base [ std : : min ( bufsize - 1 , ( int ) ( p - base ) ) ] = ' \0 ' ;
LogPrintStr ( base ) ;
if ( base ! = buffer ) {
delete [ ] base ;
}
break ;
}
}
} ;
static leveldb : : Options GetOptions ( size_t nCacheSize )
{
@ -23,6 +81,7 @@ static leveldb::Options GetOptions(size_t nCacheSize)
@@ -23,6 +81,7 @@ static leveldb::Options GetOptions(size_t nCacheSize)
options . filter_policy = leveldb : : NewBloomFilterPolicy ( 10 ) ;
options . compression = leveldb : : kNoCompression ;
options . max_open_files = 64 ;
options . info_log = new CBitcoinLevelDBLogger ( ) ;
if ( leveldb : : kMajorVersion > 1 | | ( leveldb : : kMajorVersion = = 1 & & leveldb : : kMinorVersion > = 16 ) ) {
// LevelDB versions before 1.16 consider short writes to be corruption. Only trigger error
// on corruption in later versions.
@ -82,6 +141,8 @@ CDBWrapper::~CDBWrapper()
@@ -82,6 +141,8 @@ CDBWrapper::~CDBWrapper()
pdb = NULL ;
delete options . filter_policy ;
options . filter_policy = NULL ;
delete options . info_log ;
options . info_log = NULL ;
delete options . block_cache ;
options . block_cache = NULL ;
delete penv ;