From dcbe8fbd95f25ec5edd4331b6ad2fc7d14a09033 Mon Sep 17 00:00:00 2001 From: Eliot Horowitz Date: Mon, 21 Sep 2009 15:54:41 -0400 Subject: [PATCH] handle js -> bson in 1 place --- db/dbeval.cpp | 23 ++--------------------- scripting/engine.cpp | 35 +++++++++++++++++++++++++++++++++++ scripting/engine.h | 2 ++ 3 files changed, 39 insertions(+), 21 deletions(-) diff --git a/db/dbeval.cpp b/db/dbeval.cpp index f7fff2517c0..9a931b7b7eb 100644 --- a/db/dbeval.cpp +++ b/db/dbeval.cpp @@ -99,28 +99,9 @@ namespace mongo { errmsg += s->getError(); return false; } + + s->append( result , "retval" , "return" ); - int type = s->type("return"); - if ( type == Object ) - result.append("retval", s->getObject("return")); - else if ( type == Array ) - result.appendArray("retval", s->getObject("return")); - else if ( type == NumberDouble ) - result.append("retval", s->getNumber("return")); - else if ( type == String ) - result.append("retval", s->getString("return").c_str()); - else if ( type == Bool ) - result.appendBool("retval", s->getBoolean("return")); - else if ( type == jstNULL || type == Undefined ) - result.appendNull("retval"); - else if ( type == Date ) - result.appendDate( "retval" , (unsigned long long) s->getNumber( "return" ) ); - else { - stringstream temp; - temp << "can't handle return type from db.eval:"; - temp << type; - uassert( temp.str() , 0 ); - } return true; } diff --git a/scripting/engine.cpp b/scripting/engine.cpp index 06efee0d4e6..a20a48196af 100644 --- a/scripting/engine.cpp +++ b/scripting/engine.cpp @@ -18,6 +18,41 @@ namespace mongo { ScriptEngine::~ScriptEngine(){ } + void Scope::append( BSONObjBuilder & builder , const char * fieldName , const char * scopeName ){ + int t = type( scopeName ); + + switch ( t ){ + case Object: + builder.append( fieldName , getObject( scopeName ) ); + break; + case Array: + builder.appendArray( fieldName , getObject( scopeName ) ); + break; + case NumberDouble: + builder.append( fieldName , getNumber( scopeName ) ); + break; + case String: + builder.append( fieldName , getString( scopeName ).c_str() ); + break; + case Bool: + builder.appendBool( fieldName , getBoolean( scopeName ) ); + break; + case jstNULL: + case Undefined: + builder.appendNull( fieldName ); + break; + case Date: + builder.appendDate( fieldName , (unsigned long long) getNumber( scopeName ) ); + break; + default: + stringstream temp; + temp << "can't append type from:"; + temp << t; + uassert( temp.str() , 0 ); + } + + } + int Scope::invoke( const char* code , const BSONObj& args, int timeoutMs ){ ScriptingFunction func = createFunction( code ); uassert( "compile failed" , func ); diff --git a/scripting/engine.h b/scripting/engine.h index 16633704b6f..50b0dee6dea 100644 --- a/scripting/engine.h +++ b/scripting/engine.h @@ -34,6 +34,8 @@ namespace mongo { virtual int type( const char *field ) = 0; + void append( BSONObjBuilder & builder , const char * fieldName , const char * scopeName ); + virtual void setNumber( const char *field , double val ) = 0; virtual void setString( const char *field , const char * val ) = 0; virtual void setObject( const char *field , const BSONObj& obj , bool readOnly=true ) = 0;