@ -78,6 +78,31 @@ using namespace cryptonote;
using namespace epee ;
// db_type: lmdb, berkeley
// db_mode: safe, fast, fastest
int get_db_flags_from_mode ( const std : : string & db_type , const std : : string & db_mode )
{
uint64_t BDB_FAST_MODE = 0 ;
uint64_t BDB_FASTEST_MODE = 0 ;
uint64_t BDB_SAFE_MODE = 0 ;
# if defined(BERKELEY_DB)
BDB_FAST_MODE = DB_TXN_WRITE_NOSYNC ;
BDB_FASTEST_MODE = DB_TXN_NOSYNC ;
BDB_SAFE_MODE = DB_TXN_SYNC ;
# endif
int db_flags = 0 ;
bool islmdb = db_type = = " lmdb " ;
if ( db_mode = = " safe " )
db_flags = islmdb ? MDB_NORDAHEAD : BDB_SAFE_MODE ;
else if ( db_mode = = " fast " )
db_flags = islmdb ? MDB_NOMETASYNC | MDB_NOSYNC | MDB_NORDAHEAD : BDB_FAST_MODE ;
else if ( db_mode = = " fastest " )
db_flags = islmdb ? MDB_WRITEMAP | MDB_MAPASYNC | MDB_NORDAHEAD | MDB_NOMETASYNC | MDB_NOSYNC : BDB_FASTEST_MODE ;
return db_flags ;
}
int parse_db_arguments ( const std : : string & db_arg_str , std : : string & db_type , int & db_flags )
{
std : : vector < std : : string > db_args ;
@ -95,8 +120,33 @@ int parse_db_arguments(const std::string& db_arg_str, std::string& db_type, int&
return 1 ;
}
# if !defined(BERKELEY_DB)
if ( db_type = = " berkeley " )
{
LOG_ERROR ( " BerkeleyDB support disabled. " ) ;
return false ;
}
# endif
std : : string db_arg_str2 = db_args [ 1 ] ;
boost : : split ( db_args , db_arg_str2 , boost : : is_any_of ( " , " ) ) ;
// optionally use a composite mode instead of individual flags
const std : : unordered_set < std : : string > db_modes { " safe " , " fast " , " fastest " } ;
std : : string db_mode ;
if ( db_args . size ( ) = = 1 )
{
if ( db_modes . count ( db_args [ 0 ] ) > 0 )
{
db_mode = db_args [ 0 ] ;
}
}
if ( ! db_mode . empty ( ) )
{
db_flags = get_db_flags_from_mode ( db_type , db_mode ) ;
}
else
{
for ( auto & it : db_args )
{
boost : : algorithm : : trim ( it ) ;
@ -135,6 +185,7 @@ int parse_db_arguments(const std::string& db_arg_str, std::string& db_type, int&
std : : cerr < < " unrecognized database flag: " < < it < < ENDL ;
return 1 ;
}
}
# endif
}
}