SERVER-1270 Hook StringData to BufBuilder

This commit is contained in:
Alberto Lerner 2010-07-19 09:56:24 -04:00
parent d0d79d0fbf
commit f51a4d0669
17 changed files with 176 additions and 171 deletions

View File

@ -82,7 +82,7 @@ namespace mongo {
void appendSelfToBufBuilder(BufBuilder& b) const {
assert( objsize() );
b.append(reinterpret_cast<const void *>( objdata() ), objsize());
b.appendBuf(reinterpret_cast<const void *>( objdata() ), objsize());
}
/** Readable representation of a BSON object in an extended JSON-style notation.

View File

@ -106,16 +106,16 @@ namespace mongo {
/** append element to the object we are building */
BSONObjBuilder& append( const BSONElement& e) {
assert( !e.eoo() ); // do not append eoo, that would corrupt us. the builder auto appends when done() is called.
_b.append((void*) e.rawdata(), e.size());
_b.appendBuf((void*) e.rawdata(), e.size());
return *this;
}
/** append an element but with a new name */
BSONObjBuilder& appendAs(const BSONElement& e, const char *as) {
assert( !e.eoo() ); // do not append eoo, that would corrupt us. the builder auto appends when done() is called.
_b.append((char) e.type());
_b.append(as);
_b.append((void *) e.value(), e.valuesize());
_b.appendNum((char) e.type());
_b.appendStr(as);
_b.appendBuf((void *) e.value(), e.valuesize());
return *this;
}
@ -127,25 +127,25 @@ namespace mongo {
/** add a subobject as a member */
BSONObjBuilder& append(const char *fieldName, BSONObj subObj) {
_b.append((char) Object);
_b.append(fieldName);
_b.append((void *) subObj.objdata(), subObj.objsize());
_b.appendNum((char) Object);
_b.appendStr(fieldName);
_b.appendBuf((void *) subObj.objdata(), subObj.objsize());
return *this;
}
/** add a subobject as a member */
BSONObjBuilder& append(const string& fieldName , BSONObj subObj) {
_b.append((char) Object);
_b.append(fieldName.c_str(), fieldName.size()+1);
_b.append((void *) subObj.objdata(), subObj.objsize());
_b.appendNum((char) Object);
_b.appendStr(fieldName); // XXX
_b.appendBuf((void *) subObj.objdata(), subObj.objsize());
return *this;
}
/** add header for a new subobject and return bufbuilder for writing to
the subobject's body */
BufBuilder &subobjStart(const char *fieldName) {
_b.append((char) Object);
_b.append(fieldName);
_b.appendNum((char) Object);
_b.appendStr(fieldName);
return _b;
}
@ -153,9 +153,9 @@ namespace mongo {
style fields in it.
*/
BSONObjBuilder& appendArray(const char *fieldName, const BSONObj &subObj) {
_b.append((char) Array);
_b.append(fieldName);
_b.append((void *) subObj.objdata(), subObj.objsize());
_b.appendNum((char) Array);
_b.appendStr(fieldName);
_b.appendBuf((void *) subObj.objdata(), subObj.objsize());
return *this;
}
BSONObjBuilder& append(const char *fieldName, BSONArray arr) {
@ -165,32 +165,32 @@ namespace mongo {
/** add header for a new subarray and return bufbuilder for writing to
the subarray's body */
BufBuilder &subarrayStart(const char *fieldName) {
_b.append((char) Array);
_b.append(fieldName);
_b.appendNum((char) Array);
_b.appendStr(fieldName);
return _b;
}
/** Append a boolean element */
BSONObjBuilder& appendBool(const char *fieldName, int val) {
_b.append((char) Bool);
_b.append(fieldName);
_b.append((char) (val?1:0));
_b.appendNum((char) Bool);
_b.appendStr(fieldName);
_b.appendNum((char) (val?1:0));
return *this;
}
/** Append a boolean element */
BSONObjBuilder& append(const char *fieldName, bool val) {
_b.append((char) Bool);
_b.append(fieldName);
_b.append((char) (val?1:0));
_b.appendNum((char) Bool);
_b.appendStr(fieldName);
_b.appendNum((char) (val?1:0));
return *this;
}
/** Append a 32 bit integer element */
BSONObjBuilder& append(const char *fieldName, int n) {
_b.append((char) NumberInt);
_b.append(fieldName);
_b.append(n);
_b.appendNum((char) NumberInt);
_b.appendStr(fieldName);
_b.appendNum(n);
return *this;
}
/** Append a 32 bit integer element */
@ -205,9 +205,9 @@ namespace mongo {
/** Append a NumberLong */
BSONObjBuilder& append(const char *fieldName, long long n) {
_b.append((char) NumberLong);
_b.append(fieldName);
_b.append(n);
_b.appendNum((char) NumberLong);
_b.appendStr(fieldName);
_b.appendNum(n);
return *this;
}
@ -255,9 +255,9 @@ namespace mongo {
/** Append a double element */
BSONObjBuilder& append(const char *fieldName, double n) {
_b.append((char) NumberDouble);
_b.append(fieldName);
_b.append(n);
_b.appendNum((char) NumberDouble);
_b.appendStr(fieldName);
_b.appendNum(n);
return *this;
}
@ -271,17 +271,17 @@ namespace mongo {
method for this.
*/
BSONObjBuilder& appendOID(const char *fieldName, OID *oid = 0 , bool generateIfBlank = false ) {
_b.append((char) jstOID);
_b.append(fieldName);
_b.appendNum((char) jstOID);
_b.appendStr(fieldName);
if ( oid )
_b.append( (void *) oid, 12 );
_b.appendBuf( (void *) oid, 12 );
else {
OID tmp;
if ( generateIfBlank )
tmp.init();
else
tmp.clear();
_b.append( (void *) &tmp, 12 );
_b.appendBuf( (void *) &tmp, 12 );
}
return *this;
}
@ -292,9 +292,9 @@ namespace mongo {
@returns the builder object
*/
BSONObjBuilder& append( const char *fieldName, OID oid ) {
_b.append((char) jstOID);
_b.append(fieldName);
_b.append( (void *) &oid, 12 );
_b.appendNum((char) jstOID);
_b.appendStr(fieldName);
_b.appendBuf( (void *) &oid, 12 );
return *this;
}
@ -311,9 +311,9 @@ namespace mongo {
the number of seconds since January 1, 1970, 00:00:00 GMT
*/
BSONObjBuilder& appendTimeT(const char *fieldName, time_t dt) {
_b.append((char) Date);
_b.append(fieldName);
_b.append(static_cast<unsigned long long>(dt) * 1000);
_b.appendNum((char) Date);
_b.appendStr(fieldName);
_b.appendNum(static_cast<unsigned long long>(dt) * 1000);
return *this;
}
/** Append a date.
@ -329,9 +329,9 @@ namespace mongo {
log() << "DEV WARNING appendDate() called with a tiny (but nonzero) date" << endl;
}
#endif
_b.append((char) Date);
_b.append(fieldName);
_b.append(dt);
_b.appendNum((char) Date);
_b.appendStr(fieldName);
_b.appendNum(dt);
return *this;
}
BSONObjBuilder& append(const char *fieldName, Date_t dt) {
@ -343,10 +343,10 @@ namespace mongo {
@param regex options such as "i" or "g"
*/
BSONObjBuilder& appendRegex(const char *fieldName, const char *regex, const char *options = "") {
_b.append((char) RegEx);
_b.append(fieldName);
_b.append(regex);
_b.append(options);
_b.appendNum((char) RegEx);
_b.appendStr(fieldName);
_b.appendStr(regex);
_b.appendStr(options);
return *this;
}
/** Append a regular expression value
@ -357,18 +357,18 @@ namespace mongo {
return appendRegex(fieldName.c_str(), regex.c_str(), options.c_str());
}
BSONObjBuilder& appendCode(const char *fieldName, const char *code) {
_b.append((char) Code);
_b.append(fieldName);
_b.append((int) strlen(code)+1);
_b.append(code);
_b.appendNum((char) Code);
_b.appendStr(fieldName);
_b.appendNum((int) strlen(code)+1);
_b.appendStr(code);
return *this;
}
/** Append a string element. len DOES include terminating nul */
BSONObjBuilder& append(const char *fieldName, const char *str, int len) {
_b.append((char) String);
_b.append(fieldName);
_b.append((int)len);
_b.append(str, len);
_b.appendNum((char) String);
_b.appendStr(fieldName);
_b.appendNum((int)len);
_b.appendBuf(str, len);
return *this;
}
/** Append a string element */
@ -380,40 +380,40 @@ namespace mongo {
return append(fieldName, str.c_str(), (int) str.size()+1);
}
BSONObjBuilder& appendSymbol(const char *fieldName, const char *symbol) {
_b.append((char) Symbol);
_b.append(fieldName);
_b.append((int) strlen(symbol)+1);
_b.append(symbol);
_b.appendNum((char) Symbol);
_b.appendStr(fieldName);
_b.appendNum((int) strlen(symbol)+1);
_b.appendStr(symbol);
return *this; }
/** Append a Null element to the object */
BSONObjBuilder& appendNull( const char *fieldName ) {
_b.append( (char) jstNULL );
_b.append( fieldName );
_b.appendNum( (char) jstNULL );
_b.appendStr( fieldName );
return *this; }
// Append an element that is less than all other keys.
BSONObjBuilder& appendMinKey( const char *fieldName ) {
_b.append( (char) MinKey );
_b.append( fieldName );
_b.appendNum( (char) MinKey );
_b.appendStr( fieldName );
return *this; }
// Append an element that is greater than all other keys.
BSONObjBuilder& appendMaxKey( const char *fieldName ) {
_b.append( (char) MaxKey );
_b.append( fieldName );
_b.appendNum( (char) MaxKey );
_b.appendStr( fieldName );
return *this; }
// Append a Timestamp field -- will be updated to next OpTime on db insert.
BSONObjBuilder& appendTimestamp( const char *fieldName ) {
_b.append( (char) Timestamp );
_b.append( fieldName );
_b.append( (unsigned long long) 0 );
_b.appendNum( (char) Timestamp );
_b.appendStr( fieldName );
_b.appendNum( (unsigned long long) 0 );
return *this; }
BSONObjBuilder& appendTimestamp( const char *fieldName , unsigned long long val ) {
_b.append( (char) Timestamp );
_b.append( fieldName );
_b.append( val );
_b.appendNum( (char) Timestamp );
_b.appendStr( fieldName );
_b.appendNum( val );
return *this; }
/**
@ -428,11 +428,11 @@ namespace mongo {
@deprecated
*/
BSONObjBuilder& appendDBRef( const char *fieldName, const char *ns, const OID &oid ) {
_b.append( (char) DBRef );
_b.append( fieldName );
_b.append( (int) strlen( ns ) + 1 );
_b.append( ns );
_b.append( (void *) &oid, 12 );
_b.appendNum( (char) DBRef );
_b.appendStr( fieldName );
_b.appendNum( (int) strlen( ns ) + 1 );
_b.appendStr( ns );
_b.appendBuf( (void *) &oid, 12 );
return *this;
}
@ -444,11 +444,11 @@ namespace mongo {
@param data the byte array
*/
BSONObjBuilder& appendBinData( const char *fieldName, int len, BinDataType type, const char *data ) {
_b.append( (char) BinData );
_b.append( fieldName );
_b.append( len );
_b.append( (char) type );
_b.append( (void *) data, len );
_b.appendNum( (char) BinData );
_b.appendStr( fieldName );
_b.appendNum( len );
_b.appendNum( (char) type );
_b.appendBuf( (void *) data, len );
return *this;
}
BSONObjBuilder& appendBinData( const char *fieldName, int len, BinDataType type, const unsigned char *data ) {
@ -462,30 +462,31 @@ namespace mongo {
@param len the length of data
*/
BSONObjBuilder& appendBinDataArrayDeprecated( const char * fieldName , const char * data , int len ){
_b.append( (char) BinData );
_b.append( fieldName );
_b.append( len + 4 );
_b.append( (char)0x2 );
_b.append( len );
_b.append( (void *) data, len );
return *this; }
_b.appendNum( (char) BinData );
_b.appendStr( fieldName );
_b.appendNum( len + 4 );
_b.appendNum( (char)0x2 );
_b.appendNum( len );
_b.appendBuf( (void *) data, len );
return *this;
}
/** Append to the BSON object a field of type CodeWScope. This is a javascript code
fragment accompanied by some scope that goes with it.
*/
BSONObjBuilder& appendCodeWScope( const char *fieldName, const char *code, const BSONObj &scope ) {
_b.append( (char) CodeWScope );
_b.append( fieldName );
_b.append( ( int )( 4 + 4 + strlen( code ) + 1 + scope.objsize() ) );
_b.append( ( int ) strlen( code ) + 1 );
_b.append( code );
_b.append( ( void * )scope.objdata(), scope.objsize() );
_b.appendNum( (char) CodeWScope );
_b.appendStr( fieldName );
_b.appendNum( ( int )( 4 + 4 + strlen( code ) + 1 + scope.objsize() ) );
_b.appendNum( ( int ) strlen( code ) + 1 );
_b.appendStr( code );
_b.appendBuf( ( void * )scope.objdata(), scope.objsize() );
return *this;
}
void appendUndefined( const char *fieldName ) {
_b.append( (char) Undefined );
_b.append( fieldName );
_b.appendNum( (char) Undefined );
_b.appendStr( fieldName );
}
/* helper function -- see Query::where() for primary way to do this. */
@ -609,7 +610,7 @@ namespace mongo {
_doneCalled = true;
_s.endField();
_b.append((char) EOO);
_b.appendNum((char) EOO);
char *data = _b.buf() + _offset;
int size = _b.len() - _offset;
*((int*)data) = size;

View File

@ -21,6 +21,7 @@
#include <string.h>
#include <stdio.h>
#include <boost/shared_ptr.hpp>
#include "../stringdata.h"
namespace mongo {
@ -70,35 +71,38 @@ namespace mongo {
/* assume ownership of the buffer - you must then free() it */
void decouple() { data = 0; }
template<class T> void append(T j) {
*((T*)grow(sizeof(T))) = j;
void appendNum(char j){
*((char*)grow(sizeof(char))) = j;
}
void append(short j) {
append<short>(j);
void appendNum(short j) {
*((short*)grow(sizeof(short))) = j;
}
void append(int j) {
append<int>(j);
void appendNum(int j) {
*((int*)grow(sizeof(int))) = j;
}
void append(unsigned j) {
append<unsigned>(j);
void appendNum(unsigned j) {
*((unsigned*)grow(sizeof(unsigned))) = j;
}
void append(bool j) {
append<bool>(j);
void appendNum(bool j) {
*((bool*)grow(sizeof(bool))) = j;
}
void append(double j) {
append<double>(j);
void appendNum(double j) {
*((double*)grow(sizeof(double))) = j;
}
void appendNum(long long j) {
*((long long*)grow(sizeof(long long))) = j;
}
void appendNum(unsigned long long j) {
*((unsigned long long*)grow(sizeof(unsigned long long))) = j;
}
void append(const void *src, size_t len) {
void appendBuf(const void *src, size_t len) {
memcpy(grow((int) len), src, len);
}
void append(const char *str) {
append((void*) str, strlen(str)+1);
}
void append(const std::string &str) {
append( (void *)str.c_str(), str.length() + 1 );
void appendStr(const StringData &str) {
const int len = str.size() + 1;
memcpy(grow(len), str.data(), len);
}
int len() const {

View File

@ -654,8 +654,8 @@ namespace mongo {
BufBuilder b;
int opts = 0;
b.append( opts );
b.append( ns );
b.appendNum( opts );
b.appendStr( ns );
obj.appendSelfToBufBuilder( b );
toSend.setData( dbInsert , b.buf() , b.len() );
@ -668,8 +668,8 @@ namespace mongo {
BufBuilder b;
int opts = 0;
b.append( opts );
b.append( ns );
b.appendNum( opts );
b.appendStr( ns );
for( vector< BSONObj >::const_iterator i = v.begin(); i != v.end(); ++i )
i->appendSelfToBufBuilder( b );
@ -683,13 +683,13 @@ namespace mongo {
BufBuilder b;
int opts = 0;
b.append( opts );
b.append( ns );
b.appendNum( opts );
b.appendStr( ns );
int flags = 0;
if ( justOne )
flags |= 1;
b.append( flags );
b.appendNum( flags );
obj.obj.appendSelfToBufBuilder( b );
@ -701,13 +701,13 @@ namespace mongo {
void DBClientBase::update( const string & ns , Query query , BSONObj obj , bool upsert , bool multi ) {
BufBuilder b;
b.append( (int)0 ); // reserved
b.append( ns );
b.appendNum( (int)0 ); // reserved
b.appendStr( ns );
int flags = 0;
if ( upsert ) flags |= UpdateOption_Upsert;
if ( multi ) flags |= UpdateOption_Multi;
b.append( flags );
b.appendNum( flags );
query.obj.appendSelfToBufBuilder( b );
obj.appendSelfToBufBuilder( b );
@ -828,10 +828,10 @@ namespace mongo {
// see query.h for the protocol we are using here.
BufBuilder b;
int opts = queryOptions;
b.append(opts);
b.append(ns.c_str());
b.append(nToSkip);
b.append(nToReturn);
b.appendNum(opts);
b.appendStr(ns.c_str());
b.appendNum(nToSkip);
b.appendNum(nToReturn);
query.appendSelfToBufBuilder(b);
if ( fieldsToReturn )
fieldsToReturn->appendSelfToBufBuilder(b);
@ -892,9 +892,9 @@ namespace mongo {
void DBClientConnection::killCursor( long long cursorId ){
BufBuilder b;
b.append( (int)0 ); // reserved
b.append( (int)1 ); // number
b.append( cursorId );
b.appendNum( (int)0 ); // reserved
b.appendNum( (int)1 ); // number
b.appendNum( cursorId );
Message m;
m.setData( dbKillCursors , b.buf() , b.len() );

View File

@ -41,10 +41,10 @@ namespace mongo {
assembleRequest( ns, query, nextBatchSize() , nToSkip, fieldsToReturn, opts, toSend );
} else {
BufBuilder b;
b.append( opts );
b.append( ns.c_str() );
b.append( nToReturn );
b.append( cursorId );
b.appendNum( opts );
b.appendStr( ns.c_str() );
b.appendNum( nToReturn );
b.appendNum( cursorId );
toSend.setData( dbGetMore, b.buf(), b.len() );
}
if ( !connector->call( toSend, *m, false ) )
@ -63,10 +63,10 @@ namespace mongo {
assert(nToReturn > 0);
}
BufBuilder b;
b.append(opts);
b.append(ns.c_str());
b.append(nextBatchSize());
b.append(cursorId);
b.appendNum(opts);
b.appendStr(ns.c_str());
b.appendNum(nextBatchSize());
b.appendNum(cursorId);
Message toSend;
toSend.setData(dbGetMore, b.buf(), b.len());
@ -209,9 +209,9 @@ namespace mongo {
if ( cursorId && _ownCursor ) {
BufBuilder b;
b.append( (int)0 ); // reserved
b.append( (int)1 ); // number
b.append( cursorId );
b.appendNum( (int)0 ); // reserved
b.appendNum( (int)1 ); // number
b.appendNum( cursorId );
Message m;
m.setData( dbKillCursors , b.buf() , b.len() );

View File

@ -269,14 +269,14 @@ sendmore:
string ns = dbresponse.exhaust; // before reset() free's it...
m.reset();
BufBuilder b(512);
b.append((int) 0 /*size set later in appendData()*/);
b.append(header->id);
b.append(header->responseTo);
b.append((int) dbGetMore);
b.append((int) 0);
b.append(ns);
b.append((int) 0); // ntoreturn
b.append(cursorid);
b.appendNum((int) 0 /*size set later in appendData()*/);
b.appendNum(header->id);
b.appendNum(header->responseTo);
b.appendNum((int) dbGetMore);
b.appendNum((int) 0);
b.appendStr(ns);
b.appendNum((int) 0); // ntoreturn
b.appendNum(cursorid);
m.appendData(b.buf(), b.len());
b.decouple();
DEV log() << "exhaust=true sending more" << endl;

View File

@ -1899,7 +1899,7 @@ namespace mongo {
// anObjBuilder.append("ok", ok);
anObjBuilder.append("ok", ok?1.0:0.0);
BSONObj x = anObjBuilder.done();
b.append((void*) x.objdata(), x.objsize());
b.appendBuf((void*) x.objdata(), x.objsize());
return true;
}

View File

@ -208,7 +208,7 @@ namespace mongo {
) {
BufBuilder b(32768);
b.skip(sizeof(QueryResult));
b.append(data, size);
b.appendBuf(data, size);
QueryResult *qr = (QueryResult *) b.buf();
qr->_resultFlags() = queryResultFlags;
qr->len = b.len();
@ -243,7 +243,7 @@ namespace mongo {
inline void replyToQuery(int queryResultFlags, Message &m, DbResponse &dbresponse, BSONObj obj) {
BufBuilder b;
b.skip(sizeof(QueryResult));
b.append((void*) obj.objdata(), obj.objsize());
b.appendBuf((void*) obj.objdata(), obj.objsize());
QueryResult* msgdata = (QueryResult *) b.buf();
b.decouple();
QueryResult *qr = msgdata;

View File

@ -192,7 +192,7 @@ namespace mongo {
BufBuilder b;
b.skip(sizeof(QueryResult));
b.append((void*) errObj.objdata(), errObj.objsize());
b.appendBuf((void*) errObj.objdata(), errObj.objsize());
// todo: call replyToQuery() from here instead of this!!! see dbmessage.h
QueryResult * msgdata = (QueryResult *) b.buf();

View File

@ -233,7 +233,7 @@ namespace mongo {
anObjBuilder.append("errmsg", "db assertion failure");
anObjBuilder.append("ok", 0.0);
BSONObj x = anObjBuilder.done();
b.append((void*) x.objdata(), x.objsize());
b.appendBuf((void*) x.objdata(), x.objsize());
return true;
}

View File

@ -74,7 +74,7 @@ namespace mongo {
b.append("$diskLoc", loc->toBSONObj());
b.done();
} else {
bb.append((void*) js.objdata(), js.objsize());
bb.appendBuf((void*) js.objdata(), js.objsize());
}
}

View File

@ -31,7 +31,7 @@ namespace JsobjTests {
public:
void run() {
BufBuilder b( 0 );
b.append( "foo" );
b.appendStr( "foo" );
ASSERT_EQUALS( 4, b.len() );
ASSERT( strcmp( "foo", b.buf() ) == 0 );
}

View File

@ -992,10 +992,10 @@ namespace QueryOptimizerTests {
// see query.h for the protocol we are using here.
BufBuilder b;
int opts = queryOptions;
b.append(opts);
b.append(ns.c_str());
b.append(nToSkip);
b.append(nToReturn);
b.appendNum(opts);
b.appendStr(ns.c_str());
b.appendNum(nToSkip);
b.appendNum(nToReturn);
query.appendSelfToBufBuilder(b);
if ( fieldsToReturn )
fieldsToReturn->appendSelfToBufBuilder(b);

View File

@ -64,7 +64,7 @@ namespace mongo {
while ( _cursor->more() ){
BSONObj o = _cursor->next();
b.append( (void*)o.objdata() , o.objsize() );
b.appendBuf( (void*)o.objdata() , o.objsize() );
num++;
if ( b.len() > maxSize ){

View File

@ -67,7 +67,7 @@ namespace mongo {
b.skip( sizeof( QueryResult ) );
{
BSONObj obj = BSON( "$err" << errmsg );
b.append( obj.objdata() , obj.objsize() );
b.appendBuf( obj.objdata() , obj.objsize() );
}
QueryResult *qr = (QueryResult*)b.buf();

View File

@ -220,12 +220,12 @@ void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *pa
if ( size_payload < m.header()->len ) {
bytesRemainingInMessage[ c ] = m.header()->len - size_payload;
messageBuilder[ c ].reset( new BufBuilder() );
messageBuilder[ c ]->append( (void*)payload, size_payload );
messageBuilder[ c ]->appendBuf( (void*)payload, size_payload );
return;
}
} else {
bytesRemainingInMessage[ c ] -= size_payload;
messageBuilder[ c ]->append( (void*)payload, size_payload );
messageBuilder[ c ]->appendBuf( (void*)payload, size_payload );
if ( bytesRemainingInMessage[ c ] < 0 ) {
cerr << "Received too many bytes to complete message, resetting buffer" << endl;
bytesRemainingInMessage[ c ] = 0;

View File

@ -172,7 +172,7 @@ namespace mongo {
if ( doneSetup == 1717 ) {
BufBuilder b(512);
time_t_to_String( time(0) , b.grow(20) );
b.append( ss.str() );
b.appendStr( ss.str() );
const char *s = b.buf();
string threadName = getThreadName();