Commit 3806e0cb by Mohamed Akram

Use N-API for async work

parent 4177fb79
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#include "threading.h" #include "threading.h"
#include <node_version.h> #include <node_version.h>
#include <uv.h>
#if defined(NODE_SQLITE3_BOOST_THREADING) #if defined(NODE_SQLITE3_BOOST_THREADING)
#include <boost/thread/mutex.hpp> #include <boost/thread/mutex.hpp>
......
#include <string.h> #include <string.h>
#include <napi.h> #include <napi.h>
#include <uv.h>
#include <node_buffer.h> #include <node_buffer.h>
#include <node_version.h> #include <node_version.h>
...@@ -190,12 +189,16 @@ Backup::Backup(const Napi::CallbackInfo& info) : Napi::ObjectWrap<Backup>(info) ...@@ -190,12 +189,16 @@ Backup::Backup(const Napi::CallbackInfo& info) : Napi::ObjectWrap<Backup>(info)
void Backup::Work_BeginInitialize(Database::Baton* baton) { void Backup::Work_BeginInitialize(Database::Baton* baton) {
assert(baton->db->open); assert(baton->db->open);
baton->db->pending++; baton->db->pending++;
int status = uv_queue_work(uv_default_loop(), Napi::Env env = baton->db->Env();
&baton->request, Work_Initialize, (uv_after_work_cb)Work_AfterInitialize); int status = napi_create_async_work(
env, NULL, Napi::String::New(env, "sqlite3.Backup.Initialize"),
Work_Initialize, Work_AfterInitialize, baton, &baton->request
);
assert(status == 0); assert(status == 0);
napi_queue_async_work(env, baton->request);
} }
void Backup::Work_Initialize(uv_work_t* req) { void Backup::Work_Initialize(napi_env e, void* data) {
BACKUP_INIT(InitializeBaton); BACKUP_INIT(InitializeBaton);
// In case stepping fails, we use a mutex to make sure we get the associated // In case stepping fails, we use a mutex to make sure we get the associated
...@@ -224,7 +227,7 @@ void Backup::Work_Initialize(uv_work_t* req) { ...@@ -224,7 +227,7 @@ void Backup::Work_Initialize(uv_work_t* req) {
sqlite3_mutex_leave(mtx); sqlite3_mutex_leave(mtx);
} }
void Backup::Work_AfterInitialize(uv_work_t* req) { void Backup::Work_AfterInitialize(napi_env e, napi_status status, void* data) {
BACKUP_INIT(InitializeBaton); BACKUP_INIT(InitializeBaton);
Napi::Env env = backup->Env(); Napi::Env env = backup->Env();
...@@ -262,7 +265,7 @@ void Backup::Work_BeginStep(Baton* baton) { ...@@ -262,7 +265,7 @@ void Backup::Work_BeginStep(Baton* baton) {
BACKUP_BEGIN(Step); BACKUP_BEGIN(Step);
} }
void Backup::Work_Step(uv_work_t* req) { void Backup::Work_Step(napi_env e, void* data) {
BACKUP_INIT(StepBaton); BACKUP_INIT(StepBaton);
if (backup->_handle) { if (backup->_handle) {
backup->status = sqlite3_backup_step(backup->_handle, baton->pages); backup->status = sqlite3_backup_step(backup->_handle, baton->pages);
...@@ -286,7 +289,7 @@ void Backup::Work_Step(uv_work_t* req) { ...@@ -286,7 +289,7 @@ void Backup::Work_Step(uv_work_t* req) {
} }
} }
void Backup::Work_AfterStep(uv_work_t* req) { void Backup::Work_AfterStep(napi_env e, napi_status status, void* data) {
BACKUP_INIT(StepBaton); BACKUP_INIT(StepBaton);
Napi::Env env = backup->Env(); Napi::Env env = backup->Env();
...@@ -328,12 +331,12 @@ void Backup::Work_BeginFinish(Baton* baton) { ...@@ -328,12 +331,12 @@ void Backup::Work_BeginFinish(Baton* baton) {
BACKUP_BEGIN(Finish); BACKUP_BEGIN(Finish);
} }
void Backup::Work_Finish(uv_work_t* req) { void Backup::Work_Finish(napi_env e, void* data) {
BACKUP_INIT(Baton); BACKUP_INIT(Baton);
backup->FinishSqlite(); backup->FinishSqlite();
} }
void Backup::Work_AfterFinish(uv_work_t* req) { void Backup::Work_AfterFinish(napi_env e, napi_status status, void* data) {
BACKUP_INIT(Baton); BACKUP_INIT(Baton);
Napi::Env env = backup->Env(); Napi::Env env = backup->Env();
......
...@@ -9,7 +9,6 @@ ...@@ -9,7 +9,6 @@
#include <sqlite3.h> #include <sqlite3.h>
#include <napi.h> #include <napi.h>
#include <uv.h>
using namespace Napi; using namespace Napi;
...@@ -99,13 +98,12 @@ public: ...@@ -99,13 +98,12 @@ public:
static Napi::Object Init(Napi::Env env, Napi::Object exports); static Napi::Object Init(Napi::Env env, Napi::Object exports);
struct Baton { struct Baton {
uv_work_t request; napi_async_work request;
Backup* backup; Backup* backup;
Napi::FunctionReference callback; Napi::FunctionReference callback;
Baton(Backup* backup_, Napi::Function cb_) : backup(backup_) { Baton(Backup* backup_, Napi::Function cb_) : backup(backup_) {
backup->Ref(); backup->Ref();
request.data = this;
callback.Reset(cb_); callback.Reset(cb_);
} }
virtual ~Baton() { virtual ~Baton() {
...@@ -187,8 +185,8 @@ public: ...@@ -187,8 +185,8 @@ public:
protected: protected:
static void Work_BeginInitialize(Database::Baton* baton); static void Work_BeginInitialize(Database::Baton* baton);
static void Work_Initialize(uv_work_t* req); static void Work_Initialize(napi_env env, void* data);
static void Work_AfterInitialize(uv_work_t* req); static void Work_AfterInitialize(napi_env env, napi_status status, void* data);
void Schedule(Work_Callback callback, Baton* baton); void Schedule(Work_Callback callback, Baton* baton);
void Process(); void Process();
......
...@@ -135,13 +135,17 @@ Database::Database(const Napi::CallbackInfo& info) : Napi::ObjectWrap<Database>( ...@@ -135,13 +135,17 @@ Database::Database(const Napi::CallbackInfo& info) : Napi::ObjectWrap<Database>(
} }
void Database::Work_BeginOpen(Baton* baton) { void Database::Work_BeginOpen(Baton* baton) {
int status = uv_queue_work(uv_default_loop(), Napi::Env env = baton->db->Env();
&baton->request, Work_Open, (uv_after_work_cb)Work_AfterOpen); int status = napi_create_async_work(
env, NULL, Napi::String::New(env, "sqlite3.Database.Open"),
Work_Open, Work_AfterOpen, baton, &baton->request
);
assert(status == 0); assert(status == 0);
napi_queue_async_work(env, baton->request);
} }
void Database::Work_Open(uv_work_t* req) { void Database::Work_Open(napi_env e, void* data) {
OpenBaton* baton = static_cast<OpenBaton*>(req->data); OpenBaton* baton = static_cast<OpenBaton*>(data);
Database* db = baton->db; Database* db = baton->db;
baton->status = sqlite3_open_v2( baton->status = sqlite3_open_v2(
...@@ -162,8 +166,9 @@ void Database::Work_Open(uv_work_t* req) { ...@@ -162,8 +166,9 @@ void Database::Work_Open(uv_work_t* req) {
} }
} }
void Database::Work_AfterOpen(uv_work_t* req) { void Database::Work_AfterOpen(napi_env e, napi_status status, void* data) {
OpenBaton* baton = static_cast<OpenBaton*>(req->data); OpenBaton* baton = static_cast<OpenBaton*>(data);
Database* db = baton->db; Database* db = baton->db;
Napi::Env env = db->Env(); Napi::Env env = db->Env();
...@@ -195,6 +200,7 @@ void Database::Work_AfterOpen(uv_work_t* req) { ...@@ -195,6 +200,7 @@ void Database::Work_AfterOpen(uv_work_t* req) {
db->Process(); db->Process();
} }
napi_delete_async_work(e, baton->request);
delete baton; delete baton;
} }
...@@ -224,13 +230,18 @@ void Database::Work_BeginClose(Baton* baton) { ...@@ -224,13 +230,18 @@ void Database::Work_BeginClose(Baton* baton) {
baton->db->RemoveCallbacks(); baton->db->RemoveCallbacks();
baton->db->closing = true; baton->db->closing = true;
int status = uv_queue_work(uv_default_loop(), Napi::Env env = baton->db->Env();
&baton->request, Work_Close, (uv_after_work_cb)Work_AfterClose);
int status = napi_create_async_work(
env, NULL, Napi::String::New(env, "sqlite3.Database.Close"),
Work_Close, Work_AfterClose, baton, &baton->request
);
assert(status == 0); assert(status == 0);
napi_queue_async_work(env, baton->request);
} }
void Database::Work_Close(uv_work_t* req) { void Database::Work_Close(napi_env e, void* data) {
Baton* baton = static_cast<Baton*>(req->data); Baton* baton = static_cast<Baton*>(data);
Database* db = baton->db; Database* db = baton->db;
baton->status = sqlite3_close(db->_handle); baton->status = sqlite3_close(db->_handle);
...@@ -243,8 +254,9 @@ void Database::Work_Close(uv_work_t* req) { ...@@ -243,8 +254,9 @@ void Database::Work_Close(uv_work_t* req) {
} }
} }
void Database::Work_AfterClose(uv_work_t* req) { void Database::Work_AfterClose(napi_env e, napi_status status, void* data) {
Baton* baton = static_cast<Baton*>(req->data); Baton* baton = static_cast<Baton*>(data);
Database* db = baton->db; Database* db = baton->db;
Napi::Env env = db->Env(); Napi::Env env = db->Env();
...@@ -281,6 +293,7 @@ void Database::Work_AfterClose(uv_work_t* req) { ...@@ -281,6 +293,7 @@ void Database::Work_AfterClose(uv_work_t* req) {
db->Process(); db->Process();
} }
napi_delete_async_work(e, baton->request);
delete baton; delete baton;
} }
...@@ -535,13 +548,17 @@ void Database::Work_BeginExec(Baton* baton) { ...@@ -535,13 +548,17 @@ void Database::Work_BeginExec(Baton* baton) {
assert(baton->db->open); assert(baton->db->open);
assert(baton->db->_handle); assert(baton->db->_handle);
assert(baton->db->pending == 0); assert(baton->db->pending == 0);
int status = uv_queue_work(uv_default_loop(), Napi::Env env = baton->db->Env();
&baton->request, Work_Exec, (uv_after_work_cb)Work_AfterExec); int status = napi_create_async_work(
env, NULL, Napi::String::New(env, "sqlite3.Database.Exec"),
Work_Exec, Work_AfterExec, baton, &baton->request
);
assert(status == 0); assert(status == 0);
napi_queue_async_work(env, baton->request);
} }
void Database::Work_Exec(uv_work_t* req) { void Database::Work_Exec(napi_env e, void* data) {
ExecBaton* baton = static_cast<ExecBaton*>(req->data); ExecBaton* baton = static_cast<ExecBaton*>(data);
char* message = NULL; char* message = NULL;
baton->status = sqlite3_exec( baton->status = sqlite3_exec(
...@@ -558,8 +575,9 @@ void Database::Work_Exec(uv_work_t* req) { ...@@ -558,8 +575,9 @@ void Database::Work_Exec(uv_work_t* req) {
} }
} }
void Database::Work_AfterExec(uv_work_t* req) { void Database::Work_AfterExec(napi_env e, napi_status status, void* data) {
ExecBaton* baton = static_cast<ExecBaton*>(req->data); ExecBaton* baton = static_cast<ExecBaton*>(data);
Database* db = baton->db; Database* db = baton->db;
Napi::Env env = db->Env(); Napi::Env env = db->Env();
...@@ -586,6 +604,7 @@ void Database::Work_AfterExec(uv_work_t* req) { ...@@ -586,6 +604,7 @@ void Database::Work_AfterExec(uv_work_t* req) {
db->Process(); db->Process();
napi_delete_async_work(e, baton->request);
delete baton; delete baton;
} }
...@@ -639,13 +658,17 @@ void Database::Work_BeginLoadExtension(Baton* baton) { ...@@ -639,13 +658,17 @@ void Database::Work_BeginLoadExtension(Baton* baton) {
assert(baton->db->open); assert(baton->db->open);
assert(baton->db->_handle); assert(baton->db->_handle);
assert(baton->db->pending == 0); assert(baton->db->pending == 0);
int status = uv_queue_work(uv_default_loop(), Napi::Env env = baton->db->Env();
&baton->request, Work_LoadExtension, reinterpret_cast<uv_after_work_cb>(Work_AfterLoadExtension)); int status = napi_create_async_work(
env, NULL, Napi::String::New(env, "sqlite3.Database.LoadExtension"),
Work_LoadExtension, Work_AfterLoadExtension, baton, &baton->request
);
assert(status == 0); assert(status == 0);
napi_queue_async_work(env, baton->request);
} }
void Database::Work_LoadExtension(uv_work_t* req) { void Database::Work_LoadExtension(napi_env e, void* data) {
LoadExtensionBaton* baton = static_cast<LoadExtensionBaton*>(req->data); LoadExtensionBaton* baton = static_cast<LoadExtensionBaton*>(data);
sqlite3_enable_load_extension(baton->db->_handle, 1); sqlite3_enable_load_extension(baton->db->_handle, 1);
...@@ -665,8 +688,9 @@ void Database::Work_LoadExtension(uv_work_t* req) { ...@@ -665,8 +688,9 @@ void Database::Work_LoadExtension(uv_work_t* req) {
} }
} }
void Database::Work_AfterLoadExtension(uv_work_t* req) { void Database::Work_AfterLoadExtension(napi_env e, napi_status status, void* data) {
LoadExtensionBaton* baton = static_cast<LoadExtensionBaton*>(req->data); LoadExtensionBaton* baton = static_cast<LoadExtensionBaton*>(data);
Database* db = baton->db; Database* db = baton->db;
Napi::Env env = db->Env(); Napi::Env env = db->Env();
...@@ -693,6 +717,7 @@ void Database::Work_AfterLoadExtension(uv_work_t* req) { ...@@ -693,6 +717,7 @@ void Database::Work_AfterLoadExtension(uv_work_t* req) {
db->Process(); db->Process();
napi_delete_async_work(e, baton->request);
delete baton; delete baton;
} }
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
#include <sqlite3.h> #include <sqlite3.h>
#include <napi.h> #include <napi.h>
#include <uv.h>
#include "async.h" #include "async.h"
...@@ -33,7 +32,7 @@ public: ...@@ -33,7 +32,7 @@ public:
} }
struct Baton { struct Baton {
uv_work_t request; napi_async_work request;
Database* db; Database* db;
Napi::FunctionReference callback; Napi::FunctionReference callback;
int status; int status;
...@@ -42,7 +41,6 @@ public: ...@@ -42,7 +41,6 @@ public:
Baton(Database* db_, Napi::Function cb_) : Baton(Database* db_, Napi::Function cb_) :
db(db_), status(SQLITE_OK) { db(db_), status(SQLITE_OK) {
db->Ref(); db->Ref();
request.data = this;
if (!cb_.IsUndefined() && cb_.IsFunction()) { if (!cb_.IsUndefined() && cb_.IsFunction()) {
callback.Reset(cb_, 1); callback.Reset(cb_, 1);
} }
...@@ -127,8 +125,8 @@ public: ...@@ -127,8 +125,8 @@ public:
protected: protected:
static void Work_BeginOpen(Baton* baton); static void Work_BeginOpen(Baton* baton);
static void Work_Open(uv_work_t* req); static void Work_Open(napi_env env, void* data);
static void Work_AfterOpen(uv_work_t* req); static void Work_AfterOpen(napi_env env, napi_status status, void* data);
Napi::Value OpenGetter(const Napi::CallbackInfo& info); Napi::Value OpenGetter(const Napi::CallbackInfo& info);
...@@ -137,21 +135,21 @@ protected: ...@@ -137,21 +135,21 @@ protected:
Napi::Value Exec(const Napi::CallbackInfo& info); Napi::Value Exec(const Napi::CallbackInfo& info);
static void Work_BeginExec(Baton* baton); static void Work_BeginExec(Baton* baton);
static void Work_Exec(uv_work_t* req); static void Work_Exec(napi_env env, void* data);
static void Work_AfterExec(uv_work_t* req); static void Work_AfterExec(napi_env env, napi_status status, void* data);
Napi::Value Wait(const Napi::CallbackInfo& info); Napi::Value Wait(const Napi::CallbackInfo& info);
static void Work_Wait(Baton* baton); static void Work_Wait(Baton* baton);
Napi::Value Close(const Napi::CallbackInfo& info); Napi::Value Close(const Napi::CallbackInfo& info);
static void Work_BeginClose(Baton* baton); static void Work_BeginClose(Baton* baton);
static void Work_Close(uv_work_t* req); static void Work_Close(napi_env env, void* data);
static void Work_AfterClose(uv_work_t* req); static void Work_AfterClose(napi_env env, napi_status status, void* data);
Napi::Value LoadExtension(const Napi::CallbackInfo& info); Napi::Value LoadExtension(const Napi::CallbackInfo& info);
static void Work_BeginLoadExtension(Baton* baton); static void Work_BeginLoadExtension(Baton* baton);
static void Work_LoadExtension(uv_work_t* req); static void Work_LoadExtension(napi_env env, void* data);
static void Work_AfterLoadExtension(uv_work_t* req); static void Work_AfterLoadExtension(napi_env env, napi_status status, void* data);
Napi::Value Serialize(const Napi::CallbackInfo& info); Napi::Value Serialize(const Napi::CallbackInfo& info);
Napi::Value Parallelize(const Napi::CallbackInfo& info); Napi::Value Parallelize(const Napi::CallbackInfo& info);
......
...@@ -124,8 +124,8 @@ inline bool OtherIsInt(Napi::Number source) { ...@@ -124,8 +124,8 @@ inline bool OtherIsInt(Napi::Number source) {
#define WORK_DEFINITION(name) \ #define WORK_DEFINITION(name) \
Napi::Value name(const Napi::CallbackInfo& info); \ Napi::Value name(const Napi::CallbackInfo& info); \
static void Work_Begin##name(Baton* baton); \ static void Work_Begin##name(Baton* baton); \
static void Work_##name(uv_work_t* req); \ static void Work_##name(napi_env env, void* data); \
static void Work_After##name(uv_work_t* req); static void Work_After##name(napi_env env, napi_status status, void* data);
#define STATEMENT_BEGIN(type) \ #define STATEMENT_BEGIN(type) \
assert(baton); \ assert(baton); \
...@@ -135,13 +135,16 @@ inline bool OtherIsInt(Napi::Number source) { ...@@ -135,13 +135,16 @@ inline bool OtherIsInt(Napi::Number source) {
assert(baton->stmt->prepared); \ assert(baton->stmt->prepared); \
baton->stmt->locked = true; \ baton->stmt->locked = true; \
baton->stmt->db->pending++; \ baton->stmt->db->pending++; \
int status = uv_queue_work(uv_default_loop(), \ Napi::Env env = baton->stmt->Env(); \
&baton->request, \ int status = napi_create_async_work( \
Work_##type, reinterpret_cast<uv_after_work_cb>(Work_After##type)); \ env, NULL, Napi::String::New(env, "sqlite3.Statement."#type), \
assert(status == 0); Work_##type, Work_After##type, baton, &baton->request \
); \
assert(status == 0); \
napi_queue_async_work(env, baton->request);
#define STATEMENT_INIT(type) \ #define STATEMENT_INIT(type) \
type* baton = static_cast<type*>(req->data); \ type* baton = static_cast<type*>(data); \
Statement* stmt = baton->stmt; Statement* stmt = baton->stmt;
#define STATEMENT_END() \ #define STATEMENT_END() \
...@@ -151,6 +154,7 @@ inline bool OtherIsInt(Napi::Number source) { ...@@ -151,6 +154,7 @@ inline bool OtherIsInt(Napi::Number source) {
stmt->db->pending--; \ stmt->db->pending--; \
stmt->Process(); \ stmt->Process(); \
stmt->db->Process(); \ stmt->db->Process(); \
napi_delete_async_work(e, baton->request); \
delete baton; delete baton;
#define BACKUP_BEGIN(type) \ #define BACKUP_BEGIN(type) \
...@@ -161,13 +165,16 @@ inline bool OtherIsInt(Napi::Number source) { ...@@ -161,13 +165,16 @@ inline bool OtherIsInt(Napi::Number source) {
assert(baton->backup->inited); \ assert(baton->backup->inited); \
baton->backup->locked = true; \ baton->backup->locked = true; \
baton->backup->db->pending++; \ baton->backup->db->pending++; \
int status = uv_queue_work(uv_default_loop(), \ Napi::Env env = baton->backup->Env(); \
&baton->request, \ int status = napi_create_async_work( \
Work_##type, reinterpret_cast<uv_after_work_cb>(Work_After##type)); \ env, NULL, Napi::String::New(env, "sqlite3.Backup."#type), \
assert(status == 0); Work_##type, Work_After##type, baton, &baton->request \
); \
assert(status == 0); \
napi_queue_async_work(env, baton->request);
#define BACKUP_INIT(type) \ #define BACKUP_INIT(type) \
type* baton = static_cast<type*>(req->data); \ type* baton = static_cast<type*>(data); \
Backup* backup = baton->backup; Backup* backup = baton->backup;
#define BACKUP_END() \ #define BACKUP_END() \
...@@ -177,6 +184,7 @@ inline bool OtherIsInt(Napi::Number source) { ...@@ -177,6 +184,7 @@ inline bool OtherIsInt(Napi::Number source) {
backup->db->pending--; \ backup->db->pending--; \
backup->Process(); \ backup->Process(); \
backup->db->Process(); \ backup->db->Process(); \
napi_delete_async_work(e, baton->request); \
delete baton; delete baton;
#define DELETE_FIELD(field) \ #define DELETE_FIELD(field) \
......
...@@ -139,12 +139,16 @@ Statement::Statement(const Napi::CallbackInfo& info) : Napi::ObjectWrap<Statemen ...@@ -139,12 +139,16 @@ Statement::Statement(const Napi::CallbackInfo& info) : Napi::ObjectWrap<Statemen
void Statement::Work_BeginPrepare(Database::Baton* baton) { void Statement::Work_BeginPrepare(Database::Baton* baton) {
assert(baton->db->open); assert(baton->db->open);
baton->db->pending++; baton->db->pending++;
int status = uv_queue_work(uv_default_loop(), Napi::Env env = baton->db->Env();
&baton->request, Work_Prepare, (uv_after_work_cb)Work_AfterPrepare); int status = napi_create_async_work(
env, NULL, Napi::String::New(env, "sqlite3.Statement.Prepare"),
Work_Prepare, Work_AfterPrepare, baton, &baton->request
);
assert(status == 0); assert(status == 0);
napi_queue_async_work(env, baton->request);
} }
void Statement::Work_Prepare(uv_work_t* req) { void Statement::Work_Prepare(napi_env e, void* data) {
STATEMENT_INIT(PrepareBaton); STATEMENT_INIT(PrepareBaton);
// In case preparing fails, we use a mutex to make sure we get the associated // In case preparing fails, we use a mutex to make sure we get the associated
...@@ -168,7 +172,7 @@ void Statement::Work_Prepare(uv_work_t* req) { ...@@ -168,7 +172,7 @@ void Statement::Work_Prepare(uv_work_t* req) {
sqlite3_mutex_leave(mtx); sqlite3_mutex_leave(mtx);
} }
void Statement::Work_AfterPrepare(uv_work_t* req) { void Statement::Work_AfterPrepare(napi_env e, napi_status status, void* data) {
STATEMENT_INIT(PrepareBaton); STATEMENT_INIT(PrepareBaton);
Napi::Env env = stmt->Env(); Napi::Env env = stmt->Env();
...@@ -360,7 +364,7 @@ void Statement::Work_BeginBind(Baton* baton) { ...@@ -360,7 +364,7 @@ void Statement::Work_BeginBind(Baton* baton) {
STATEMENT_BEGIN(Bind); STATEMENT_BEGIN(Bind);
} }
void Statement::Work_Bind(uv_work_t* req) { void Statement::Work_Bind(napi_env e, void* data) {
STATEMENT_INIT(Baton); STATEMENT_INIT(Baton);
sqlite3_mutex* mtx = sqlite3_db_mutex(stmt->db->_handle); sqlite3_mutex* mtx = sqlite3_db_mutex(stmt->db->_handle);
...@@ -369,7 +373,7 @@ void Statement::Work_Bind(uv_work_t* req) { ...@@ -369,7 +373,7 @@ void Statement::Work_Bind(uv_work_t* req) {
sqlite3_mutex_leave(mtx); sqlite3_mutex_leave(mtx);
} }
void Statement::Work_AfterBind(uv_work_t* req) { void Statement::Work_AfterBind(napi_env e, napi_status status, void* data) {
STATEMENT_INIT(Baton); STATEMENT_INIT(Baton);
Napi::Env env = stmt->Env(); Napi::Env env = stmt->Env();
...@@ -411,7 +415,7 @@ void Statement::Work_BeginGet(Baton* baton) { ...@@ -411,7 +415,7 @@ void Statement::Work_BeginGet(Baton* baton) {
STATEMENT_BEGIN(Get); STATEMENT_BEGIN(Get);
} }
void Statement::Work_Get(uv_work_t* req) { void Statement::Work_Get(napi_env e, void* data) {
STATEMENT_INIT(RowBaton); STATEMENT_INIT(RowBaton);
if (stmt->status != SQLITE_DONE || baton->parameters.size()) { if (stmt->status != SQLITE_DONE || baton->parameters.size()) {
...@@ -435,7 +439,7 @@ void Statement::Work_Get(uv_work_t* req) { ...@@ -435,7 +439,7 @@ void Statement::Work_Get(uv_work_t* req) {
} }
} }
void Statement::Work_AfterGet(uv_work_t* req) { void Statement::Work_AfterGet(napi_env e, napi_status status, void* data) {
STATEMENT_INIT(RowBaton); STATEMENT_INIT(RowBaton);
Napi::Env env = stmt->Env(); Napi::Env env = stmt->Env();
...@@ -482,7 +486,7 @@ void Statement::Work_BeginRun(Baton* baton) { ...@@ -482,7 +486,7 @@ void Statement::Work_BeginRun(Baton* baton) {
STATEMENT_BEGIN(Run); STATEMENT_BEGIN(Run);
} }
void Statement::Work_Run(uv_work_t* req) { void Statement::Work_Run(napi_env e, void* data) {
STATEMENT_INIT(RunBaton); STATEMENT_INIT(RunBaton);
sqlite3_mutex* mtx = sqlite3_db_mutex(stmt->db->_handle); sqlite3_mutex* mtx = sqlite3_db_mutex(stmt->db->_handle);
...@@ -508,7 +512,7 @@ void Statement::Work_Run(uv_work_t* req) { ...@@ -508,7 +512,7 @@ void Statement::Work_Run(uv_work_t* req) {
sqlite3_mutex_leave(mtx); sqlite3_mutex_leave(mtx);
} }
void Statement::Work_AfterRun(uv_work_t* req) { void Statement::Work_AfterRun(napi_env e, napi_status status, void* data) {
STATEMENT_INIT(RunBaton); STATEMENT_INIT(RunBaton);
Napi::Env env = stmt->Env(); Napi::Env env = stmt->Env();
...@@ -551,7 +555,7 @@ void Statement::Work_BeginAll(Baton* baton) { ...@@ -551,7 +555,7 @@ void Statement::Work_BeginAll(Baton* baton) {
STATEMENT_BEGIN(All); STATEMENT_BEGIN(All);
} }
void Statement::Work_All(uv_work_t* req) { void Statement::Work_All(napi_env e, void* data) {
STATEMENT_INIT(RowsBaton); STATEMENT_INIT(RowsBaton);
sqlite3_mutex* mtx = sqlite3_db_mutex(stmt->db->_handle); sqlite3_mutex* mtx = sqlite3_db_mutex(stmt->db->_handle);
...@@ -577,7 +581,7 @@ void Statement::Work_All(uv_work_t* req) { ...@@ -577,7 +581,7 @@ void Statement::Work_All(uv_work_t* req) {
sqlite3_mutex_leave(mtx); sqlite3_mutex_leave(mtx);
} }
void Statement::Work_AfterAll(uv_work_t* req) { void Statement::Work_AfterAll(napi_env e, napi_status status, void* data) {
STATEMENT_INIT(RowsBaton); STATEMENT_INIT(RowsBaton);
Napi::Env env = stmt->Env(); Napi::Env env = stmt->Env();
...@@ -651,7 +655,7 @@ void Statement::Work_BeginEach(Baton* baton) { ...@@ -651,7 +655,7 @@ void Statement::Work_BeginEach(Baton* baton) {
STATEMENT_BEGIN(Each); STATEMENT_BEGIN(Each);
} }
void Statement::Work_Each(uv_work_t* req) { void Statement::Work_Each(napi_env e, void* data) {
STATEMENT_INIT(EachBaton); STATEMENT_INIT(EachBaton);
Async* async = baton->async; Async* async = baton->async;
...@@ -748,7 +752,7 @@ void Statement::AsyncEach(uv_async_t* handle, int status) { ...@@ -748,7 +752,7 @@ void Statement::AsyncEach(uv_async_t* handle, int status) {
} }
} }
void Statement::Work_AfterEach(uv_work_t* req) { void Statement::Work_AfterEach(napi_env e, napi_status status, void* data) {
STATEMENT_INIT(EachBaton); STATEMENT_INIT(EachBaton);
Napi::Env env = stmt->Env(); Napi::Env env = stmt->Env();
...@@ -777,14 +781,14 @@ void Statement::Work_BeginReset(Baton* baton) { ...@@ -777,14 +781,14 @@ void Statement::Work_BeginReset(Baton* baton) {
STATEMENT_BEGIN(Reset); STATEMENT_BEGIN(Reset);
} }
void Statement::Work_Reset(uv_work_t* req) { void Statement::Work_Reset(napi_env e, void* data) {
STATEMENT_INIT(Baton); STATEMENT_INIT(Baton);
sqlite3_reset(stmt->_handle); sqlite3_reset(stmt->_handle);
stmt->status = SQLITE_OK; stmt->status = SQLITE_OK;
} }
void Statement::Work_AfterReset(uv_work_t* req) { void Statement::Work_AfterReset(napi_env e, napi_status status, void* data) {
STATEMENT_INIT(Baton); STATEMENT_INIT(Baton);
Napi::Env env = stmt->Env(); Napi::Env env = stmt->Env();
...@@ -908,7 +912,7 @@ void Statement::Finalize_() { ...@@ -908,7 +912,7 @@ void Statement::Finalize_() {
} }
void Statement::CleanQueue() { void Statement::CleanQueue() {
Napi::Env env = this->Env(); Napi::Env env = this->Env();
Napi::HandleScope scope(env); Napi::HandleScope scope(env);
if (prepared && !queue.empty()) { if (prepared && !queue.empty()) {
......
...@@ -79,14 +79,13 @@ public: ...@@ -79,14 +79,13 @@ public:
static Napi::Value New(const Napi::CallbackInfo& info); static Napi::Value New(const Napi::CallbackInfo& info);
struct Baton { struct Baton {
uv_work_t request; napi_async_work request;
Statement* stmt; Statement* stmt;
Napi::FunctionReference callback; Napi::FunctionReference callback;
Parameters parameters; Parameters parameters;
Baton(Statement* stmt_, Napi::Function cb_) : stmt(stmt_) { Baton(Statement* stmt_, Napi::Function cb_) : stmt(stmt_) {
stmt->Ref(); stmt->Ref();
request.data = this;
callback.Reset(cb_); callback.Reset(cb_);
} }
virtual ~Baton() { virtual ~Baton() {
...@@ -212,8 +211,8 @@ public: ...@@ -212,8 +211,8 @@ public:
protected: protected:
static void Work_BeginPrepare(Database::Baton* baton); static void Work_BeginPrepare(Database::Baton* baton);
static void Work_Prepare(uv_work_t* req); static void Work_Prepare(napi_env env, void* data);
static void Work_AfterPrepare(uv_work_t* req); static void Work_AfterPrepare(napi_env env, napi_status status, void* data);
static void AsyncEach(uv_async_t* handle, int status); static void AsyncEach(uv_async_t* handle, int status);
static void CloseCallback(uv_handle_t* handle); static void CloseCallback(uv_handle_t* handle);
......
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