add OptionType kInt32T and kInt64T

Summary: Pull Request resolved: https://github.com/facebook/rocksdb/pull/5061

Differential Revision: D14418581

Pulled By: miasantreble

fbshipit-source-id: be7f90e16586666ddd0cce36971e403782ab0892
main
Zhongyi Xie 5 years ago committed by Facebook Github Bot
parent 5a5c0492db
commit fdc72a5c5d
  1. 16
      options/options_helper.cc
  2. 2
      options/options_helper.h
  3. 10
      options/options_parser.cc
  4. 13
      options/options_test.cc
  5. 2
      port/port_posix.h
  6. 4
      port/win/port_win.h
  7. 35
      util/string_util.cc
  8. 5
      util/string_util.h

@ -454,6 +454,12 @@ bool ParseOptionHelper(char* opt_address, const OptionType& opt_type,
case OptionType::kInt: case OptionType::kInt:
*reinterpret_cast<int*>(opt_address) = ParseInt(value); *reinterpret_cast<int*>(opt_address) = ParseInt(value);
break; break;
case OptionType::kInt32T:
*reinterpret_cast<int32_t*>(opt_address) = ParseInt32(value);
break;
case OptionType::kInt64T:
PutUnaligned(reinterpret_cast<int64_t*>(opt_address), ParseInt64(value));
break;
case OptionType::kVectorInt: case OptionType::kVectorInt:
*reinterpret_cast<std::vector<int>*>(opt_address) = ParseVectorInt(value); *reinterpret_cast<std::vector<int>*>(opt_address) = ParseVectorInt(value);
break; break;
@ -563,6 +569,16 @@ bool SerializeSingleOptionHelper(const char* opt_address,
case OptionType::kInt: case OptionType::kInt:
*value = ToString(*(reinterpret_cast<const int*>(opt_address))); *value = ToString(*(reinterpret_cast<const int*>(opt_address)));
break; break;
case OptionType::kInt32T:
*value = ToString(*(reinterpret_cast<const int32_t*>(opt_address)));
break;
case OptionType::kInt64T:
{
int64_t v;
GetUnaligned(reinterpret_cast<const int64_t*>(opt_address), &v);
*value = ToString(v);
}
break;
case OptionType::kVectorInt: case OptionType::kVectorInt:
return SerializeIntVector( return SerializeIntVector(
*reinterpret_cast<const std::vector<int>*>(opt_address), value); *reinterpret_cast<const std::vector<int>*>(opt_address), value);

@ -47,6 +47,8 @@ Status GetTableFactoryFromMap(
enum class OptionType { enum class OptionType {
kBoolean, kBoolean,
kInt, kInt,
kInt32T,
kInt64T,
kVectorInt, kVectorInt,
kUInt, kUInt,
kUInt32T, kUInt32T,

@ -500,6 +500,16 @@ bool AreEqualOptions(
case OptionType::kInt: case OptionType::kInt:
return (*reinterpret_cast<const int*>(offset1) == return (*reinterpret_cast<const int*>(offset1) ==
*reinterpret_cast<const int*>(offset2)); *reinterpret_cast<const int*>(offset2));
case OptionType::kInt32T:
return (*reinterpret_cast<const int32_t*>(offset1) ==
*reinterpret_cast<const int32_t*>(offset2));
case OptionType::kInt64T:
{
int64_t v1, v2;
GetUnaligned(reinterpret_cast<const int64_t*>(offset1), &v1);
GetUnaligned(reinterpret_cast<const int64_t*>(offset2), &v2);
return (v1 == v2);
}
case OptionType::kVectorInt: case OptionType::kVectorInt:
return (*reinterpret_cast<const std::vector<int>*>(offset1) == return (*reinterpret_cast<const std::vector<int>*>(offset1) ==
*reinterpret_cast<const std::vector<int>*>(offset2)); *reinterpret_cast<const std::vector<int>*>(offset2));

@ -21,6 +21,7 @@
#include "options/options_helper.h" #include "options/options_helper.h"
#include "options/options_parser.h" #include "options/options_parser.h"
#include "options/options_sanity_check.h" #include "options/options_sanity_check.h"
#include "port/port.h"
#include "rocksdb/cache.h" #include "rocksdb/cache.h"
#include "rocksdb/convenience.h" #include "rocksdb/convenience.h"
#include "rocksdb/memtablerep.h" #include "rocksdb/memtablerep.h"
@ -1813,6 +1814,18 @@ bool IsEscapedString(const std::string& str) {
} }
} // namespace } // namespace
TEST_F(OptionsParserTest, IntegerParsing) {
ASSERT_EQ(ParseUint64("18446744073709551615"), 18446744073709551615U);
ASSERT_EQ(ParseUint32("4294967295"), 4294967295U);
ASSERT_EQ(ParseSizeT("18446744073709551615"), 18446744073709551615U);
ASSERT_EQ(ParseInt64("9223372036854775807"), 9223372036854775807U);
ASSERT_EQ(ParseInt64("-9223372036854775808"), port::kMinInt64);
ASSERT_EQ(ParseInt32("2147483647"), 2147483647U);
ASSERT_EQ(ParseInt32("-2147483648"), port::kMinInt32);
ASSERT_EQ(ParseInt("-32767"), -32767);
ASSERT_EQ(ParseDouble("-1.234567"), -1.234567);
}
TEST_F(OptionsParserTest, EscapeOptionString) { TEST_F(OptionsParserTest, EscapeOptionString) {
ASSERT_EQ(UnescapeOptionString( ASSERT_EQ(UnescapeOptionString(
"This is a test string with \\# \\: and \\\\ escape chars."), "This is a test string with \\# \\: and \\\\ escape chars."),

@ -87,8 +87,10 @@ namespace port {
// For use at db/file_indexer.h kLevelMaxIndex // For use at db/file_indexer.h kLevelMaxIndex
const uint32_t kMaxUint32 = std::numeric_limits<uint32_t>::max(); const uint32_t kMaxUint32 = std::numeric_limits<uint32_t>::max();
const int kMaxInt32 = std::numeric_limits<int32_t>::max(); const int kMaxInt32 = std::numeric_limits<int32_t>::max();
const int kMinInt32 = std::numeric_limits<int32_t>::min();
const uint64_t kMaxUint64 = std::numeric_limits<uint64_t>::max(); const uint64_t kMaxUint64 = std::numeric_limits<uint64_t>::max();
const int64_t kMaxInt64 = std::numeric_limits<int64_t>::max(); const int64_t kMaxInt64 = std::numeric_limits<int64_t>::max();
const int64_t kMinInt64 = std::numeric_limits<int64_t>::min();
const size_t kMaxSizet = std::numeric_limits<size_t>::max(); const size_t kMaxSizet = std::numeric_limits<size_t>::max();
static const bool kLittleEndian = PLATFORM_IS_LITTLE_ENDIAN; static const bool kLittleEndian = PLATFORM_IS_LITTLE_ENDIAN;

@ -93,7 +93,9 @@ namespace port {
// For use at db/file_indexer.h kLevelMaxIndex // For use at db/file_indexer.h kLevelMaxIndex
const uint32_t kMaxUint32 = UINT32_MAX; const uint32_t kMaxUint32 = UINT32_MAX;
const int kMaxInt32 = INT32_MAX; const int kMaxInt32 = INT32_MAX;
const int kMinInt32 = INT32_MIN;
const int64_t kMaxInt64 = INT64_MAX; const int64_t kMaxInt64 = INT64_MAX;
const int64_t kMinInt64 = INT64_MIN;
const uint64_t kMaxUint64 = UINT64_MAX; const uint64_t kMaxUint64 = UINT64_MAX;
#ifdef _WIN64 #ifdef _WIN64
@ -109,8 +111,10 @@ const size_t kMaxSizet = UINT_MAX;
// For use at db/file_indexer.h kLevelMaxIndex // For use at db/file_indexer.h kLevelMaxIndex
const uint32_t kMaxUint32 = std::numeric_limits<uint32_t>::max(); const uint32_t kMaxUint32 = std::numeric_limits<uint32_t>::max();
const int kMaxInt32 = std::numeric_limits<int>::max(); const int kMaxInt32 = std::numeric_limits<int>::max();
const int kMinInt32 = std::numeric_limits<int>::min();
const uint64_t kMaxUint64 = std::numeric_limits<uint64_t>::max(); const uint64_t kMaxUint64 = std::numeric_limits<uint64_t>::max();
const int64_t kMaxInt64 = std::numeric_limits<int64_t>::max(); const int64_t kMaxInt64 = std::numeric_limits<int64_t>::max();
const int64_t kMinInt64 = std::numeric_limits<int64_t>::min();
const size_t kMaxSizet = std::numeric_limits<size_t>::max(); const size_t kMaxSizet = std::numeric_limits<size_t>::max();

@ -21,6 +21,7 @@
#include <utility> #include <utility>
#include <vector> #include <vector>
#include "rocksdb/env.h" #include "rocksdb/env.h"
#include "port/port.h"
#include "rocksdb/slice.h" #include "rocksdb/slice.h"
namespace rocksdb { namespace rocksdb {
@ -276,6 +277,15 @@ uint32_t ParseUint32(const std::string& value) {
} }
} }
int32_t ParseInt32(const std::string& value) {
int64_t num = ParseInt64(value);
if (num <= port::kMaxInt32 && num >= port::kMinInt32) {
return static_cast<int32_t>(num);
} else {
throw std::out_of_range(value);
}
}
#endif #endif
uint64_t ParseUint64(const std::string& value) { uint64_t ParseUint64(const std::string& value) {
@ -303,6 +313,31 @@ uint64_t ParseUint64(const std::string& value) {
return num; return num;
} }
int64_t ParseInt64(const std::string& value) {
size_t endchar;
#ifndef CYGWIN
int64_t num = std::stoll(value.c_str(), &endchar);
#else
char* endptr;
int64_t num = std::strtoll(value.c_str(), &endptr, 0);
endchar = endptr - value.c_str();
#endif
if (endchar < value.length()) {
char c = value[endchar];
if (c == 'k' || c == 'K')
num <<= 10LL;
else if (c == 'm' || c == 'M')
num <<= 20LL;
else if (c == 'g' || c == 'G')
num <<= 30LL;
else if (c == 't' || c == 'T')
num <<= 40LL;
}
return num;
}
int ParseInt(const std::string& value) { int ParseInt(const std::string& value) {
size_t endchar; size_t endchar;
#ifndef CYGWIN #ifndef CYGWIN

@ -109,12 +109,17 @@ std::string trim(const std::string& str);
bool ParseBoolean(const std::string& type, const std::string& value); bool ParseBoolean(const std::string& type, const std::string& value);
uint32_t ParseUint32(const std::string& value); uint32_t ParseUint32(const std::string& value);
int32_t ParseInt32(const std::string& value);
#endif #endif
uint64_t ParseUint64(const std::string& value); uint64_t ParseUint64(const std::string& value);
int ParseInt(const std::string& value); int ParseInt(const std::string& value);
int64_t ParseInt64(const std::string& value);
double ParseDouble(const std::string& value); double ParseDouble(const std::string& value);
size_t ParseSizeT(const std::string& value); size_t ParseSizeT(const std::string& value);

Loading…
Cancel
Save