2009-04-23 20:28:22 +02:00
|
|
|
// engine.h
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "../stdafx.h"
|
|
|
|
#include "../db/jsobj.h"
|
|
|
|
|
2009-05-05 16:43:54 +02:00
|
|
|
extern const char * jsconcatcode; // TODO: change name to mongoJSCode
|
|
|
|
|
2009-04-23 20:28:22 +02:00
|
|
|
namespace mongo {
|
|
|
|
|
|
|
|
typedef unsigned long long ScriptingFunction;
|
2009-05-04 23:37:02 +02:00
|
|
|
typedef BSONObj (*NativeFunction) ( const BSONObj &args );
|
2009-04-23 20:28:22 +02:00
|
|
|
|
|
|
|
class Scope : boost::noncopyable {
|
|
|
|
public:
|
|
|
|
Scope();
|
|
|
|
virtual ~Scope();
|
|
|
|
|
|
|
|
virtual void reset() = 0;
|
|
|
|
virtual void init( BSONObj * data ) = 0;
|
|
|
|
void init( const char * data ){
|
|
|
|
BSONObj o( data , 0 );
|
|
|
|
init( &o );
|
|
|
|
}
|
|
|
|
|
2009-04-30 16:51:54 +02:00
|
|
|
virtual void localConnect( const char * dbName ) = 0;
|
2009-05-15 22:32:31 +02:00
|
|
|
virtual void externalSetup() = 0;
|
2009-04-23 20:28:22 +02:00
|
|
|
|
|
|
|
virtual double getNumber( const char *field ) = 0;
|
|
|
|
virtual string getString( const char *field ) = 0;
|
|
|
|
virtual bool getBoolean( const char *field ) = 0;
|
|
|
|
virtual BSONObj getObject( const char *field ) = 0;
|
|
|
|
|
|
|
|
virtual int type( const char *field ) = 0;
|
|
|
|
|
|
|
|
virtual void setNumber( const char *field , double val ) = 0;
|
|
|
|
virtual void setString( const char *field , const char * val ) = 0;
|
2009-05-10 04:07:36 +02:00
|
|
|
virtual void setObject( const char *field , const BSONObj& obj , bool readOnly=true ) = 0;
|
2009-04-23 20:28:22 +02:00
|
|
|
virtual void setBoolean( const char *field , bool val ) = 0;
|
|
|
|
virtual void setThis( const BSONObj * obj ) = 0;
|
|
|
|
|
|
|
|
virtual ScriptingFunction createFunction( const char * code ) = 0;
|
2009-05-08 17:02:12 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @return 0 on success
|
|
|
|
*/
|
2009-08-19 17:49:21 +02:00
|
|
|
virtual int invoke( ScriptingFunction func , const BSONObj& args, int timeoutMs = 0 , bool ignoreReturn = false ) = 0;
|
2009-05-24 03:10:37 +02:00
|
|
|
void invokeSafe( ScriptingFunction func , const BSONObj& args, int timeoutMs = 0 ){
|
|
|
|
assert( invoke( func , args , timeoutMs ) == 0 );
|
|
|
|
}
|
2009-05-01 20:34:44 +02:00
|
|
|
virtual string getError() = 0;
|
2009-04-24 22:41:40 +02:00
|
|
|
|
2009-05-19 22:13:24 +02:00
|
|
|
int invoke( const char* code , const BSONObj& args, int timeoutMs = 0 );
|
2009-05-24 03:10:37 +02:00
|
|
|
void invokeSafe( const char* code , const BSONObj& args, int timeoutMs = 0 ){
|
|
|
|
assert( invoke( code , args , timeoutMs ) == 0 );
|
|
|
|
}
|
|
|
|
|
2009-05-19 22:13:24 +02:00
|
|
|
virtual bool exec( const string& code , const string& name , bool printResult , bool reportError , bool assertOnError, int timeoutMs = 0 ) = 0;
|
|
|
|
virtual bool execFile( const string& filename , bool printResult , bool reportError , bool assertOnError, int timeoutMs = 0 );
|
2009-05-13 23:00:02 +02:00
|
|
|
|
2009-05-14 05:15:59 +02:00
|
|
|
virtual void injectNative( const char *field, NativeFunction func ) = 0;
|
2009-05-26 21:36:41 +02:00
|
|
|
|
|
|
|
virtual void gc() = 0;
|
2009-04-23 20:28:22 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
class ScriptEngine : boost::noncopyable {
|
|
|
|
public:
|
|
|
|
ScriptEngine();
|
|
|
|
virtual ~ScriptEngine();
|
|
|
|
|
|
|
|
virtual Scope * createScope() = 0;
|
|
|
|
|
|
|
|
virtual void runTest() = 0;
|
2009-05-27 21:20:09 +02:00
|
|
|
|
|
|
|
virtual bool utf8Ok() const = 0;
|
2009-04-23 20:28:22 +02:00
|
|
|
|
|
|
|
static void setup();
|
2009-08-05 19:14:06 +02:00
|
|
|
|
|
|
|
auto_ptr<Scope> getPooledScope( const string& pool );
|
2009-08-12 16:51:31 +02:00
|
|
|
void threadDone();
|
2009-04-23 20:28:22 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
extern ScriptEngine * globalScriptEngine;
|
|
|
|
}
|