Status bsonExtractOIDFieldWithDefault(const BSONObj& object, StringData fieldName, const OID& defaultValue, OID* out) { Status status = bsonExtractOIDField(object, fieldName, out); if (status == ErrorCodes::NoSuchKey) { *out = defaultValue; } else if (!status.isOK()) { return status; } return Status::OK(); }
StatusWith<ShardIdentityType> ShardIdentityType::fromBSON(const BSONObj& source) { if (!source.hasField("_id")) { return {ErrorCodes::NoSuchKey, str::stream() << "missing _id field for shardIdentity document"}; } ShardIdentityType shardIdentity; { std::string docId; Status status = bsonExtractStringField(source, "_id", &docId); if (!status.isOK()) { return status; } if (docId != IdName) { return {ErrorCodes::FailedToParse, str::stream() << "got _id: " << docId << " instead of " << IdName}; } } { std::string connString; Status status = bsonExtractStringField(source, configsvrConnString(), &connString); if (!status.isOK()) { return status; } try { // Note: ConnectionString::parse can uassert from HostAndPort constructor. auto parsedConfigConnStrStatus = ConnectionString::parse(connString); if (!parsedConfigConnStrStatus.isOK()) { return parsedConfigConnStrStatus.getStatus(); } auto configSvrConnStr = parsedConfigConnStrStatus.getValue(); if (configSvrConnStr.type() != ConnectionString::SET) { return Status(ErrorCodes::UnsupportedFormat, str::stream() << "config server connection string can only be replica sets: " << configSvrConnStr.toString()); } shardIdentity.setConfigsvrConnString(std::move(configSvrConnStr)); } catch (const UserException& parseException) { return parseException.toStatus(); } } { std::string name; Status status = bsonExtractStringField(source, shardName(), &name); if (!status.isOK()) { return status; } shardIdentity.setShardName(name); } { OID oid; Status status = bsonExtractOIDField(source, clusterId(), &oid); if (!status.isOK()) { return status; } shardIdentity.setClusterId(oid); } return shardIdentity; }