diff options
author | Eliot Horowitz <eliot@10gen.com> | 2009-10-13 10:48:38 -0400 |
---|---|---|
committer | Eliot Horowitz <eliot@10gen.com> | 2009-10-13 10:48:38 -0400 |
commit | f7553c7835e4d7a388bc82ba57a256a4c7441931 (patch) | |
tree | e6682d848012c3935d2740f5f5550e69a6fed74c /scripting | |
parent | fe88b0695996ba2f098c513ad26b7cdcc63e8b79 (diff) | |
download | mongo-f7553c7835e4d7a388bc82ba57a256a4c7441931.tar.gz |
v8: more refactoring, basic shell working
Diffstat (limited to 'scripting')
-rw-r--r-- | scripting/engine_v8.cpp | 20 | ||||
-rw-r--r-- | scripting/engine_v8.h | 6 | ||||
-rw-r--r-- | scripting/v8_db.cpp | 50 | ||||
-rw-r--r-- | scripting/v8_db.h | 5 |
4 files changed, 44 insertions, 37 deletions
diff --git a/scripting/engine_v8.cpp b/scripting/engine_v8.cpp index 1bd9bd9a65a..a8899b7bf9d 100644 --- a/scripting/engine_v8.cpp +++ b/scripting/engine_v8.cpp @@ -2,6 +2,7 @@ #include "v8_wrapper.h" #include "v8_utils.h" +#include "v8_db.h" namespace mongo { @@ -12,6 +13,10 @@ namespace mongo { _globalTemplate->Set(v8::String::New("print"), v8::FunctionTemplate::New(Print)); _globalTemplate->Set(v8::String::New("version"), v8::FunctionTemplate::New(Version)); + + _externalTemplate = getMongoFunctionTemplate( false ); + //_localTemplate = getMongoFunctionTemplate( true ); + installDBTypes( _globalTemplate ); } V8ScriptEngine::~V8ScriptEngine(){ @@ -26,7 +31,8 @@ namespace mongo { // --- scope --- V8Scope::V8Scope( V8ScriptEngine * engine ) - : _handleScope(), + : _engine( engine ) , + _handleScope(), _context( Context::New( 0 , engine->_globalTemplate ) ) , _scope( _context ) , _global( _context->Global() ) , @@ -256,9 +262,7 @@ namespace mongo { Handle<v8::Value> result = script->Run(); if ( result.IsEmpty() ){ - stringstream ss; - ss << "exec error: " << &try_catch; - _error = ss.str(); + _error = (string)"exec error: " + toSTLString( &try_catch ); if ( reportError ) log() << _error << endl; if ( assertOnError ) @@ -266,7 +270,9 @@ namespace mongo { return false; } - if ( printResult ){ + _global->Set( v8::String::New( "__lastres__" ) , result ); + + if ( printResult && ! result->IsUndefined() ){ cout << toSTLString( result ) << endl; } @@ -293,9 +299,9 @@ namespace mongo { return; if ( _connectState == LOCAL ) throw UserException( "localConnect already called, can't call externalSetup" ); - - uassert( "externalSetup not supported yet" , 0 ); + _global->Set( v8::String::New( "Mongo" ) , _engine->_externalTemplate->GetFunction() ); + exec( jsconcatcode , "shell setup" , false , true , true , 0 ); _connectState = EXTERNAL; } diff --git a/scripting/engine_v8.h b/scripting/engine_v8.h index 205dd8f8ba0..13dc6d2cc0d 100644 --- a/scripting/engine_v8.h +++ b/scripting/engine_v8.h @@ -54,6 +54,8 @@ namespace mongo { void _startCall(); static Handle< Value > nativeCallback( const Arguments &args ); + + V8ScriptEngine * _engine; HandleScope _handleScope; Handle<Context> _context; @@ -83,7 +85,9 @@ namespace mongo { private: HandleScope _handleScope; Handle<ObjectTemplate> _globalTemplate; - + + Handle<FunctionTemplate> _externalTemplate; + Handle<FunctionTemplate> _localTemplate; friend class V8Scope; }; diff --git a/scripting/v8_db.cpp b/scripting/v8_db.cpp index 6eb533fc82d..2ce6b6c0f3f 100644 --- a/scripting/v8_db.cpp +++ b/scripting/v8_db.cpp @@ -15,12 +15,26 @@ namespace mongo { #define DDD(x) - void installMongoGlobals( Handle<ObjectTemplate>& global ){ - global->Set(v8::String::New("mongoInject"), FunctionTemplate::New(mongoInject)); - + v8::Handle<v8::FunctionTemplate> getMongoFunctionTemplate( bool local ){ + uassert( "local not supported" , ! local ); v8::Local<v8::FunctionTemplate> mongo = FunctionTemplate::New( mongoInit ); - global->Set(v8::String::New("Mongo") , mongo ); - + + v8::Local<v8::Template> proto = mongo->PrototypeTemplate(); + + proto->Set( v8::String::New( "find" ) , FunctionTemplate::New( mongoFind ) ); + proto->Set( v8::String::New( "insert" ) , FunctionTemplate::New( mongoInsert ) ); + proto->Set( v8::String::New( "remove" ) , FunctionTemplate::New( mongoRemove ) ); + proto->Set( v8::String::New( "update" ) , FunctionTemplate::New( mongoUpdate ) ); + + Local<FunctionTemplate> ic = FunctionTemplate::New( internalCursorCons ); + ic->PrototypeTemplate()->Set( v8::String::New("next") , FunctionTemplate::New( internalCursorNext ) ); + ic->PrototypeTemplate()->Set( v8::String::New("hasNext") , FunctionTemplate::New( internalCursorHasNext ) ); + proto->Set( v8::String::New( "internalCursor" ) , ic ); + + return mongo; + } + + void installDBTypes( Handle<ObjectTemplate>& global ){ v8::Local<v8::FunctionTemplate> db = FunctionTemplate::New( dbInit ); global->Set(v8::String::New("DB") , db ); db->InstanceTemplate()->SetNamedPropertyHandler( collectionFallback ); @@ -32,30 +46,10 @@ namespace mongo { v8::Local<v8::FunctionTemplate> dbQuery = FunctionTemplate::New( dbQueryInit ); global->Set(v8::String::New("DBQuery") , dbQuery ); dbQuery->InstanceTemplate()->SetIndexedPropertyHandler( dbQueryIndexAccess ); - - v8::Local<v8::FunctionTemplate> objectId = FunctionTemplate::New( objectIdInit ); - global->Set(v8::String::New("ObjectId") , objectId ); + + global->Set( v8::String::New("ObjectId") , FunctionTemplate::New( objectIdInit ) ); } - Handle<Value> mongoInject(const Arguments& args){ - jsassert( args.Length() == 1 , "mongoInject takes exactly 1 argument" ); - jsassert( args[0]->IsObject() , "mongoInject needs to be passed a prototype" ); - - Local<v8::Object> o = args[0]->ToObject(); - - o->Set( v8::String::New( "init" ) , FunctionTemplate::New( mongoInit )->GetFunction() ); - o->Set( v8::String::New( "find" ) , FunctionTemplate::New( mongoFind )->GetFunction() ); - o->Set( v8::String::New( "insert" ) , FunctionTemplate::New( mongoInsert )->GetFunction() ); - o->Set( v8::String::New( "remove" ) , FunctionTemplate::New( mongoRemove )->GetFunction() ); - o->Set( v8::String::New( "update" ) , FunctionTemplate::New( mongoUpdate )->GetFunction() ); - - Local<FunctionTemplate> t = FunctionTemplate::New( internalCursorCons ); - t->PrototypeTemplate()->Set( v8::String::New("next") , FunctionTemplate::New( internalCursorNext ) ); - t->PrototypeTemplate()->Set( v8::String::New("hasNext") , FunctionTemplate::New( internalCursorHasNext ) ); - o->Set( v8::String::New( "internalCursor" ) , t->GetFunction() ); - - return v8::Undefined(); - } Handle<Value> mongoInit(const Arguments& args){ @@ -109,6 +103,7 @@ namespace mongo { 4 - skip */ Handle<Value> mongoFind(const Arguments& args){ + cerr << "in mongoFind" << endl; jsassert( args.Length() == 5 , "find needs 5 args" ); jsassert( args[1]->IsObject() , "needs to be an object" ); DBClientConnection * conn = getConnection( args ); @@ -137,6 +132,7 @@ namespace mongo { } v8::Function * cons = (v8::Function*)( *( mongo->Get( v8::String::New( "internalCursor" ) ) ) ); + assert( cons ); Local<v8::Object> c = cons->NewInstance(); // NOTE I don't believe the cursor object will ever be freed. diff --git a/scripting/v8_db.h b/scripting/v8_db.h index 1692396b625..4042c6b1e98 100644 --- a/scripting/v8_db.h +++ b/scripting/v8_db.h @@ -10,10 +10,11 @@ #include "../client/dbclient.h" namespace mongo { - void installMongoGlobals( v8::Handle<v8::ObjectTemplate>& global ); + + v8::Handle<v8::FunctionTemplate> getMongoFunctionTemplate( bool local ); + void installDBTypes( v8::Handle<v8::ObjectTemplate>& global ); // the actual globals - v8::Handle<v8::Value> mongoInject(const v8::Arguments& args); mongo::DBClientConnection * getConnection( const v8::Arguments& args ); |