void assertRoundTrips( const Document& document1 ) {
    BSONObj obj1 = toBson( document1 );
    Document document2 = fromBson( obj1 );
    BSONObj obj2 = toBson( document2 );
    ASSERT_EQUALS( obj1, obj2 );
    ASSERT_EQUALS( 0, Document::compare( document1, document2 ) );
}
Пример #2
0
Файл: key.cpp Проект: kzys/mongo
bool KeyV1::woEqual(const KeyV1& right) const {
    const unsigned char *l = _keyData;
    const unsigned char *r = right._keyData;

    if( (*l|*r) == IsBSON ) {
        return toBson().equal(right.toBson());
    }

    while( 1 ) {
        char lval = *l;
        char rval = *r;
        if( (lval&(cCANONTYPEMASK|cHASMORE)) != (rval&(cCANONTYPEMASK|cHASMORE)) )
            return false;
        l++;
        r++;
        switch( lval&cCANONTYPEMASK ) {
        case coid:
            if( *((unsigned*) l) != *((unsigned*) r) )
                return false;
            l += 4;
            r += 4;
        case cdate:
        case cdouble:
            if( *((unsigned long long *) l) != *((unsigned long long *) r) )
                return false;
            l += 8;
            r += 8;
            break;
        case cstring:
        {
            unsigned sz = ((unsigned) *l) + 1;
            if( memcmp(l, r, sz) ) // first byte checked is the length byte
                return false;
            l += sz;
            r += sz;
            break;
        }
        case cbindata:
        {
            int len = binDataCodeToLength(*l) + 1;
            if( memcmp(l, r, len) )
                return false;
            l += len;
            r += len;
            break;
        }
        case cminkey:
        case cnull:
        case cfalse:
        case ctrue:
        case cmaxkey:
            break;
        default:
            assert(false);
        }
        if( (lval&cHASMORE) == 0 )
            break;
    }
    return true;
}
Пример #3
0
mongo::BSONObj toBson(QVariantMap obj) {
    mongo::BSONObjBuilder b;

    QVariantMap::iterator it = obj.begin();
    while(it != obj.end()) {
        QByteArray byteName = it.key().toStdString().c_str();
        const char* name = byteName.constData();
        QVariant v = it.value();
        int type = v.type();

//        qDebug() << "toBson converting type" << v.typeName();
        if (v.canConvert<QObject*>()) {
            QMongoType* mongo = qobject_cast<QMongoType*>( v.value<QObject*>() );
            Q_ASSERT(mongo->o.nFields() == 1);
            b.appendAs(mongo->o.firstElement(), name);
            ++it;
            continue;
        }

        bool ok = true;
        switch(type) {
        case QVariant::Int:
            b.append(name, v.toInt(&ok));
            break;
        case QVariant::String:
            b.append(name, v.toString().toStdString());
            break;
        case QVariant::LongLong:
            b.append(name, v.toLongLong(&ok));
            break;
        case QVariant::UInt:
            b.append(name, v.toUInt(&ok));
            break;
        case QVariant::Map:
            b.append(name, toBson(v.toMap()));
            break;
        case QVariant::Double:
            b.append(name, v.toDouble(&ok));
            break;
        case QVariant::Bool:
            b.appendBool(name, v.toBool());
            break;            
        case QVariant::Time:
            b.appendTimeT(name, v.toDateTime().toTime_t());
            break;
        case QVariant::Invalid:
            b.appendUndefined(name);
            break;
        default:
            qCritical() << "toBson() failed to convert" << obj << "for" << name << "with type" << v.typeName();
            ok = false;
        }
        Q_ASSERT(ok);
        ++it;
    }
    return b.obj();
}
Пример #4
0
    bool KeyV1::woEqual(const KeyV1& right) const {
        const unsigned char *l = _keyData;
        const unsigned char *r = right._keyData;

        if( (*l|*r) == IsBSON ) {
            return toBson().equal(right.toBson());
        }

        while( 1 ) { 
            char lval = *l; 
            char rval = *r;
            if( (lval&(cCANONTYPEMASK|cHASMORE)) != (rval&(cCANONTYPEMASK|cHASMORE)) )
                return false;
            l++; r++;
            switch( lval&cCANONTYPEMASK ) { 
            case coid:
                if( *((unsigned*) l) != *((unsigned*) r) )
                    return false;
                l += 4; r += 4;
            case cdate:
                if( *((unsigned long long *) l) != *((unsigned long long *) r) )
                    return false;
                l += 8; r += 8;
                break;
            case cdouble:
                if( (reinterpret_cast< const PackedDouble* > (l))->d != (reinterpret_cast< const PackedDouble* >(r))->d )
                    return false;
                l += 8; r += 8;
                break;
            case cstring:
                {
                    if( *l != *r ) 
                        return false; // not same length
                    unsigned sz = ((unsigned) *l) + 1;
                    if( memcmp(l, r, sz) )
                        return false;
                    l += sz; r += sz;
                    break;
                }
            case cbindata:
                {
                    if( *l != *r )
                        return false; // len or subtype mismatch
                    int len = binDataCodeToLength(*l) + 1;
                    if( memcmp(l, r, len) ) 
                        return false;
                    l += len; r += len;
                    break;
                }
            case cminkey:
            case cnull:
            case cfalse:
            case ctrue:
            case cmaxkey:
                break;
            default:
                verify(false);
            }
            if( (lval&cHASMORE) == 0 )
                break;
        }
        return true;
    }
Пример #5
0
 // at least one of this and right are traditional BSON format
 int NOINLINE_DECL KeyV1::compareHybrid(const KeyV1& right, const Ordering& order) const { 
     BSONObj L = toBson();
     BSONObj R = right.toBson();
     return L.woCompare(R, order, /*considerfieldname*/false);
 }
Пример #6
0
 bson::bo IData::toBsonWithBson() const
 {
     return toBson();
 };
Пример #7
0
void updateSessionEntry(OperationContext* opCtx, const UpdateRequest& updateRequest) {
    // Current code only supports replacement update.
    dassert(UpdateDriver::isDocReplacement(updateRequest.getUpdates()));

    AutoGetCollection autoColl(opCtx, NamespaceString::kSessionTransactionsTableNamespace, MODE_IX);

    uassert(40527,
            str::stream() << "Unable to persist transaction state because the session transaction "
                             "collection is missing. This indicates that the "
                          << NamespaceString::kSessionTransactionsTableNamespace.ns()
                          << " collection has been manually deleted.",
            autoColl.getCollection());

    WriteUnitOfWork wuow(opCtx);

    auto collection = autoColl.getCollection();
    auto idIndex = collection->getIndexCatalog()->findIdIndex(opCtx);

    uassert(40672,
            str::stream() << "Failed to fetch _id index for "
                          << NamespaceString::kSessionTransactionsTableNamespace.ns(),
            idIndex);

    auto indexAccess = collection->getIndexCatalog()->getIndex(idIndex);
    // Since we are looking up a key inside the _id index, create a key object consisting of only
    // the _id field.
    auto idToFetch = updateRequest.getQuery().firstElement();
    auto toUpdateIdDoc = idToFetch.wrap();
    dassert(idToFetch.fieldNameStringData() == "_id"_sd);
    auto recordId = indexAccess->findSingle(opCtx, toUpdateIdDoc);
    auto startingSnapshotId = opCtx->recoveryUnit()->getSnapshotId();

    if (recordId.isNull()) {
        // Upsert case.
        auto status = collection->insertDocument(
            opCtx, InsertStatement(updateRequest.getUpdates()), nullptr, true, false);

        if (status == ErrorCodes::DuplicateKey) {
            throw WriteConflictException();
        }

        uassertStatusOK(status);
        wuow.commit();
        return;
    }

    auto originalRecordData = collection->getRecordStore()->dataFor(opCtx, recordId);
    auto originalDoc = originalRecordData.toBson();

    invariant(collection->getDefaultCollator() == nullptr);
    boost::intrusive_ptr<ExpressionContext> expCtx(new ExpressionContext(opCtx, nullptr));

    auto matcher = fassertStatusOK(
        40673, MatchExpressionParser::parse(updateRequest.getQuery(), std::move(expCtx)));
    if (!matcher->matchesBSON(originalDoc)) {
        // Document no longer match what we expect so throw WCE to make the caller re-examine.
        throw WriteConflictException();
    }

    OplogUpdateEntryArgs args;
    args.nss = NamespaceString::kSessionTransactionsTableNamespace;
    args.uuid = collection->uuid();
    args.update = updateRequest.getUpdates();
    args.criteria = toUpdateIdDoc;
    args.fromMigrate = false;

    collection->updateDocument(opCtx,
                               recordId,
                               Snapshotted<BSONObj>(startingSnapshotId, originalDoc),
                               updateRequest.getUpdates(),
                               true,   // enforceQuota
                               false,  // indexesAffected = false because _id is the only index
                               nullptr,
                               &args);

    wuow.commit();
}
 string _qgmConditionNodeHelper::toJson() const
 {
    return toBson().toString() ;
 }