summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDwight <dmerriman@gmail.com>2008-03-21 18:21:22 -0400
committerDwight <dmerriman@gmail.com>2008-03-21 18:21:22 -0400
commitcf6cd6c60b2e604eb0acb68c96b2a027ccdeafe8 (patch)
treec30931f1b260e57107f4685e4d263092631085c0
parentf8a960b7a05edee7bf5652e164ea96f976b7d340 (diff)
downloadmongo-cf6cd6c60b2e604eb0acb68c96b2a027ccdeafe8.tar.gz
bad assert
cleanup
-rw-r--r--boost/boost/Debug/BuildLog.htmbin9580 -> 9572 bytes
-rw-r--r--boost/boost/Debug/boost.libbin2633866 -> 2634390 bytes
-rw-r--r--boost/boost/Debug/vc90.idbbin1829888 -> 1829888 bytes
-rw-r--r--boost/boost/Debug/vc90.pdbbin552960 -> 552960 bytes
-rw-r--r--db/db.cpp2
-rw-r--r--db/javajs.cpp65
-rw-r--r--db/javajs.h46
-rw-r--r--db/jsobj.cpp18
-rw-r--r--db/jsobj.h20
-rw-r--r--db/query.cpp29
10 files changed, 110 insertions, 70 deletions
diff --git a/boost/boost/Debug/BuildLog.htm b/boost/boost/Debug/BuildLog.htm
index 1869886f77c..3750eec4137 100644
--- a/boost/boost/Debug/BuildLog.htm
+++ b/boost/boost/Debug/BuildLog.htm
Binary files differ
diff --git a/boost/boost/Debug/boost.lib b/boost/boost/Debug/boost.lib
index 7e840cddf6e..bddb299d593 100644
--- a/boost/boost/Debug/boost.lib
+++ b/boost/boost/Debug/boost.lib
Binary files differ
diff --git a/boost/boost/Debug/vc90.idb b/boost/boost/Debug/vc90.idb
index 82ea821ae3d..5462e96f0ce 100644
--- a/boost/boost/Debug/vc90.idb
+++ b/boost/boost/Debug/vc90.idb
Binary files differ
diff --git a/boost/boost/Debug/vc90.pdb b/boost/boost/Debug/vc90.pdb
index b65afb9eb29..5ea9dba1f61 100644
--- a/boost/boost/Debug/vc90.pdb
+++ b/boost/boost/Debug/vc90.pdb
Binary files differ
diff --git a/db/db.cpp b/db/db.cpp
index 90a2b378c78..b265af79685 100644
--- a/db/db.cpp
+++ b/db/db.cpp
@@ -269,7 +269,7 @@ public:
};
void listen(int port) {
- cout << "db version: 100 mar2008 profiling" << endl;
+ cout << "db version: 101 mar2008 where" << endl;
pdfileInit();
testTheDb();
cout << curTimeMillis() % 10000 << " waiting for connections...\n" << endl;
diff --git a/db/javajs.cpp b/db/javajs.cpp
index 0722999dc42..3e3cc50121e 100644
--- a/db/javajs.cpp
+++ b/db/javajs.cpp
@@ -72,8 +72,6 @@ JavaJSImpl::JavaJSImpl(){
}
#endif
- cout << "using classpath: " << q << endl;
-
JavaVMOption * options = new JavaVMOption[3];
options[0].optionString = q;
options[1].optionString = "-Djava.awt.headless=true";
@@ -87,18 +85,23 @@ JavaJSImpl::JavaJSImpl(){
cerr << "Creating JVM" << endl;
jint res = JNI_CreateJavaVM( &_jvm, (void**)&_env, vm_args);
+
+ if( res ) {
+ cout << "using classpath: " << q << endl;
+ cerr
+ << "res : " << res << " "
+ << "_jvm : " << _jvm << " "
+ << "_env : " << _env << " "
+ << endl;
+ }
+
jassert( res == 0 );
jassert( _jvm > 0 );
- jassert( _env > 0 );
-
- cerr
- << "res : " << res << " "
- << "_jvm : " << _jvm << " "
- << "_env : " << _env << " "
- << endl;
-
+ jassert( _env > 0 );
_dbhook = findClass( "ed/js/DBHook" );
+ if( _dbhook == 0 )
+ cout << "using classpath: " << q << endl;
jassert( _dbhook );
_scopeCreate = _env->GetStaticMethodID( _dbhook , "scopeCreate" , "()J" );
@@ -164,16 +167,15 @@ void JavaJSImpl::scopeFree( jlong id ){
// scope setters
-int JavaJSImpl::scopeSetNumber( jlong id , char * field , double val ){
+int JavaJSImpl::scopeSetNumber( jlong id , const char * field , double val ){
return _env->CallStaticBooleanMethod( _dbhook , _scopeSetNumber , id , _env->NewStringUTF( field ) , val );
}
-int JavaJSImpl::scopeSetString( jlong id , char * field , char * val ){
+int JavaJSImpl::scopeSetString( jlong id , const char * field , char * val ){
return _env->CallStaticBooleanMethod( _dbhook , _scopeSetString , id , _env->NewStringUTF( field ) , _env->NewStringUTF( val ) );
}
-#ifdef J_USE_OBJ
-int JavaJSImpl::scopeSetObject( jlong id , char * field , JSObj * obj ){
+int JavaJSImpl::scopeSetObject( jlong id , const char * field , JSObj * obj ){
jobject bb = 0;
if ( obj ){
//cout << "from c : " << obj->toString() << endl;
@@ -183,30 +185,27 @@ int JavaJSImpl::scopeSetObject( jlong id , char * field , JSObj * obj ){
return _env->CallStaticBooleanMethod( _dbhook , _scopeSetObject , id , _env->NewStringUTF( field ) , bb );
}
-#endif
// scope getters
-double JavaJSImpl::scopeGetNumber( jlong id , char * field ){
+double JavaJSImpl::scopeGetNumber( jlong id , const char * field ){
return _env->CallStaticDoubleMethod( _dbhook , _scopeGetNumber , id , _env->NewStringUTF( field ) );
}
-char * JavaJSImpl::scopeGetString( jlong id , char * field ){
+string JavaJSImpl::scopeGetString( jlong id , const char * field ) {
jstring s = (jstring)_env->CallStaticObjectMethod( _dbhook , _scopeGetString , id , _env->NewStringUTF( field ) );
if ( ! s )
- return 0;
+ return "";
const char * c = _env->GetStringUTFChars( s , 0 );
- char * buf = new char[ strlen(c) + 1 ];
- strcpy( buf , c );
+ string retStr(c);
_env->ReleaseStringUTFChars( s , c );
-
- return buf;
+ return retStr;
}
#ifdef J_USE_OBJ
-JSObj * JavaJSImpl::scopeGetObject( jlong id , char * field ){
-
+JSObj JavaJSImpl::scopeGetObject( jlong id , const char * field )
+{
int guess = _env->CallStaticIntMethod( _dbhook , _scopeGuessObjectSize , id , _env->NewStringUTF( field ) );
char * buf = (char *) malloc(guess);
@@ -217,10 +216,8 @@ JSObj * JavaJSImpl::scopeGetObject( jlong id , char * field ){
//cout << "len : " << len << endl;
assert( len > 0 && len < guess );
- JSObj * obj = new JSObj( buf , true );
- assert( obj->objsize() <= guess );
- //cout << "going to print" << endl;
- //cout << obj->toString() << endl;
+ JSObj obj(buf, true);
+ assert( obj.objsize() <= guess );
return obj;
}
#endif
@@ -270,7 +267,7 @@ void jasserted(const char *msg, const char *file, unsigned line) {
char * findEd(){
#if defined(_WIN32)
- return "c:/l/ed/ed";
+ return "c:/l/ed";
#else
static list<char*> possibleEdDirs;
@@ -338,15 +335,15 @@ JavaJS.run("print(5);");
if ( testObject ){
if ( debug ) cout << "going to get object" << endl;
- JSObj * obj = JavaJS.scopeGetObject( scope , "abc" );
+ JSObj obj = JavaJS.scopeGetObject( scope , "abc" );
if ( debug ) cout << "done gettting object" << endl;
- if ( obj && debug ){
- cout << "obj : " << obj->toString() << endl;
+ if ( debug ){
+ cout << "obj : " << obj.toString() << endl;
}
if ( debug ) cout << "func4 start" << endl;
- JavaJS.scopeSetObject( scope , "obj" , obj );
+ JavaJS.scopeSetObject( scope , "obj" , &obj );
if ( debug ) cout << "\t here 1" << endl;
jlong func4 = JavaJS.functionCreate( "print( tojson( obj ) );" );
if ( debug ) cout << "\t here 2" << endl;
@@ -354,7 +351,7 @@ JavaJS.run("print(5);");
if ( debug ) cout << "func4 end" << endl;
if ( debug ) cout << "func5 start" << endl;
- jassert( JavaJS.scopeSetObject( scope , "c" , obj ) );
+ jassert( JavaJS.scopeSetObject( scope , "c" , &obj ) );
jlong func5 = JavaJS.functionCreate( "print( \"setObject : 517 == \" + c.foo );" );
jassert( func5 );
jassert( ! JavaJS.invoke( scope , func5 ) );
diff --git a/db/javajs.h b/db/javajs.h
index a4ed39358f5..b2cd0a2513c 100644
--- a/db/javajs.h
+++ b/db/javajs.h
@@ -9,6 +9,8 @@
#pragma pack()
#include <jni.h>
+#include "jsobj.h"
+
#include <sys/types.h>
#if !defined(_WIN32)
#include <dirent.h>
@@ -33,25 +35,20 @@ class JavaJSImpl {
jboolean scopeReset( jlong id );
void scopeFree( jlong id );
- double scopeGetNumber( jlong id , char * field );
- char * scopeGetString( jlong id , char * field );
- jboolean scopeGetBoolean( jlong id , char * field ){
+ double scopeGetNumber( jlong id , const char * field );
+ string scopeGetString( jlong id , const char * field );
+ jboolean scopeGetBoolean( jlong id , const char * field ){
return _env->CallStaticBooleanMethod( _dbhook , _scopeGetBoolean , id , _env->NewStringUTF( field ) );
}
-#ifdef J_USE_OBJ
- JSObj * scopeGetObject( jlong id , char * field );
-#endif
- char scopeGetType( jlong id , char * field ){
+ JSObj scopeGetObject( jlong id , const char * field );
+ char scopeGetType( jlong id , const char * field ){
return _env->CallStaticByteMethod( _dbhook , _scopeGetType , id , _env->NewStringUTF( field ) );
}
-
- int scopeSetNumber( jlong id , char * field , double val );
- int scopeSetString( jlong id , char * field , char * val );
-#ifdef J_USE_OBJ
- int scopeSetObject( jlong id , char * field , JSObj * obj );
-#endif
- int scopeSetBoolean( jlong id , char * field , jboolean val ){
+ int scopeSetNumber( jlong id , const char * field , double val );
+ int scopeSetString( jlong id , const char * field , char * val );
+ int scopeSetObject( jlong id , const char * field , JSObj * obj );
+ int scopeSetBoolean( jlong id , const char * field , jboolean val ) {
return _env->CallStaticBooleanMethod( _dbhook , _scopeSetNumber , id , _env->NewStringUTF( field ) , val );
}
@@ -117,3 +114,24 @@ class JavaJSImpl {
};
extern JavaJSImpl *JavaJS;
+
+// a javascript "scope"
+class Scope {
+public:
+ Scope() { s = JavaJS->scopeCreate(); }
+ ~Scope() { JavaJS->scopeFree(s); s = 0; }
+ void reset() { JavaJS->scopeReset(s); }
+
+ 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); }
+ JSObj scopeGetObject(const char *field ) { return JavaJS->scopeGetObject(s,field); }
+
+ void setNumber(const char *field, double val ) { JavaJS->scopeSetNumber(s,field,val); }
+ void setString(const char *field, char * val ) { JavaJS->scopeSetString(s,field,val); }
+ void setObject(const char *field, JSObj& obj ) { JavaJS->scopeSetObject(s,field,&obj); }
+ void setBoolean(const char *field, jboolean val ) { JavaJS->scopeSetBoolean(s,field,val); }
+
+ jlong s;
+};
+
diff --git a/db/jsobj.cpp b/db/jsobj.cpp
index 014982a415d..6078fa4ce4d 100644
--- a/db/jsobj.cpp
+++ b/db/jsobj.cpp
@@ -3,6 +3,22 @@
#include "stdafx.h"
#include "jsobj.h"
#include "../util/goodies.h"
+#include "javajs.h"
+
+class Where {
+public:
+ ~Where() {
+ JavaJS->scopeFree(scope);
+ scope = 0; func = 0;
+ }
+ jlong scope, func;
+};
+
+JSMatcher::~JSMatcher() {
+ for( int i = 0; i < nBuilders; i++ )
+ delete builders[i];
+ delete where;
+}
Element nullElement;
@@ -104,7 +120,7 @@ int Element::size() {
if( !eoo() ) {
const char *next = data + totalSize;
- if( *next < 0 || *next > DBRef ) {
+ if( *next < 0 || *next > JSTypeMax ) {
// bad type.
cout << "*********************************************\n";
cout << "Bad data or size in Element::size()" << endl;
diff --git a/db/jsobj.h b/db/jsobj.h
index 8d36351f905..54de68ac812 100644
--- a/db/jsobj.h
+++ b/db/jsobj.h
@@ -4,7 +4,7 @@
#include "../stdafx.h"
#include "../util/builder.h"
-#include "javajs.h"
+//#include "javajs.h"
#include <set>
@@ -20,7 +20,7 @@ class JSObjBuilder;
*/
enum JSType { EOO = 0, Number=1, String=2, Object=3, Array=4, BinData=5,
Undefined=6, jstOID=7, Bool=8, Date=9 , jstNULL=10, RegEx=11 ,
- DBRef=12, Code=13, MaxKey=127 };
+ DBRef=12, Code=13, JSTypeMax=13, MaxKey=127 };
/* subtypes of BinData.
bdtCustom and above are ones that the JS compiler understands, but are
@@ -357,14 +357,8 @@ public:
~RegexMatcher() { delete re; }
};
-class Where {
-public:
- ~Where() {
- JavaJS->scopeFree(scope);
- scope = 0; func = 0;
- }
- jlong scope, func;
-};
+// SQL where clause equivalent
+class Where;
/* For when a js object is a query pattern.
@@ -393,11 +387,7 @@ public:
JSMatcher(JSObj& pattern);
- ~JSMatcher() {
- for( int i = 0; i < nBuilders; i++ )
- delete builders[i];
- delete where;
- }
+ ~JSMatcher();
bool matches(JSObj& j, bool *deep = 0);
diff --git a/db/query.cpp b/db/query.cpp
index dea2ed5e196..e918260e019 100644
--- a/db/query.cpp
+++ b/db/query.cpp
@@ -9,6 +9,7 @@
#include "introspect.h"
#include "btree.h"
#include "../util/lruishmap.h"
+#include "javajs.h"
//ns->query->DiskLoc
LRUishMap<JSObj,DiskLoc,5> lrutest(123);
@@ -385,6 +386,23 @@ string validateNS(const char *ns, NamespaceDetails *d) {
bool userCreateNS(const char *ns, JSObj& j);
+bool dbEval(JSObj& cmd, JSObjBuilder& result) {
+ Element e = cmd.firstElement();
+ assert( e.type() == Code );
+ const char *code = e.valuestr();
+ if ( ! JavaJS )
+ JavaJS = new JavaJSImpl();
+ Scope s;
+ Element args = cmd.findElement("args");
+ if( args.type() == Object ) {
+ JSObj eo = args.embeddedObject();
+ s.setObject("args", eo);
+ }
+// FINISH...invoke
+ result.append("errmsg", "not implemented");
+ return false;
+}
+
// e.g.
// system.cmd$.find( { queryTraceLevel: 2 } );
//
@@ -401,16 +419,17 @@ inline bool runCommands(const char *ns, JSObj& jsobj, stringstream& ss, BufBuild
bool ok = false;
bool valid = false;
-cout << jsobj.toString() << endl;
+ //cout << jsobj.toString() << endl;
Element e;
-// e = jsobj.findElement("create");
- //if( e.eoo() )
-// e = jsobj.firstElement();
e = jsobj.firstElement();
if( e.eoo() ) goto done;
- if( e.type() == Number ) {
+ if( e.type() == Code ) {
+ valid = true;
+ ok = dbEval(jsobj, anObjBuilderForYa);
+ }
+ else if( e.type() == Number ) {
if( strcmp(e.fieldName(), "profile") == 0 ) {
anObjBuilderForYa.append("was", (double) client->profile);
client->profile = (int) e.number();