Beispiel #1
0
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;
}
Beispiel #2
0
    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();
    }
Beispiel #3
0
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;
}