35 #include "mongo/base/static_assert.h" 36 #include "mongo/bson/bsonmisc.h" 37 #include "mongo/bson/bsonobj.h" 38 #include "mongo/bson/bsonobjbuilder.h" 39 #include "mongo/bson/ordering.h" 40 #include "mongo/bson/timestamp.h" 41 #include "mongo/db/record_id.h" 42 #include "mongo/platform/decimal128.h" 43 #include "mongo/util/assert_util.h" 79 "encoding needs change to contain all type bits for worst case key");
133 dassert(
_buf[1] == 0);
138 dassert(rawSize >= 1);
139 if (rawSize == 1 && !(
_buf[1] & 0x80)) {
154 static const uint8_t
kInt = 0x0;
222 return (highBit << 1) |
readBit();
247 return _buf[0] & 0x7f;
252 uassert(ErrorCodes::KeyTooLong,
"The key is too long", size <
kMaxBytesNeeded);
253 _buf[0] = 0x80 | size;
306 const TypeBits& typeBits);
307 static BSONObj
toBson(StringData
data, Ordering ord,
const TypeBits& types);
315 static BSONObj
toBson(
const char* buffer,
318 const TypeBits& types) noexcept;
319 static BSONObj
toBsonSafe(
const char* buffer,
size_t len, Ordering ord,
const TypeBits& types);
343 void resetToKey(
const BSONObj& obj, Ordering ord, RecordId recordId);
347 memcpy(
_buffer.skip(size), buffer, size);
418 template <
typename T>
419 void _append(
const T& thing,
bool invert);
420 void _appendBytes(
const void* source,
size_t bytes,
bool invert);
447 return !(lhs == rhs);
static const uint8_t kDecimalZero3xxx
Definition: key_string.h:172
void reset()
Definition: key_string.h:176
void resetToKey(const BSONObj &obj, Ordering ord, RecordId recordId)
Definition: key_string.cpp:325
bool operator<(const KeyString &lhs, const KeyString &rhs)
Definition: key_string.h:426
KeyString(Version version)
Definition: key_string.h:284
void _appendBinData(const BSONBinData &val, bool invert)
Definition: key_string.cpp:486
void appendNumberDouble()
Definition: key_string.h:190
void _appendSymbol(StringData val, bool invert)
Definition: key_string.cpp:469
void appendRecordId(RecordId loc)
Definition: key_string.cpp:385
TypeBits _typeBits
Definition: key_string.h:422
void _appendStringLike(StringData str, bool invert)
– lowest level
Definition: key_string.cpp:859
void _appendDoubleWithoutTypeBits(const double num, DecimalContinuationMarker dcm, bool invert)
Definition: key_string.cpp:539
static BSONObj toBson(StringData data, Ordering ord, const TypeBits &types)
Definition: key_string.cpp:2070
void _appendNumberInt(const int num, bool invert)
Definition: key_string.cpp:617
bool operator==(const IndexKeyEntry &lhs, const IndexKeyEntry &rhs)
Definition: index_entry_comparison.h:54
void _appendAllElementsForIndexing(const BSONObj &obj, Ordering ord, Discriminator discriminator)
Definition: key_string.cpp:340
void _appendBson(const BSONObj &obj, bool invert)
Definition: key_string.cpp:875
Reader(const TypeBits &typeBits)
Passed in TypeBits must outlive this Reader instance.
Definition: key_string.h:215
static const uint8_t kString
Definition: key_string.h:151
size_t _curBit
Definition: key_string.h:258
static BSONObj toBsonSafe(const char *buffer, size_t len, Ordering ord, const TypeBits &types)
Definition: key_string.cpp:2038
Copyright (C) 2014 MongoDB Inc.
Definition: bson_collection_catalog_entry.cpp:38
void _appendBytes(const void *source, size_t bytes, bool invert)
Definition: key_string.cpp:1067
size_t getSize() const
Definition: key_string.h:131
void appendBit(uint8_t oneOrZero)
Definition: key_string.cpp:2160
Definition: key_string.h:280
static const uint8_t kDecimalZero4xxx
Definition: key_string.h:173
void _appendInteger(const long long num, bool invert)
Definition: key_string.cpp:1024
static RecordId decodeRecordId(BufReader *reader)
Decodes a RecordId, consuming all bytes needed from reader.
Definition: key_string.cpp:2085
static const uint8_t kV1NegativeDoubleZero
Definition: key_string.h:164
Definition: key_string.h:47
static RecordId decodeRecordIdAtEnd(const void *buf, size_t size)
Decodes a RecordId from the end of a buffer.
Definition: key_string.cpp:2074
static const uint8_t kUnusedEncoding
Definition: key_string.h:166
void resetFromBuffer(const void *buffer, size_t size)
Definition: key_string.h:345
static const uint8_t kNegativeDoubleZero
Definition: key_string.h:159
Discriminator
Definition: key_string.h:268
Definition: key_string.h:269
Definition: key_string.h:278
const TypeBits & _typeBits
Definition: key_string.h:237
Version
Selects version of KeyString to use.
Definition: key_string.h:52
static const uint8_t kInt
Definition: key_string.h:154
bool isAllZeros() const
If true, no bits have been set to one.
Definition: key_string.h:101
static const uint8_t kMaxBytesNeeded
Definition: key_string.h:71
static const Version kLatestVersion
Provides the latest version of KeyString available.
Definition: key_string.h:60
uint8_t getSizeByte() const
size only includes data bytes, not the size byte itself.
Definition: key_string.h:246
static const uint8_t kV0NegativeDoubleZero
Definition: key_string.h:160
const TypeBits & getTypeBits() const
Definition: key_string.h:360
bool operator!=(const IndexKeyEntry &lhs, const IndexKeyEntry &rhs)
Definition: index_entry_comparison.h:58
static const uint8_t kSpecialZeroPrefix
Definition: key_string.h:158
Definition: key_string.h:279
static const uint8_t kStoredDecimalExponentBits
Definition: key_string.h:80
uint8_t readStringLike()
Definition: key_string.h:217
bool operator>=(const KeyString &lhs, const KeyString &rhs)
Definition: key_string.h:442
void _appendRegex(const BSONRegEx &val, bool invert)
Definition: key_string.cpp:500
static const uint8_t kLong
Definition: key_string.h:155
void _appendObject(const BSONObj &val, bool invert)
Definition: key_string.cpp:525
void appendSymbol()
Definition: key_string.h:186
void _appendString(StringData val, bool invert)
Definition: key_string.cpp:463
void appendNumberInt()
Definition: key_string.h:194
std::shared_ptr< void > data
Definition: ephemeral_for_test_record_store_test.cpp:74
StackBufBuilder _buffer
Definition: key_string.h:423
void _appendCodeWString(const BSONCodeWScope &val, bool invert)
Definition: key_string.cpp:480
const Version version
Definition: key_string.h:240
void appendDecimalZero(uint32_t whichZero)
Definition: key_string.cpp:2211
void _appendTimestamp(Timestamp val, bool invert)
Definition: key_string.cpp:453
static size_t getKeySize(const char *buffer, size_t len, Ordering ord, const TypeBits &typeBits)
Definition: key_string.cpp:2015
static const uint8_t kDecimal
Definition: key_string.h:157
uint8_t readZero()
Definition: key_string.cpp:2237
DecimalContinuationMarker
Encodes the kind of NumberDecimal that is stored.
Definition: key_string.h:277
Definition: key_string.h:210
void appendDecimalExponent(uint8_t storedExponentBits)
Definition: key_string.cpp:2218
Definition: key_string.h:270
void _appendBsonValue(const BSONElement &elem, bool invert, const StringData *name)
Definition: key_string.cpp:776
void _appendDate(Date_t val, bool invert)
Definition: key_string.cpp:445
Definition: key_string.h:281
void _appendDBRef(const BSONDBRef &val, bool invert)
Definition: key_string.cpp:509
void _appendSmallDouble(double value, DecimalContinuationMarker dcm, bool invert)
Definition: key_string.cpp:885
void appendString()
Definition: key_string.h:183
uint8_t readBit()
Definition: key_string.cpp:2224
void _appendNumberDouble(const double num, bool invert)
Definition: key_string.cpp:530
std::ostream & operator<<(std::ostream &stream, const IndexKeyEntry &entry)
Definition: index_entry_comparison.cpp:37
static StringData versionToString(Version version)
Definition: key_string.h:53
static const uint32_t kMaxTypeBitsPerDecimal
Definition: key_string.h:73
bool isEmpty() const
Definition: key_string.h:356
static const uint8_t kSymbol
Definition: key_string.h:152
MONGO_STATIC_ASSERT_MSG(kMaxTypeBitsPerDecimal *kMaxDecimalsPerKey< kMaxBytesNeeded *8UL, "encoding needs change to contain all type bits for worst case key")
int compare(const KeyString &other) const
Definition: key_string.cpp:2107
void _appendTinyDecimalWithoutTypeBits(const Decimal128 dec, const double bin, bool invert)
Definition: key_string.cpp:948
bool _isAllZeros
Definition: key_string.h:259
bool operator>(const KeyString &lhs, const KeyString &rhs)
Definition: key_string.h:438
std::string toString() const
Definition: key_string.cpp:2103
void appendTypeBits(const TypeBits &bits)
Definition: key_string.cpp:431
const uint8_t * getBuffer() const
These methods return a buffer and size which encodes all of the type bits in this instance.
Definition: key_string.h:128
Definition: key_string.h:271
TypeBits(Version version)
Definition: key_string.h:83
Encodes info needed to restore the original BSONTypes from a KeyString.
Definition: key_string.h:67
void resetToEmpty()
Resets to an empty state.
Definition: key_string.h:338
void _appendOID(OID val, bool invert)
Definition: key_string.cpp:458
void appendZero(uint8_t zeroType)
Definition: key_string.cpp:2178
void _appendArray(const BSONArray &val, bool invert)
Definition: key_string.cpp:516
void appendNumberLong()
Definition: key_string.h:198
static const uint32_t kMaxDecimalsPerKey
Definition: key_string.h:75
void _appendHugeDecimalWithoutTypeBits(const Decimal128 dec, bool invert)
Definition: key_string.cpp:1005
uint32_t readDecimalZero(uint8_t zeroType)
Definition: key_string.cpp:2251
void _appendNumberDecimal(const Decimal128 num, bool invert)
Definition: key_string.cpp:622
static const uint32_t kBytesForTypeAndEmptyKey
Definition: key_string.h:74
static const uint8_t kDecimalZero1xxx
Definition: key_string.h:170
uint8_t readDecimalExponent()
Definition: key_string.cpp:2259
bool operator<=(const KeyString &lhs, const KeyString &rhs)
Definition: key_string.h:430
KeyString(Version version, RecordId rid)
Definition: key_string.h:299
uint8_t readNumeric()
Definition: key_string.h:220
static const uint32_t kMaxKeyBytes
Definition: key_string.h:72
void appendNumberDecimal()
Definition: key_string.h:202
size_t getSize() const
Definition: key_string.h:353
static const uint8_t kDecimalZero5xxx
Definition: key_string.h:174
static const uint8_t kDecimalZero0xxx
Definition: key_string.h:169
void _appendCode(StringData val, bool invert)
Definition: key_string.cpp:475
Database *const OperationContext *const const StringData name
Definition: database_impl.cpp:82
KeyString(Version version, const BSONObj &obj, Ordering ord, Discriminator discriminator=kInclusive)
Definition: key_string.h:291
size_t _curBit
Definition: key_string.h:236
void _appendLargeDouble(double value, DecimalContinuationMarker dcm, bool invert)
Definition: key_string.cpp:923
static const uint32_t kStoredDecimalExponentMask
Definition: key_string.h:81
static const uint8_t kDouble
Definition: key_string.h:156
const Version version
Version to use for conversion to/from KeyString.
Definition: key_string.h:375
void _appendPreshiftedIntegerPortion(uint64_t value, bool isNegative, bool invert)
Definition: key_string.cpp:1043
static TypeBits fromBuffer(Version version, BufReader *reader)
Definition: key_string.h:92
void _appendBool(bool val, bool invert)
Definition: key_string.cpp:441
void _append(const T &thing, bool invert)
Definition: key_string.cpp:1063
KeyString(Version version, const BSONObj &obj, Ordering ord, RecordId recordId)
Definition: key_string.h:286
uint8_t _buf[1+kMaxBytesNeeded]
Definition: key_string.h:265
void setSizeByte(uint8_t size)
Definition: key_string.h:249
static const uint8_t kDecimalZero2xxx
Definition: key_string.h:171
void resetFromBuffer(BufReader *reader)
If there are no bytes remaining, assumes AllZeros.
Definition: key_string.cpp:2129
const char * getBuffer() const
Definition: key_string.h:350
void _appendNumberLong(const long long num, bool invert)
Definition: key_string.cpp:612