summaryrefslogtreecommitdiff
path: root/scripting
diff options
context:
space:
mode:
authorEliot Horowitz <eliot@10gen.com>2009-10-13 10:48:38 -0400
committerEliot Horowitz <eliot@10gen.com>2009-10-13 10:48:38 -0400
commitf7553c7835e4d7a388bc82ba57a256a4c7441931 (patch)
treee6682d848012c3935d2740f5f5550e69a6fed74c /scripting
parentfe88b0695996ba2f098c513ad26b7cdcc63e8b79 (diff)
downloadmongo-f7553c7835e4d7a388bc82ba57a256a4c7441931.tar.gz
v8: more refactoring, basic shell working
Diffstat (limited to 'scripting')
-rw-r--r--scripting/engine_v8.cpp20
-rw-r--r--scripting/engine_v8.h6
-rw-r--r--scripting/v8_db.cpp50
-rw-r--r--scripting/v8_db.h5
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 );