BSONObj KeyV1::toBson(BufBuilder &bb) const { verify( _keyData != 0 ); if( !isCompactFormat() ) return bson(); BSONObjBuilder b(bb); const unsigned char *p = _keyData; while( 1 ) { unsigned bits = *p++; switch( bits & cFULLTYPEMASK ) { case cminkey: b.appendMinKey(""); break; case cnull: b.appendNull(""); break; case cfalse: b.appendBool("", false); break; case ctrue: b.appendBool("", true); break; case cmaxkey: b.appendMaxKey(""); break; case cstring: { unsigned sz = *p++; // we build the element ourself as we have to null terminate it BufBuilder &bb = b.bb(); bb.appendNum((char) String); bb.appendUChar(0); // fieldname "" bb.appendNum(sz+1); bb.appendBuf(p, sz); bb.appendUChar(0); // null char at end of string p += sz; break; } case coid: b.appendOID("", (OID *) p); p += sizeof(OID); break; case cbindata: { int len = binDataCodeToLength(*p); int subtype = (*p) & BinDataTypeMask; if( subtype & 0x8 ) { subtype = (subtype & 0x7) | 0x80; } b.appendBinData("", len, (BinDataType) subtype, ++p); p += len; break; } case cdate: b.appendDate("", (Date_t&) *p); p += 8; break; case cdouble: b.append("", (double&) *p); p += sizeof(double); break; case cint: b.append("", static_cast< int >((reinterpret_cast< const PackedDouble& >(*p)).d)); p += sizeof(double); break; case clong: b.append("", static_cast< long long>((reinterpret_cast< const PackedDouble& >(*p)).d)); p += sizeof(double); break; case cint64: b.append("", *reinterpret_cast<const long long *>(p)); p += sizeof(long long); break; default: verify(false); } if( (bits & cHASMORE) == 0 ) break; } return b.done(); }