StatusWith<ChunkType> ChunkType::fromBSON(const BSONObj& source) { ChunkType chunk; { std::string chunkName; Status status = bsonExtractStringField(source, name.name(), &chunkName); if (!status.isOK()) return status; chunk._name = chunkName; } { std::string chunkNS; Status status = bsonExtractStringField(source, ns.name(), &chunkNS); if (!status.isOK()) return status; chunk._ns = chunkNS; } { auto chunkRangeStatus = ChunkRange::fromBSON(source); if (!chunkRangeStatus.isOK()) return chunkRangeStatus.getStatus(); const auto chunkRange = std::move(chunkRangeStatus.getValue()); chunk._min = chunkRange.getMin().getOwned(); chunk._max = chunkRange.getMax().getOwned(); } { std::string chunkShard; Status status = bsonExtractStringField(source, shard.name(), &chunkShard); if (!status.isOK()) return status; chunk._shard = chunkShard; } { bool chunkJumbo; Status status = bsonExtractBooleanField(source, jumbo.name(), &chunkJumbo); if (status.isOK()) { chunk._jumbo = chunkJumbo; } else if (status == ErrorCodes::NoSuchKey) { // Jumbo status is missing, so it will be presumed false } else { return status; } } // The format of chunk version encoding is { lastmod: <Major|Minor>, lastmodEpoch: OID } if (!ChunkVersion::canParseBSON(source, DEPRECATED_lastmod())) { return Status(ErrorCodes::BadValue, str::stream() << "Unable to parse chunk version from " << source); } chunk._version = ChunkVersion::fromBSON(source, DEPRECATED_lastmod()); return chunk; }
BSONObj ChunkType::toBSON() const { BSONObjBuilder builder; if (_name) builder.append(name.name(), getName()); if (_ns) builder.append(ns.name(), getNS()); if (_min) builder.append(min.name(), getMin()); if (_max) builder.append(max.name(), getMax()); if (_shard) builder.append(shard.name(), getShard()); if (_version) { // For now, write both the deprecated *and* the new fields _version->addToBSON(builder, version()); _version->addToBSON(builder, DEPRECATED_lastmod()); } if (_jumbo) builder.append(jumbo.name(), getJumbo()); return builder.obj(); }
StatusWith<ChunkType> ChunkType::fromBSON(const BSONObj& source) { ChunkType chunk; { std::string chunkName; Status status = bsonExtractStringField(source, name.name(), &chunkName); if (!status.isOK()) return status; chunk._name = chunkName; } { std::string chunkNS; Status status = bsonExtractStringField(source, ns.name(), &chunkNS); if (!status.isOK()) return status; chunk._ns = chunkNS; } { BSONElement chunkMinElement; Status status = bsonExtractTypedField(source, min.name(), Object, &chunkMinElement); if (!status.isOK()) return status; chunk._min = chunkMinElement.Obj().getOwned(); } { BSONElement chunkMaxElement; Status status = bsonExtractTypedField(source, max.name(), Object, &chunkMaxElement); if (!status.isOK()) return status; chunk._max = chunkMaxElement.Obj().getOwned(); } { std::string chunkShard; Status status = bsonExtractStringField(source, shard.name(), &chunkShard); if (!status.isOK()) return status; chunk._shard = chunkShard; } { bool chunkJumbo; Status status = bsonExtractBooleanField(source, jumbo.name(), &chunkJumbo); if (status.isOK()) { chunk._jumbo = chunkJumbo; } else if (status == ErrorCodes::NoSuchKey) { // Jumbo status is missing, so it will be presumed false } else { return status; } } // // ChunkVersion backward compatibility logic contained in ChunkVersion // // ChunkVersion is currently encoded as { 'version': [<TS>,<OID>] } if (ChunkVersion::canParseBSON(source, version())) { chunk._version = ChunkVersion::fromBSON(source, version()); } else if (ChunkVersion::canParseBSON(source, DEPRECATED_lastmod())) { chunk._version = ChunkVersion::fromBSON(source, DEPRECATED_lastmod()); } return chunk; }