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 ) ); }
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; }
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(); }
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; }
// 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); }
bson::bo IData::toBsonWithBson() const { return toBson(); };
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() ; }