0
0
mirror of https://github.com/mongodb/mongo.git synced 2024-12-01 09:32:32 +01:00

Add non-Strict mode for Dbref, use base64 encoding for bindata

This commit is contained in:
Aaron 2008-12-31 11:33:41 -05:00
parent 9778190a26
commit 6a4de72765
3 changed files with 48 additions and 10 deletions

View File

@ -155,6 +155,11 @@ string escape( string s ) {
return ret.str(); return ret.str();
} }
typedef boost::archive::iterators::base64_from_binary
< boost::archive::iterators::transform_width
< string::const_iterator, 6, 8>
> base64_t;
string BSONElement::jsonString( JsonStringFormat format, bool includeFieldNames ) const { string BSONElement::jsonString( JsonStringFormat format, bool includeFieldNames ) const {
stringstream s; stringstream s;
if ( includeFieldNames ) if ( includeFieldNames )
@ -205,8 +210,18 @@ string BSONElement::jsonString( JsonStringFormat format, bool includeFieldNames
} }
case DBRef: { case DBRef: {
OID *x = (OID *) (valuestr() + valuestrsize()); OID *x = (OID *) (valuestr() + valuestrsize());
s << "{ \"$ns\" : \"" << valuestr() << "\", \"$id\" : \""; if ( format == Strict )
s << *x << "\" }"; s << "{ \"$ns\" : ";
else
s << "Dbref( ";
s << '"' << valuestr() << "\", ";
if ( format == Strict )
s << "\"$id\" : ";
s << '"' << *x << "\" ";
if ( format == Strict )
s << '}';
else
s << ')';
break; break;
} }
case jstOID: case jstOID:
@ -219,7 +234,14 @@ string BSONElement::jsonString( JsonStringFormat format, bool includeFieldNames
case BinData: { case BinData: {
int len = *(int *)( value() ); int len = *(int *)( value() );
BinDataType type = BinDataType( *(char *)( (int *)( value() ) + 1 ) ); BinDataType type = BinDataType( *(char *)( (int *)( value() ) + 1 ) );
s << "{ \"$binary\" : \"" << escape( string( (char *)( value() ) + sizeof( int ) + 1, len ) ); s << "{ \"$binary\" : \"";
char *start = ( char * )( value() ) + sizeof( int ) + 1;
char *end = start + len;
string base64 = string( base64_t( start ), base64_t( end ) );
s << base64;
int padding = ( 4 - ( base64.length() % 4 ) ) % 4;
for( int i = 0; i < padding; ++i )
s << '=';
s << "\", \"$type\" : \"" << hex; s << "\", \"$type\" : \"" << hex;
s.width( 2 ); s.width( 2 );
s.fill( '0' ); s.fill( '0' );

View File

@ -271,7 +271,11 @@ namespace JsonStringTests {
b.appendDBRef( "a", "namespace", oid ); b.appendDBRef( "a", "namespace", oid );
ASSERT_EQUALS( "{ \"a\" : { \"$ns\" : \"namespace\", \"$id\" : \"ffffffffffffffffffffffff\" } }", ASSERT_EQUALS( "{ \"a\" : { \"$ns\" : \"namespace\", \"$id\" : \"ffffffffffffffffffffffff\" } }",
b.done().jsonString( Strict ) ); b.done().jsonString( Strict ) );
} ASSERT_EQUALS( "{ \"a\" : Dbref( \"namespace\", \"ffffffffffffffffffffffff\" ) }",
b.done().jsonString( TenGen ) );
ASSERT_EQUALS( "{ \"a\" : Dbref( \"namespace\", \"ffffffffffffffffffffffff\" ) }",
b.done().jsonString( JS ) );
}
}; };
class ObjectId { class ObjectId {
@ -291,14 +295,24 @@ namespace JsonStringTests {
class BinData { class BinData {
public: public:
void run() { void run() {
char d[ 3 ]; char z[ 3 ];
d[ 0 ] = 'a'; z[ 0 ] = 'a';
d[ 1 ] = '\0'; z[ 1 ] = 'b';
d[ 2 ] = 'b'; z[ 2 ] = 'c';
BSONObjBuilder b; BSONObjBuilder b;
b.appendBinData( "a", 3, ByteArray, d ); b.appendBinData( "a", 3, ByteArray, z );
ASSERT_EQUALS( "{ \"a\" : { \"$binary\" : \"a\\u0000b\", \"$type\" : \"02\" } }", ASSERT_EQUALS( "{ \"a\" : { \"$binary\" : \"YWJj\", \"$type\" : \"02\" } }",
b.done().jsonString( Strict ) ); b.done().jsonString( Strict ) );
BSONObjBuilder c;
c.appendBinData( "a", 2, ByteArray, z );
ASSERT_EQUALS( "{ \"a\" : { \"$binary\" : \"YWI=\", \"$type\" : \"02\" } }",
c.done().jsonString( Strict ) );
BSONObjBuilder d;
d.appendBinData( "a", 1, ByteArray, z );
ASSERT_EQUALS( "{ \"a\" : { \"$binary\" : \"YQ==\", \"$type\" : \"02\" } }",
d.done().jsonString( Strict ) );
} }
}; };

View File

@ -270,6 +270,8 @@ inline void our_debug_free(void *p) {
#undef yassert #undef yassert
#include <boost/filesystem/convenience.hpp> #include <boost/filesystem/convenience.hpp>
#include <boost/filesystem/operations.hpp> #include <boost/filesystem/operations.hpp>
#include <boost/archive/iterators/base64_from_binary.hpp>
#include <boost/archive/iterators/transform_width.hpp>
#undef assert #undef assert
#define assert xassert #define assert xassert
#define yassert 1 #define yassert 1