@@ -28,7 +28,7 @@ void Database::Init(Handle<Object> target) {
28
28
NODE_SET_PROTOTYPE_METHOD (t, " serialize" , Serialize);
29
29
NODE_SET_PROTOTYPE_METHOD (t, " parallelize" , Parallelize);
30
30
NODE_SET_PROTOTYPE_METHOD (t, " configure" , Configure);
31
- NODE_SET_PROTOTYPE_METHOD (t, " registerFunction " , RegisterFunction );
31
+ NODE_SET_PROTOTYPE_METHOD (t, " loadEnvironment " , RegisterFunctions );
32
32
33
33
NODE_SET_GETTER (t, " open" , OpenGetter);
34
34
@@ -361,15 +361,12 @@ NAN_METHOD(Database::Configure) {
361
361
NanReturnValue (args.This ());
362
362
}
363
363
364
- NAN_METHOD (Database::RegisterFunction ) {
364
+ NAN_METHOD (Database::RegisterFunctions ) {
365
365
NanScope ();
366
366
Database* db = ObjectWrap::Unwrap<Database>(args.This ());
367
367
368
- REQUIRE_ARGUMENTS (2 );
369
- REQUIRE_ARGUMENT_STRING (0 , functionName);
370
- REQUIRE_ARGUMENT_FUNCTION (1 , callback);
371
-
372
- std::string str = " (" + std::string (*String::Utf8Value (callback->ToString ())) + " )" ;
368
+ REQUIRE_ARGUMENTS (1 );
369
+ REQUIRE_ARGUMENT_STRING (0 , module );
373
370
374
371
Isolate *isolate = v8::Isolate::New ();
375
372
isolate->Enter ();
@@ -379,25 +376,32 @@ NAN_METHOD(Database::RegisterFunction) {
379
376
HandleScope handle_scope (isolate);
380
377
Local<Context> context = Context::New (isolate);
381
378
Context::Scope context_scope (context);
379
+ Environment *env = CreateEnvironment (isolate, uv_default_loop (), context,
380
+ 2 , (const char *[]){ " node" , *module },
381
+ 0 , (const char *[]){});
382
+ LoadEnvironment (env);
382
383
383
384
Local<Object> global = NanGetCurrentContext ()->Global ();
384
- Local<Function> eval = Local<Function>::Cast (global->Get (NanNew<String>(" eval" )));
385
-
386
- // Local<String> str = String::Concat(String::Concat(NanNew<String>("("), callback->ToString()), NanNew<String>(")"));
387
- Local<Value> argv[] = { NanNew<String>(str.c_str (), str.length ()) };
388
- // Local<Function> function = Local<Function>::Cast(TRY_CATCH_CALL(global, eval, 1, argv));
389
- Local<Function> function = Local<Function>::Cast (eval->Call (global, 1 , argv));
390
-
391
- FunctionEnvironment *fn = new FunctionEnvironment (isolate, *functionName, function);
392
- sqlite3_create_function (
393
- db->_handle ,
394
- *functionName,
395
- -1 , // arbitrary number of args
396
- SQLITE_UTF8 | SQLITE_DETERMINISTIC,
397
- fn,
398
- FunctionIsolate,
399
- NULL ,
400
- NULL );
385
+ Local<Object> process = Local<Object>::Cast (global->Get (NanNew<String>(" process" )));
386
+ Local<Object> mainModule = Local<Object>::Cast (process->Get (NanNew<String>(" mainModule" )));
387
+ Local<Object> exports = Local<Object>::Cast (mainModule->Get (NanNew<String>(" exports" )));
388
+ Local<Array> keys = exports->GetOwnPropertyNames ();
389
+ int length = keys->Length ();
390
+ for (int i = 0 ; i < length; i++) {
391
+ Local<Function> function = Local<Function>::Cast (exports->Get (keys->Get (i)));
392
+ String::Utf8Value functionName (keys->Get (i)->ToString ());
393
+
394
+ FunctionEnvironment *fn = new FunctionEnvironment (isolate, *functionName, function);
395
+ sqlite3_create_function (
396
+ db->_handle ,
397
+ *functionName,
398
+ -1 , // arbitrary number of args
399
+ SQLITE_UTF8 | SQLITE_DETERMINISTIC,
400
+ fn,
401
+ FunctionIsolate,
402
+ NULL ,
403
+ NULL );
404
+ }
401
405
}
402
406
isolate->Exit ();
403
407
@@ -461,7 +465,7 @@ void Database::FunctionExecute(FunctionEnvironment *fn, sqlite3_context *context
461
465
}
462
466
463
467
TryCatch trycatch;
464
- Local<Value> result = cb->Call (NanGetCurrentContext ()-> Global ( ), argc, argv.data ());
468
+ Local<Value> result = cb->Call (NanNew ( NanUndefined () ), argc, argv.data ());
465
469
466
470
// process the result
467
471
if (trycatch.HasCaught ()) {
0 commit comments