|
27 | 27 | * it in the license file. |
28 | 28 | */ |
29 | 29 |
|
| 30 | +#include <fmt/format.h> |
| 31 | + |
30 | 32 | #include "mongo/bson/bsontypes.h" |
31 | 33 |
|
32 | 34 | #include "mongo/config.h" |
33 | 35 | #include "mongo/db/jsobj.h" |
| 36 | +#include "mongo/util/string_map.h" |
34 | 37 |
|
35 | 38 | namespace mongo { |
| 39 | +using namespace fmt::literals; |
36 | 40 |
|
37 | 41 | const char kMaxKeyData[] = {7, 0, 0, 0, static_cast<char>(MaxKey), 0, 0}; |
38 | 42 | const BSONObj kMaxBSONKey(kMaxKeyData); |
@@ -93,35 +97,41 @@ const char* typeName(BSONType type) { |
93 | 97 | } |
94 | 98 | } |
95 | 99 |
|
96 | | -const StringMap<BSONType> kTypeAliasMap = { |
97 | | - {typeName(BSONType::NumberDouble), BSONType::NumberDouble}, |
98 | | - {typeName(BSONType::String), BSONType::String}, |
99 | | - {typeName(BSONType::Object), BSONType::Object}, |
100 | | - {typeName(BSONType::Array), BSONType::Array}, |
101 | | - {typeName(BSONType::BinData), BSONType::BinData}, |
102 | | - {typeName(BSONType::Undefined), BSONType::Undefined}, |
103 | | - {typeName(BSONType::jstOID), BSONType::jstOID}, |
104 | | - {typeName(BSONType::Bool), BSONType::Bool}, |
105 | | - {typeName(BSONType::Date), BSONType::Date}, |
106 | | - {typeName(BSONType::jstNULL), BSONType::jstNULL}, |
107 | | - {typeName(BSONType::RegEx), BSONType::RegEx}, |
108 | | - {typeName(BSONType::DBRef), BSONType::DBRef}, |
109 | | - {typeName(BSONType::Code), BSONType::Code}, |
110 | | - {typeName(BSONType::Symbol), BSONType::Symbol}, |
111 | | - {typeName(BSONType::CodeWScope), BSONType::CodeWScope}, |
112 | | - {typeName(BSONType::NumberInt), BSONType::NumberInt}, |
113 | | - {typeName(BSONType::bsonTimestamp), BSONType::bsonTimestamp}, |
114 | | - {typeName(BSONType::NumberLong), BSONType::NumberLong}, |
115 | | - {typeName(BSONType::NumberDecimal), BSONType::NumberDecimal}, |
116 | | - {typeName(BSONType::MaxKey), BSONType::MaxKey}, |
117 | | - {typeName(BSONType::MinKey), BSONType::MinKey}}; |
| 100 | +boost::optional<BSONType> findBSONTypeAlias(StringData key) { |
| 101 | + // intentionally leaked |
| 102 | + static const auto& typeAliasMap = |
| 103 | + *new StringMap<BSONType>{{typeName(BSONType::NumberDouble), BSONType::NumberDouble}, |
| 104 | + {typeName(BSONType::String), BSONType::String}, |
| 105 | + {typeName(BSONType::Object), BSONType::Object}, |
| 106 | + {typeName(BSONType::Array), BSONType::Array}, |
| 107 | + {typeName(BSONType::BinData), BSONType::BinData}, |
| 108 | + {typeName(BSONType::Undefined), BSONType::Undefined}, |
| 109 | + {typeName(BSONType::jstOID), BSONType::jstOID}, |
| 110 | + {typeName(BSONType::Bool), BSONType::Bool}, |
| 111 | + {typeName(BSONType::Date), BSONType::Date}, |
| 112 | + {typeName(BSONType::jstNULL), BSONType::jstNULL}, |
| 113 | + {typeName(BSONType::RegEx), BSONType::RegEx}, |
| 114 | + {typeName(BSONType::DBRef), BSONType::DBRef}, |
| 115 | + {typeName(BSONType::Code), BSONType::Code}, |
| 116 | + {typeName(BSONType::Symbol), BSONType::Symbol}, |
| 117 | + {typeName(BSONType::CodeWScope), BSONType::CodeWScope}, |
| 118 | + {typeName(BSONType::NumberInt), BSONType::NumberInt}, |
| 119 | + {typeName(BSONType::bsonTimestamp), BSONType::bsonTimestamp}, |
| 120 | + {typeName(BSONType::NumberLong), BSONType::NumberLong}, |
| 121 | + {typeName(BSONType::NumberDecimal), BSONType::NumberDecimal}, |
| 122 | + {typeName(BSONType::MaxKey), BSONType::MaxKey}, |
| 123 | + {typeName(BSONType::MinKey), BSONType::MinKey}}; |
| 124 | + |
| 125 | + auto it = typeAliasMap.find(key); |
| 126 | + if (it == typeAliasMap.end()) |
| 127 | + return boost::none; |
| 128 | + return it->second; |
| 129 | +} |
118 | 130 |
|
119 | 131 | BSONType typeFromName(StringData name) { |
120 | | - auto typeIt = kTypeAliasMap.find(name); |
121 | | - uassert(ErrorCodes::BadValue, |
122 | | - str::stream() << "Unknown type name: " << name, |
123 | | - typeIt != kTypeAliasMap.end()); |
124 | | - return typeIt->second; |
| 132 | + auto typeAlias = findBSONTypeAlias(name); |
| 133 | + uassert(ErrorCodes::BadValue, "Unknown type name: {}"_format(name), typeAlias); |
| 134 | + return *typeAlias; |
125 | 135 | } |
126 | 136 |
|
127 | 137 | std::ostream& operator<<(std::ostream& stream, BSONType type) { |
|
0 commit comments