void ClientMetadata::setMongoSMetadata(StringData hostAndPort, StringData mongosClient, StringData version) { BSONObjBuilder builder; builder.appendElements(_document); { auto sub = BSONObjBuilder(builder.subobjStart(kMongoS)); sub.append(kHost, hostAndPort); sub.append(kClient, mongosClient); sub.append(kVersion, version); } auto document = builder.obj(); if (!_appName.empty()) { // The _appName field points into the existing _document, which we are about to replace. // We must redirect _appName to point into the new doc *before* replacing the old doc. We // expect the 'application' metadata of the new document to be identical to the old. auto appMetaData = document[kApplication]; invariant(appMetaData.isABSONObj()); auto appNameEl = appMetaData[kName]; invariant(appNameEl.type() == BSONType::String); auto appName = appNameEl.valueStringData(); invariant(appName == _appName); _appName = appName; } _document = std::move(document); }
BSONObj BSONElement::embeddedObjectUserCheck() const { if (MONGO_likely(isABSONObj())) return BSONObj(value(), BSONObj::LargeSizeTrait{}); std::stringstream ss; ss << "invalid parameter: expected an object (" << fieldName() << ")"; uasserted(10065, ss.str()); return BSONObj(); // never reachable }
Status ReadAfterOpTimeArgs::initialize(const BSONObj& cmdObj) { auto afterElem = cmdObj[ReadAfterOpTimeArgs::kRootFieldName]; if (afterElem.eoo()) { return Status::OK(); } if (!afterElem.isABSONObj()) { return Status(ErrorCodes::FailedToParse, "'after' field should be an object"); } BSONObj readAfterObj = afterElem.Obj(); BSONElement opTimeElem; auto opTimeStatus = bsonExtractTypedField( readAfterObj, ReadAfterOpTimeArgs::kOpTimeFieldName, Object, &opTimeElem); if (!opTimeStatus.isOK()) { return opTimeStatus; } BSONObj opTimeObj = opTimeElem.Obj(); BSONElement timestampElem; Timestamp timestamp; auto timestampStatus = bsonExtractTimestampField( opTimeObj, ReadAfterOpTimeArgs::kOpTimestampFieldName, ×tamp); if (!timestampStatus.isOK()) { return timestampStatus; } long long termNumber; auto termStatus = bsonExtractIntegerField(opTimeObj, ReadAfterOpTimeArgs::kOpTermFieldName, &termNumber); if (!termStatus.isOK()) { return termStatus; } _opTime = OpTime(timestamp, termNumber); return Status::OK(); }
Status ReadConcernArgs::initialize(const BSONObj& cmdObj) { auto readConcernElem = cmdObj[ReadConcernArgs::kReadConcernFieldName]; if (readConcernElem.eoo()) { return Status::OK(); } if (!readConcernElem.isABSONObj()) { return Status(ErrorCodes::FailedToParse, str::stream() << kReadConcernFieldName << " field should be an object"); } BSONObj readConcernObj = readConcernElem.Obj(); if (readConcernObj.hasField(kOpTimeFieldName)) { OpTime opTime; auto opTimeStatus = bsonExtractOpTimeField(readConcernObj, kOpTimeFieldName, &opTime); if (!opTimeStatus.isOK()) { return opTimeStatus; } _opTime = opTime; } std::string levelString; auto readCommittedStatus = bsonExtractStringField(readConcernObj, kLevelFieldName, &levelString); if (readCommittedStatus.isOK()) { if (levelString == kLocalReadConcernStr) { _level = ReadConcernLevel::kLocalReadConcern; } else if (levelString == kMajorityReadConcernStr) { _level = ReadConcernLevel::kMajorityReadConcern; } else { return Status(ErrorCodes::FailedToParse, str::stream() << kReadConcernFieldName << '.' << kLevelFieldName << " must be either \"local\" or \"majority\""); } } else if (readCommittedStatus != ErrorCodes::NoSuchKey) { return readCommittedStatus; } return Status::OK(); }
BSONObj BSONElement::embeddedObject() const { verify(isABSONObj()); return BSONObj(value(), BSONObj::LargeSizeTrait{}); }