0
0
mirror of https://github.com/mongodb/mongo.git synced 2024-12-01 09:32:32 +01:00
mongodb/db/javajs.h

208 lines
5.7 KiB
C
Raw Normal View History

2008-08-12 16:30:27 +02:00
// javajs.h
2008-03-20 01:56:45 +01:00
/**
* Copyright (C) 2008 10gen Inc.
2008-12-29 02:28:49 +01:00
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
2008-12-29 02:28:49 +01:00
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
2008-12-29 02:28:49 +01:00
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
2008-08-12 16:30:27 +02:00
/* this file contains code to call into java (into the 10gen sandbox) from inside the database */
2008-03-20 01:56:45 +01:00
#pragma once
#include "../stdafx.h"
#define J_USE_OBJ
2008-03-23 10:06:02 +01:00
#include <jni.h>
#include <boost/thread/tss.hpp>
#include <errno.h>
2008-03-20 01:56:45 +01:00
#include <sys/types.h>
2008-03-23 10:06:02 +01:00
2008-03-20 01:56:45 +01:00
#if !defined(_WIN32)
#include <dirent.h>
#endif
2008-03-23 10:06:02 +01:00
#include "jsobj.h"
2008-03-20 01:56:45 +01:00
2009-01-14 23:09:51 +01:00
namespace mongo {
void jasserted(const char *msg, const char *file, unsigned line);
2008-03-20 01:56:45 +01:00
#define jassert(_Expression) if ( ! ( _Expression ) ){ jasserted(#_Expression, __FILE__, __LINE__); }
int javajstest();
2008-03-20 01:56:45 +01:00
const char * findEd();
const char * findEd(const char *);
const string findJars();
2008-03-20 01:56:45 +01:00
class BSONObj;
2008-03-20 01:56:45 +01:00
class JavaJSImpl {
public:
2009-02-03 05:47:14 +01:00
JavaJSImpl(const char * = 0);
~JavaJSImpl();
2008-12-29 02:28:49 +01:00
jlong scopeCreate();
int scopeInit( jlong id , BSONObj * obj );
int scopeSetThis( jlong id , BSONObj * obj );
jboolean scopeReset( jlong id );
void scopeFree( jlong id );
2008-12-29 02:28:49 +01:00
double scopeGetNumber( jlong id , const char * field );
string scopeGetString( jlong id , const char * field );
jboolean scopeGetBoolean( jlong id , const char * field );
BSONObj scopeGetObject( jlong id , const char * field );
char scopeGetType( jlong id , const char * field );
2008-12-29 02:28:49 +01:00
int scopeSetNumber( jlong id , const char * field , double val );
int scopeSetString( jlong id , const char * field , const char * val );
int scopeSetObject( jlong id , const char * field , BSONObj * obj );
int scopeSetBoolean( jlong id , const char * field , jboolean val );
2008-12-29 02:28:49 +01:00
jlong functionCreate( const char * code );
2008-12-29 02:28:49 +01:00
/* return values:
public static final int NO_SCOPE = -1;
public static final int NO_FUNCTION = -2;
public static final int INVOKE_ERROR = -3;
public static final int INVOKE_SUCCESS = 0;
*/
int invoke( jlong scope , jlong function );
2008-12-29 02:28:49 +01:00
void printException();
2008-12-29 02:28:49 +01:00
void run( const char * js );
2008-12-29 02:28:49 +01:00
void detach( JNIEnv * env ) {
_jvm->DetachCurrentThread();
}
2008-12-29 02:28:49 +01:00
private:
2008-12-29 02:28:49 +01:00
jobject create( const char * name ) {
jclass c = findClass( name );
if ( ! c )
return 0;
2008-12-29 02:28:49 +01:00
jmethodID cons = _getEnv()->GetMethodID( c , "<init>" , "()V" );
if ( ! cons )
return 0;
2008-12-29 02:28:49 +01:00
return _getEnv()->NewObject( c , cons );
}
2008-12-29 02:28:49 +01:00
jclass findClass( const char * name ) {
return _getEnv()->FindClass( name );
}
2008-12-29 02:28:49 +01:00
private:
2008-12-29 02:28:49 +01:00
JNIEnv * _getEnv();
2008-12-29 02:28:49 +01:00
JavaVM * _jvm;
JNIEnv * _mainEnv;
JavaVMInitArgs * _vmArgs;
2008-12-29 02:28:49 +01:00
boost::thread_specific_ptr<JNIEnv> * _envs;
2008-12-29 02:28:49 +01:00
jclass _dbhook;
jclass _dbjni;
2008-12-29 02:28:49 +01:00
jmethodID _scopeCreate;
jmethodID _scopeInit;
jmethodID _scopeSetThis;
jmethodID _scopeReset;
jmethodID _scopeFree;
2008-12-29 02:28:49 +01:00
jmethodID _scopeGetNumber;
jmethodID _scopeGetString;
jmethodID _scopeGetObject;
jmethodID _scopeGetBoolean;
jmethodID _scopeGuessObjectSize;
jmethodID _scopeGetType;
2008-12-29 02:28:49 +01:00
jmethodID _scopeSetNumber;
jmethodID _scopeSetString;
jmethodID _scopeSetObject;
jmethodID _scopeSetBoolean;
2008-12-29 02:28:49 +01:00
jmethodID _functionCreate;
2008-12-29 02:28:49 +01:00
jmethodID _invoke;
2008-03-20 01:56:45 +01:00
};
2008-03-20 01:56:45 +01:00
extern JavaJSImpl *JavaJS;
2008-03-21 23:21:22 +01:00
// a javascript "scope"
class Scope {
public:
Scope() {
s = JavaJS->scopeCreate();
}
~Scope() {
JavaJS->scopeFree(s);
s = 0;
}
void reset() {
JavaJS->scopeReset(s);
}
void init( const char * data ) {
BSONObj o( data , 0 );
JavaJS->scopeInit( s , & o );
}
double getNumber(const char *field) {
return JavaJS->scopeGetNumber(s,field);
}
string getString(const char *field) {
return JavaJS->scopeGetString(s,field);
}
jboolean getBoolean(const char *field) {
return JavaJS->scopeGetBoolean(s,field);
}
BSONObj getObject(const char *field ) {
return JavaJS->scopeGetObject(s,field);
}
int type(const char *field ) {
return JavaJS->scopeGetType(s,field);
}
void setNumber(const char *field, double val ) {
JavaJS->scopeSetNumber(s,field,val);
}
void setString(const char *field, const char * val ) {
JavaJS->scopeSetString(s,field,val);
}
void setObject(const char *field, BSONObj& obj ) {
JavaJS->scopeSetObject(s,field,&obj);
}
void setBoolean(const char *field, jboolean val ) {
JavaJS->scopeSetBoolean(s,field,val);
}
int invoke(jlong function) {
return JavaJS->invoke(s,function);
}
jlong s;
};
JNIEXPORT void JNICALL java_native_say(JNIEnv *, jclass, jobject outBuffer );
JNIEXPORT jint JNICALL java_native_call(JNIEnv *, jclass, jobject outBuffer , jobject inBuffer );
2009-01-14 23:09:51 +01:00
} // namespace mongo