Commit bb15108e by King Koopa

Use NAN for future support.

parent fe69599b
......@@ -8,6 +8,7 @@
"targets": [
{
"target_name": "<(module_name)",
"include_dirs": ["<!(node -e \"require('nan')\")"],
"conditions": [
["sqlite != 'internal'", {
"libraries": [
......
......@@ -35,7 +35,11 @@
"url": "git://github.com/mapbox/node-sqlite3.git"
},
"dependencies": {
"node-pre-gyp": "~0.2.5"
"node-pre-gyp": "~0.2.5",
"nan": "~0.8.0"
},
"devDependencies": {
"set-immediate": "~0.1.1"
},
"bundledDependencies": [
"node-pre-gyp"
......@@ -46,7 +50,7 @@
"scripts": {
"install": "node-pre-gyp install --fallback-to-build",
"pretest": "node test/support/createdb.js",
"test": "mocha -R spec --timeout 200000"
"test": "mocha -R spec --timeout 200000 -s 20000"
},
"licenses": [
{
......
......@@ -7,6 +7,7 @@
#include <queue>
#include <sqlite3.h>
#include "nan.h"
#include "async.h"
using namespace v8;
......@@ -25,7 +26,7 @@ public:
static inline bool HasInstance(Handle<Value> val) {
if (!val->IsObject()) return false;
Local<Object> obj = val->ToObject();
return constructor_template->HasInstance(obj);
return NanPersistentToLocal(constructor_template)->HasInstance(obj);
}
struct Baton {
......@@ -39,7 +40,7 @@ public:
db(db_), status(SQLITE_OK) {
db->Ref();
request.data = this;
callback = Persistent<Function>::New(cb_);
NanAssignPersistent(Function, callback, cb_);
}
virtual ~Baton() {
db->Unref();
......@@ -99,7 +100,7 @@ public:
protected:
Database() : ObjectWrap(),
handle(NULL),
_handle(NULL),
open(false),
locked(false),
pending(0),
......@@ -112,43 +113,43 @@ protected:
~Database() {
RemoveCallbacks();
sqlite3_close(handle);
handle = NULL;
sqlite3_close(_handle);
_handle = NULL;
open = false;
}
static Handle<Value> New(const Arguments& args);
static NAN_METHOD(New);
static void Work_BeginOpen(Baton* baton);
static void Work_Open(uv_work_t* req);
static void Work_AfterOpen(uv_work_t* req);
static Handle<Value> OpenGetter(Local<String> str, const AccessorInfo& accessor);
static NAN_GETTER(OpenGetter);
void Schedule(Work_Callback callback, Baton* baton, bool exclusive = false);
void Process();
static Handle<Value> Exec(const Arguments& args);
static NAN_METHOD(Exec);
static void Work_BeginExec(Baton* baton);
static void Work_Exec(uv_work_t* req);
static void Work_AfterExec(uv_work_t* req);
static Handle<Value> Wait(const Arguments& args);
static NAN_METHOD(Wait);
static void Work_Wait(Baton* baton);
static Handle<Value> Close(const Arguments& args);
static NAN_METHOD(Close);
static void Work_BeginClose(Baton* baton);
static void Work_Close(uv_work_t* req);
static void Work_AfterClose(uv_work_t* req);
static Handle<Value> LoadExtension(const Arguments& args);
static NAN_METHOD(LoadExtension);
static void Work_BeginLoadExtension(Baton* baton);
static void Work_LoadExtension(uv_work_t* req);
static void Work_AfterLoadExtension(uv_work_t* req);
static Handle<Value> Serialize(const Arguments& args);
static Handle<Value> Parallelize(const Arguments& args);
static NAN_METHOD(Serialize);
static NAN_METHOD(Parallelize);
static Handle<Value> Configure(const Arguments& args);
static NAN_METHOD(Configure);
static void SetBusyTimeout(Baton* baton);
......@@ -167,7 +168,7 @@ protected:
void RemoveCallbacks();
protected:
sqlite3* handle;
sqlite3* _handle;
bool open;
bool locked;
......
......@@ -7,35 +7,27 @@ const char* sqlite_authorizer_string(int type);
#define REQUIRE_ARGUMENTS(n) \
if (args.Length() < (n)) { \
return ThrowException( \
Exception::TypeError(String::New("Expected " #n "arguments")) \
); \
return NanThrowTypeError("Expected " #n "arguments"); \
}
#define REQUIRE_ARGUMENT_EXTERNAL(i, var) \
if (args.Length() <= (i) || !args[i]->IsExternal()) { \
return ThrowException( \
Exception::TypeError(String::New("Argument " #i " invalid")) \
); \
return NanThrowTypeError("Argument " #i " invalid"); \
} \
Local<External> var = Local<External>::Cast(args[i]);
#define REQUIRE_ARGUMENT_FUNCTION(i, var) \
if (args.Length() <= (i) || !args[i]->IsFunction()) { \
return ThrowException(Exception::TypeError( \
String::New("Argument " #i " must be a function")) \
); \
return NanThrowTypeError("Argument " #i " must be a function"); \
} \
Local<Function> var = Local<Function>::Cast(args[i]);
#define REQUIRE_ARGUMENT_STRING(i, var) \
if (args.Length() <= (i) || !args[i]->IsString()) { \
return ThrowException(Exception::TypeError( \
String::New("Argument " #i " must be a string")) \
); \
return NanThrowTypeError("Argument " #i " must be a string"); \
} \
String::Utf8Value var(args[i]->ToString());
......@@ -44,9 +36,7 @@ const char* sqlite_authorizer_string(int type);
Local<Function> var; \
if (args.Length() > i && !args[i]->IsUndefined()) { \
if (!args[i]->IsFunction()) { \
return ThrowException(Exception::TypeError( \
String::New("Argument " #i " must be a function")) \
); \
return NanThrowTypeError("Argument " #i " must be a function"); \
} \
var = Local<Function>::Cast(args[i]); \
}
......@@ -61,9 +51,7 @@ const char* sqlite_authorizer_string(int type);
var = args[i]->Int32Value(); \
} \
else { \
return ThrowException(Exception::TypeError( \
String::New("Argument " #i " must be an integer")) \
); \
return NanThrowTypeError("Argument " #i " must be an integer"); \
}
......@@ -103,8 +91,8 @@ const char* sqlite_authorizer_string(int type);
) \
); \
Local<Object> name ##_obj = name->ToObject(); \
name ##_obj->Set(NODE_PSYMBOL("errno"), Integer::New(errno)); \
name ##_obj->Set(NODE_PSYMBOL("code"), \
name ##_obj->Set(String::NewSymbol("errno"), Integer::New(errno)); \
name ##_obj->Set(String::NewSymbol("code"), \
String::NewSymbol(sqlite_code_string(errno)));
......@@ -122,7 +110,7 @@ const char* sqlite_authorizer_string(int type);
} }
#define WORK_DEFINITION(name) \
static Handle<Value> name(const Arguments& args); \
static NAN_METHOD(name); \
static void Work_Begin##name(Baton* baton); \
static void Work_##name(uv_work_t* req); \
static void Work_After##name(uv_work_t* req);
......@@ -164,4 +152,3 @@ const char* sqlite_authorizer_string(int type);
}
#endif
......@@ -103,4 +103,4 @@ const char* sqlite_authorizer_string(int type) {
}
}
NODE_MODULE(node_sqlite3, RegisterModule);
NODE_MODULE(node_sqlite3, RegisterModule)
......@@ -13,6 +13,7 @@
#include <vector>
#include <sqlite3.h>
#include "nan.h"
using namespace v8;
using namespace node;
......@@ -76,7 +77,7 @@ public:
static Persistent<FunctionTemplate> constructor_template;
static void Init(Handle<Object> target);
static Handle<Value> New(const Arguments& args);
static NAN_METHOD(New);
struct Baton {
uv_work_t request;
......@@ -87,7 +88,7 @@ public:
Baton(Statement* stmt_, Handle<Function> cb_) : stmt(stmt_) {
stmt->Ref();
request.data = this;
callback = Persistent<Function>::New(cb_);
NanAssignPersistent(Function, callback, cb_);
}
virtual ~Baton() {
for (unsigned int i = 0; i < parameters.size(); i++) {
......@@ -183,7 +184,7 @@ public:
Statement(Database* db_) : ObjectWrap(),
db(db_),
handle(NULL),
_handle(NULL),
status(SQLITE_OK),
prepared(false),
locked(true),
......@@ -202,7 +203,7 @@ public:
WORK_DEFINITION(Each);
WORK_DEFINITION(Reset);
static Handle<Value> Finalize(const Arguments& args);
static NAN_METHOD(Finalize);
protected:
static void Work_BeginPrepare(Database::Baton* baton);
......@@ -216,8 +217,8 @@ protected:
void Finalize();
template <class T> inline Values::Field* BindParameter(const Handle<Value> source, T pos);
template <class T> T* Bind(const Arguments& args, int start = 0, int end = -1);
bool Bind(const Parameters & parameters);
template <class T> T* Bind(_NAN_METHOD_ARGS, int start = 0, int end = -1);
bool Bind(const Parameters &parameters);
static void GetRow(Row* row, sqlite3_stmt* stmt);
static Local<Object> RowToJS(Row* row);
......@@ -229,7 +230,7 @@ protected:
protected:
Database* db;
sqlite3_stmt* handle;
sqlite3_stmt* _handle;
int status;
std::string message;
......
require('set-immediate');
var sqlite3 = require('..');
var assert = require('assert');
var helper = require('./support/helper');
......@@ -30,7 +31,7 @@ describe('cache', function() {
var db1, db2;
db1 = new sqlite3.cached.Database(filename, function(err) {
if (err) throw err;
process.nextTick(function() {
setImmediate(function() {
db2 = new sqlite3.cached.Database(filename, function(err) {
done();
......
require('set-immediate');
var sqlite3 = require('..');
var assert = require('assert');
......@@ -31,7 +32,7 @@ describe('profiling', function() {
assert.ok(!create);
db.run("CREATE TABLE foo (id int)", function(err) {
if (err) throw err;
process.nextTick(function() {
setImmediate(function() {
assert.ok(create);
done();
});
......@@ -43,7 +44,7 @@ describe('profiling', function() {
assert.ok(!select);
db.run("SELECT * FROM foo", function(err) {
if (err) throw err;
process.nextTick(function() {
setImmediate(function() {
assert.ok(select);
done();
});
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment