@ -271,59 +271,6 @@ std::vector<CompressionType> GetSupportedCompressions() {
}
}
# ifndef ROCKSDB_LITE
# ifndef ROCKSDB_LITE
namespace {
bool SerializeVectorCompressionType ( const std : : vector < CompressionType > & types ,
std : : string * value ) {
std : : stringstream ss ;
bool result ;
for ( size_t i = 0 ; i < types . size ( ) ; + + i ) {
if ( i > 0 ) {
ss < < ' : ' ;
}
std : : string string_type ;
result = SerializeEnum < CompressionType > ( compression_type_string_map ,
types [ i ] , & string_type ) ;
if ( result = = false ) {
return result ;
}
ss < < string_type ;
}
* value = ss . str ( ) ;
return true ;
}
bool ParseVectorCompressionType (
const std : : string & value ,
std : : vector < CompressionType > * compression_per_level ) {
compression_per_level - > clear ( ) ;
size_t start = 0 ;
while ( start < value . size ( ) ) {
size_t end = value . find ( ' : ' , start ) ;
bool is_ok ;
CompressionType type ;
if ( end = = std : : string : : npos ) {
is_ok = ParseEnum < CompressionType > ( compression_type_string_map ,
value . substr ( start ) , & type ) ;
if ( ! is_ok ) {
return false ;
}
compression_per_level - > emplace_back ( type ) ;
break ;
} else {
is_ok = ParseEnum < CompressionType > (
compression_type_string_map , value . substr ( start , end - start ) , & type ) ;
if ( ! is_ok ) {
return false ;
}
compression_per_level - > emplace_back ( type ) ;
start = end + 1 ;
}
}
return true ;
}
} // anonymouse namespace
bool ParseSliceTransformHelper (
bool ParseSliceTransformHelper (
const std : : string & kFixedPrefixName , const std : : string & kCappedPrefixName ,
const std : : string & kFixedPrefixName , const std : : string & kCappedPrefixName ,
const std : : string & value ,
const std : : string & value ,
@ -394,9 +341,6 @@ bool ParseOptionHelper(char* opt_address, const OptionType& opt_type,
case OptionType : : kInt64T :
case OptionType : : kInt64T :
PutUnaligned ( reinterpret_cast < int64_t * > ( opt_address ) , ParseInt64 ( value ) ) ;
PutUnaligned ( reinterpret_cast < int64_t * > ( opt_address ) , ParseInt64 ( value ) ) ;
break ;
break ;
case OptionType : : kVectorInt :
* reinterpret_cast < std : : vector < int > * > ( opt_address ) = ParseVectorInt ( value ) ;
break ;
case OptionType : : kUInt :
case OptionType : : kUInt :
* reinterpret_cast < unsigned int * > ( opt_address ) = ParseUint32 ( value ) ;
* reinterpret_cast < unsigned int * > ( opt_address ) = ParseUint32 ( value ) ;
break ;
break ;
@ -427,9 +371,6 @@ bool ParseOptionHelper(char* opt_address, const OptionType& opt_type,
return ParseEnum < CompressionType > (
return ParseEnum < CompressionType > (
compression_type_string_map , value ,
compression_type_string_map , value ,
reinterpret_cast < CompressionType * > ( opt_address ) ) ;
reinterpret_cast < CompressionType * > ( opt_address ) ) ;
case OptionType : : kVectorCompressionType :
return ParseVectorCompressionType (
value , reinterpret_cast < std : : vector < CompressionType > * > ( opt_address ) ) ;
case OptionType : : kSliceTransform :
case OptionType : : kSliceTransform :
return ParseSliceTransform (
return ParseSliceTransform (
value , reinterpret_cast < std : : shared_ptr < const SliceTransform > * > (
value , reinterpret_cast < std : : shared_ptr < const SliceTransform > * > (
@ -474,9 +415,6 @@ bool SerializeSingleOptionHelper(const char* opt_address,
* value = ToString ( v ) ;
* value = ToString ( v ) ;
}
}
break ;
break ;
case OptionType : : kVectorInt :
return SerializeIntVector (
* reinterpret_cast < const std : : vector < int > * > ( opt_address ) , value ) ;
case OptionType : : kUInt :
case OptionType : : kUInt :
* value = ToString ( * ( reinterpret_cast < const unsigned int * > ( opt_address ) ) ) ;
* value = ToString ( * ( reinterpret_cast < const unsigned int * > ( opt_address ) ) ) ;
break ;
break ;
@ -516,11 +454,6 @@ bool SerializeSingleOptionHelper(const char* opt_address,
return SerializeEnum < CompressionType > (
return SerializeEnum < CompressionType > (
compression_type_string_map ,
compression_type_string_map ,
* ( reinterpret_cast < const CompressionType * > ( opt_address ) ) , value ) ;
* ( reinterpret_cast < const CompressionType * > ( opt_address ) ) , value ) ;
case OptionType : : kVectorCompressionType :
return SerializeVectorCompressionType (
* ( reinterpret_cast < const std : : vector < CompressionType > * > ( opt_address ) ) ,
value ) ;
break ;
case OptionType : : kSliceTransform : {
case OptionType : : kSliceTransform : {
const auto * slice_transform_ptr =
const auto * slice_transform_ptr =
reinterpret_cast < const std : : shared_ptr < const SliceTransform > * > (
reinterpret_cast < const std : : shared_ptr < const SliceTransform > * > (
@ -700,58 +633,17 @@ Status StringToMap(const std::string& opts_str,
return Status : : InvalidArgument ( " Empty key found " ) ;
return Status : : InvalidArgument ( " Empty key found " ) ;
}
}
// skip space after '=' and look for '{' for possible nested options
std : : string value ;
pos = eq_pos + 1 ;
Status s = OptionTypeInfo : : NextToken ( opts , ' ; ' , eq_pos + 1 , & pos , & value ) ;
while ( pos < opts . size ( ) & & isspace ( opts [ pos ] ) ) {
if ( ! s . ok ( ) ) {
+ + pos ;
return s ;
}
// Empty value at the end
if ( pos > = opts . size ( ) ) {
( * opts_map ) [ key ] = " " ;
break ;
}
if ( opts [ pos ] = = ' { ' ) {
int count = 1 ;
size_t brace_pos = pos + 1 ;
while ( brace_pos < opts . size ( ) ) {
if ( opts [ brace_pos ] = = ' { ' ) {
+ + count ;
} else if ( opts [ brace_pos ] = = ' } ' ) {
- - count ;
if ( count = = 0 ) {
break ;
}
}
+ + brace_pos ;
}
// found the matching closing brace
if ( count = = 0 ) {
( * opts_map ) [ key ] = trim ( opts . substr ( pos + 1 , brace_pos - pos - 1 ) ) ;
// skip all whitespace and move to the next ';'
// brace_pos points to the next position after the matching '}'
pos = brace_pos + 1 ;
while ( pos < opts . size ( ) & & isspace ( opts [ pos ] ) ) {
+ + pos ;
}
if ( pos < opts . size ( ) & & opts [ pos ] ! = ' ; ' ) {
return Status : : InvalidArgument (
" Unexpected chars after nested options " ) ;
}
+ + pos ;
} else {
return Status : : InvalidArgument (
" Mismatched curly braces for nested options " ) ;
}
} else {
} else {
size_t sc_pos = opts . find ( ' ; ' , pos ) ;
( * opts_map ) [ key ] = value ;
if ( sc_pos = = std : : string : : npos ) {
if ( pos = = std : : string : : npos ) {
( * opts_map ) [ key ] = trim ( opts . substr ( pos ) ) ;
// It either ends with a trailing semi-colon or the last key-value pair
break ;
break ;
} else {
} else {
( * opts_map ) [ key ] = trim ( opts . substr ( pos , sc_pos - pos ) ) ;
pos + + ;
}
}
pos = sc_pos + 1 ;
}
}
}
}
@ -1086,6 +978,59 @@ std::unordered_map<std::string, CompactionStopStyle>
{ " kCompactionStopStyleSimilarSize " , kCompactionStopStyleSimilarSize } ,
{ " kCompactionStopStyleSimilarSize " , kCompactionStopStyleSimilarSize } ,
{ " kCompactionStopStyleTotalSize " , kCompactionStopStyleTotalSize } } ;
{ " kCompactionStopStyleTotalSize " , kCompactionStopStyleTotalSize } } ;
Status OptionTypeInfo : : NextToken ( const std : : string & opts , char delimiter ,
size_t pos , size_t * end , std : : string * token ) {
while ( pos < opts . size ( ) & & isspace ( opts [ pos ] ) ) {
+ + pos ;
}
// Empty value at the end
if ( pos > = opts . size ( ) ) {
* token = " " ;
* end = std : : string : : npos ;
return Status : : OK ( ) ;
} else if ( opts [ pos ] = = ' { ' ) {
int count = 1 ;
size_t brace_pos = pos + 1 ;
while ( brace_pos < opts . size ( ) ) {
if ( opts [ brace_pos ] = = ' { ' ) {
+ + count ;
} else if ( opts [ brace_pos ] = = ' } ' ) {
- - count ;
if ( count = = 0 ) {
break ;
}
}
+ + brace_pos ;
}
// found the matching closing brace
if ( count = = 0 ) {
* token = trim ( opts . substr ( pos + 1 , brace_pos - pos - 1 ) ) ;
// skip all whitespace and move to the next delimiter
// brace_pos points to the next position after the matching '}'
pos = brace_pos + 1 ;
while ( pos < opts . size ( ) & & isspace ( opts [ pos ] ) ) {
+ + pos ;
}
if ( pos < opts . size ( ) & & opts [ pos ] ! = delimiter ) {
return Status : : InvalidArgument ( " Unexpected chars after nested options " ) ;
}
* end = pos ;
} else {
return Status : : InvalidArgument (
" Mismatched curly braces for nested options " ) ;
}
} else {
* end = opts . find ( delimiter , pos ) ;
if ( * end = = std : : string : : npos ) {
// It either ends with a trailing semi-colon or the last key-value pair
* token = trim ( opts . substr ( pos ) ) ;
} else {
* token = trim ( opts . substr ( pos , * end - pos ) ) ;
}
}
return Status : : OK ( ) ;
}
Status OptionTypeInfo : : Parse ( const ConfigOptions & config_options ,
Status OptionTypeInfo : : Parse ( const ConfigOptions & config_options ,
const std : : string & opt_name ,
const std : : string & opt_name ,
const std : : string & opt_value ,
const std : : string & opt_value ,
@ -1258,8 +1203,6 @@ static bool AreOptionsEqual(OptionType type, const char* this_offset,
GetUnaligned ( reinterpret_cast < const int64_t * > ( that_offset ) , & v2 ) ;
GetUnaligned ( reinterpret_cast < const int64_t * > ( that_offset ) , & v2 ) ;
return ( v1 = = v2 ) ;
return ( v1 = = v2 ) ;
}
}
case OptionType : : kVectorInt :
return IsOptionEqual < std : : vector < int > > ( this_offset , that_offset ) ;
case OptionType : : kUInt32T :
case OptionType : : kUInt32T :
return IsOptionEqual < uint32_t > ( this_offset , that_offset ) ;
return IsOptionEqual < uint32_t > ( this_offset , that_offset ) ;
case OptionType : : kUInt64T : {
case OptionType : : kUInt64T : {
@ -1279,9 +1222,6 @@ static bool AreOptionsEqual(OptionType type, const char* this_offset,
case OptionType : : kDouble :
case OptionType : : kDouble :
return AreEqualDoubles ( * reinterpret_cast < const double * > ( this_offset ) ,
return AreEqualDoubles ( * reinterpret_cast < const double * > ( this_offset ) ,
* reinterpret_cast < const double * > ( that_offset ) ) ;
* reinterpret_cast < const double * > ( that_offset ) ) ;
case OptionType : : kVectorCompressionType :
return IsOptionEqual < std : : vector < CompressionType > > ( this_offset ,
that_offset ) ;
case OptionType : : kCompactionStyle :
case OptionType : : kCompactionStyle :
return IsOptionEqual < CompactionStyle > ( this_offset , that_offset ) ;
return IsOptionEqual < CompactionStyle > ( this_offset , that_offset ) ;
case OptionType : : kCompactionStopStyle :
case OptionType : : kCompactionStopStyle :