diff options
Diffstat (limited to 'scripting/v8_db.h')
-rw-r--r-- | scripting/v8_db.h | 132 |
1 files changed, 39 insertions, 93 deletions
diff --git a/scripting/v8_db.h b/scripting/v8_db.h index 7dbca92..08d15d0 100644 --- a/scripting/v8_db.h +++ b/scripting/v8_db.h @@ -22,129 +22,75 @@ #include <cstdio> #include <cstdlib> -#include "engine.h" +#include "engine_v8.h" #include "../client/dbclient.h" namespace mongo { // These functions may depend on the caller creating a handle scope and context scope. - v8::Handle<v8::FunctionTemplate> getMongoFunctionTemplate( bool local ); - void installDBTypes( v8::Handle<v8::ObjectTemplate>& global ); - void installDBTypes( v8::Handle<v8::Object>& global ); + v8::Handle<v8::FunctionTemplate> getMongoFunctionTemplate( V8Scope * scope, bool local ); +// void installDBTypes( V8Scope * scope, v8::Handle<v8::ObjectTemplate>& global ); + void installDBTypes( V8Scope * scope, v8::Handle<v8::Object>& global ); // the actual globals mongo::DBClientBase * getConnection( const v8::Arguments& args ); // Mongo members - v8::Handle<v8::Value> mongoConsLocal(const v8::Arguments& args); - v8::Handle<v8::Value> mongoConsExternal(const v8::Arguments& args); + v8::Handle<v8::Value> mongoConsLocal(V8Scope* scope, const v8::Arguments& args); + v8::Handle<v8::Value> mongoConsExternal(V8Scope* scope, const v8::Arguments& args); - v8::Handle<v8::Value> mongoFind(const v8::Arguments& args); - v8::Handle<v8::Value> mongoInsert(const v8::Arguments& args); - v8::Handle<v8::Value> mongoRemove(const v8::Arguments& args); - v8::Handle<v8::Value> mongoUpdate(const v8::Arguments& args); + v8::Handle<v8::Value> mongoFind(V8Scope* scope, const v8::Arguments& args); + v8::Handle<v8::Value> mongoInsert(V8Scope* scope, const v8::Arguments& args); + v8::Handle<v8::Value> mongoRemove(V8Scope* scope, const v8::Arguments& args); + v8::Handle<v8::Value> mongoUpdate(V8Scope* scope, const v8::Arguments& args); - v8::Handle<v8::Value> internalCursorCons(const v8::Arguments& args); - v8::Handle<v8::Value> internalCursorNext(const v8::Arguments& args); - v8::Handle<v8::Value> internalCursorHasNext(const v8::Arguments& args); - v8::Handle<v8::Value> internalCursorObjsLeftInBatch(const v8::Arguments& args); + v8::Handle<v8::Value> internalCursorCons(V8Scope* scope, const v8::Arguments& args); + v8::Handle<v8::Value> internalCursorNext(V8Scope* scope, const v8::Arguments& args); + v8::Handle<v8::Value> internalCursorHasNext(V8Scope* scope, const v8::Arguments& args); + v8::Handle<v8::Value> internalCursorObjsLeftInBatch(V8Scope* scope, const v8::Arguments& args); // DB members - v8::Handle<v8::Value> dbInit(const v8::Arguments& args); - v8::Handle<v8::Value> collectionInit( const v8::Arguments& args ); - v8::Handle<v8::Value> objectIdInit( const v8::Arguments& args ); + v8::Handle<v8::Value> dbInit(V8Scope* scope, const v8::Arguments& args); + v8::Handle<v8::Value> collectionInit(V8Scope* scope, const v8::Arguments& args ); + v8::Handle<v8::Value> objectIdInit( V8Scope* scope, const v8::Arguments& args ); - v8::Handle<v8::Value> dbRefInit( const v8::Arguments& args ); - v8::Handle<v8::Value> dbPointerInit( const v8::Arguments& args ); - v8::Handle<v8::Value> dbTimestampInit( const v8::Arguments& args ); + v8::Handle<v8::Value> dbRefInit( V8Scope* scope, const v8::Arguments& args ); + v8::Handle<v8::Value> dbPointerInit( V8Scope* scope, const v8::Arguments& args ); + v8::Handle<v8::Value> dbTimestampInit( V8Scope* scope, const v8::Arguments& args ); - v8::Handle<v8::Value> binDataInit( const v8::Arguments& args ); - v8::Handle<v8::Value> binDataToString( const v8::Arguments& args ); + v8::Handle<v8::Value> binDataInit( V8Scope* scope, const v8::Arguments& args ); + v8::Handle<v8::Value> binDataToString( V8Scope* scope, const v8::Arguments& args ); + v8::Handle<v8::Value> binDataToBase64( V8Scope* scope, const v8::Arguments& args ); + v8::Handle<v8::Value> binDataToHex( V8Scope* scope, const v8::Arguments& args ); - v8::Handle<v8::Value> numberLongInit( const v8::Arguments& args ); - v8::Handle<v8::Value> numberLongToNumber(const v8::Arguments& args); - v8::Handle<v8::Value> numberLongValueOf(const v8::Arguments& args); - v8::Handle<v8::Value> numberLongToString(const v8::Arguments& args); + v8::Handle<v8::Value> uuidInit( V8Scope* scope, const v8::Arguments& args ); + v8::Handle<v8::Value> md5Init( V8Scope* scope, const v8::Arguments& args ); + v8::Handle<v8::Value> hexDataInit( V8Scope* scope, const v8::Arguments& args ); - v8::Handle<v8::Value> dbQueryInit( const v8::Arguments& args ); + v8::Handle<v8::Value> numberLongInit( V8Scope* scope, const v8::Arguments& args ); + v8::Handle<v8::Value> numberLongToNumber(V8Scope* scope, const v8::Arguments& args); + v8::Handle<v8::Value> numberLongValueOf(V8Scope* scope, const v8::Arguments& args); + v8::Handle<v8::Value> numberLongToString(V8Scope* scope, const v8::Arguments& args); + + v8::Handle<v8::Value> numberIntInit( V8Scope* scope, const v8::Arguments& args ); + v8::Handle<v8::Value> numberIntToNumber(V8Scope* scope, const v8::Arguments& args); + v8::Handle<v8::Value> numberIntValueOf(V8Scope* scope, const v8::Arguments& args); + v8::Handle<v8::Value> numberIntToString(V8Scope* scope, const v8::Arguments& args); + + v8::Handle<v8::Value> dbQueryInit( V8Scope* scope, const v8::Arguments& args ); v8::Handle<v8::Value> dbQueryIndexAccess( uint32_t index , const v8::AccessorInfo& info ); v8::Handle<v8::Value> collectionFallback( v8::Local<v8::String> name, const v8::AccessorInfo &info); - v8::Handle<v8::Value> bsonsize( const v8::Arguments& args ); + v8::Handle<v8::Value> bsonsize( V8Scope* scope, const v8::Arguments& args ); // call with v8 mutex: void enableV8Interrupt(); void disableV8Interrupt(); - // The implementation below assumes that SERVER-1816 has been fixed - in - // particular, interrupted() must return true if an interrupt was ever - // sent; currently that is not the case if a new killop overwrites the data - // for an old one - template < v8::Handle< v8::Value > ( *f ) ( const v8::Arguments& ) > - v8::Handle< v8::Value > v8Callback( const v8::Arguments &args ) { - disableV8Interrupt(); // we don't want to have to audit all v8 calls for termination exceptions, so we don't allow these exceptions during the callback - if ( globalScriptEngine->interrupted() ) { - v8::V8::TerminateExecution(); // experimentally it seems that TerminateExecution() will override the return value - return v8::Undefined(); - } - v8::Handle< v8::Value > ret; - string exception; - try { - ret = f( args ); - } - catch( const std::exception &e ) { - exception = e.what(); - } - catch( ... ) { - exception = "unknown exception"; - } - enableV8Interrupt(); - if ( globalScriptEngine->interrupted() ) { - v8::V8::TerminateExecution(); - return v8::Undefined(); - } - if ( !exception.empty() ) { - // technically, ThrowException is supposed to be the last v8 call before returning - ret = v8::ThrowException( v8::String::New( exception.c_str() ) ); - } - return ret; - } - - template < v8::Handle< v8::Value > ( *f ) ( const v8::Arguments& ) > - v8::Local< v8::FunctionTemplate > newV8Function() { - return v8::FunctionTemplate::New( v8Callback< f > ); - } - - // Preemption is going to be allowed for the v8 mutex, and some of our v8 - // usage is not preemption safe. So we are using an additional mutex that - // will not be preempted. The V8Lock should be used in place of v8::Locker - // except in certain special cases involving interrupts. - namespace v8Locks { - // the implementations are quite simple - objects must be destroyed in - // reverse of the order created, and should not be shared between threads - struct RecursiveLock { - RecursiveLock(); - ~RecursiveLock(); - bool _unlock; - }; - struct RecursiveUnlock { - RecursiveUnlock(); - ~RecursiveUnlock(); - bool _lock; - }; - } // namespace v8Locks - class V8Lock { - v8Locks::RecursiveLock _noPreemptionLock; - v8::Locker _preemptionLock; - }; - struct V8Unlock { - v8::Unlocker _preemptionUnlock; - v8Locks::RecursiveUnlock _noPreemptionUnlock; - }; } |