Commit d841a409 by Konstantin Käfer

call callbacks of all remaining items in the queue with an error object when the…

call callbacks of all remaining items in the queue with an error object when the database was closed
parent 1c2210b5
...@@ -46,9 +46,27 @@ void Database::Init(v8::Handle<Object> target) { ...@@ -46,9 +46,27 @@ void Database::Init(v8::Handle<Object> target) {
void Database::Process(Database* db) { void Database::Process(Database* db) {
if (!db->open && db->locked && !db->queue.empty()) { if (!db->open && db->locked && !db->queue.empty()) {
EXCEPTION(String::New("Database is closed"), SQLITE_MISUSE, exception); EXCEPTION(String::New("Database handle is closed"), SQLITE_MISUSE, exception);
Local<Value> argv[] = { String::NewSymbol("error"), exception }; Local<Value> argv[] = { exception };
EMIT_EVENT(db->handle_, 2, argv); bool called = false;
// Call all callbacks with the error object.
while (!db->queue.empty()) {
Call* call = db->queue.front();
if (!call->baton->callback.IsEmpty()) {
TRY_CATCH_CALL(db->handle_, call->baton->callback, 1, argv);
called = true;
}
db->queue.pop();
delete call;
}
// When we couldn't call a callback function, emit an error on the
// Database object.
if (!called) {
Local<Value> args[] = { String::NewSymbol("error"), exception };
EMIT_EVENT(db->handle_, 2, args);
}
return; return;
} }
...@@ -69,9 +87,9 @@ inline void Database::Schedule(Database* db, EIO_Callback callback, Baton* baton ...@@ -69,9 +87,9 @@ inline void Database::Schedule(Database* db, EIO_Callback callback, Baton* baton
bool exclusive = false) { bool exclusive = false) {
if (!db->open && db->locked) { if (!db->open && db->locked) {
EXCEPTION(String::New("Database is closed"), SQLITE_MISUSE, exception); EXCEPTION(String::New("Database is closed"), SQLITE_MISUSE, exception);
if (!(baton)->callback.IsEmpty()) { if (!baton->callback.IsEmpty()) {
Local<Value> argv[] = { exception }; Local<Value> argv[] = { exception };
TRY_CATCH_CALL(db->handle_, (baton)->callback, 1, argv); TRY_CATCH_CALL(db->handle_, baton->callback, 1, argv);
} }
else { else {
Local<Value> argv[] = { String::NewSymbol("error"), exception }; Local<Value> argv[] = { String::NewSymbol("error"), exception };
...@@ -93,7 +111,7 @@ Handle<Value> Database::New(const Arguments& args) { ...@@ -93,7 +111,7 @@ Handle<Value> Database::New(const Arguments& args) {
if (!args.IsConstructCall()) { if (!args.IsConstructCall()) {
return ThrowException(Exception::TypeError( return ThrowException(Exception::TypeError(
String::New("Use the new keyword to create new Database objects")) String::New("Use the new operator to create new Database objects"))
); );
} }
......
...@@ -31,8 +31,38 @@ extern "C" void init (v8::Handle<Object> target) { ...@@ -31,8 +31,38 @@ extern "C" void init (v8::Handle<Object> target) {
DEFINE_CONSTANT_INTEGER(target, SQLITE_OPEN_READWRITE, OPEN_READWRITE); DEFINE_CONSTANT_INTEGER(target, SQLITE_OPEN_READWRITE, OPEN_READWRITE);
DEFINE_CONSTANT_INTEGER(target, SQLITE_OPEN_CREATE, OPEN_CREATE); DEFINE_CONSTANT_INTEGER(target, SQLITE_OPEN_CREATE, OPEN_CREATE);
DEFINE_CONSTANT_STRING(target, SQLITE_VERSION, VERSION); DEFINE_CONSTANT_STRING(target, SQLITE_VERSION, VERSION);
// DEFINE_CONSTANT_STRING(target, SQLITE_SOURCE_ID, SOURCE_ID);
DEFINE_CONSTANT_INTEGER(target, SQLITE_VERSION_NUMBER, VERSION_NUMBER); DEFINE_CONSTANT_INTEGER(target, SQLITE_VERSION_NUMBER, VERSION_NUMBER);
DEFINE_CONSTANT_INTEGER(target, SQLITE_OK, OK);
DEFINE_CONSTANT_INTEGER(target, SQLITE_ERROR, ERROR);
DEFINE_CONSTANT_INTEGER(target, SQLITE_INTERNAL, INTERNAL);
DEFINE_CONSTANT_INTEGER(target, SQLITE_PERM, PERM);
DEFINE_CONSTANT_INTEGER(target, SQLITE_ABORT, ABORT);
DEFINE_CONSTANT_INTEGER(target, SQLITE_BUSY, BUSY);
DEFINE_CONSTANT_INTEGER(target, SQLITE_LOCKED, LOCKED);
DEFINE_CONSTANT_INTEGER(target, SQLITE_NOMEM, NOMEM);
DEFINE_CONSTANT_INTEGER(target, SQLITE_READONLY, READONLY);
DEFINE_CONSTANT_INTEGER(target, SQLITE_INTERRUPT, INTERRUPT);
DEFINE_CONSTANT_INTEGER(target, SQLITE_IOERR, IOERR);
DEFINE_CONSTANT_INTEGER(target, SQLITE_CORRUPT, CORRUPT);
DEFINE_CONSTANT_INTEGER(target, SQLITE_NOTFOUND, NOTFOUND);
DEFINE_CONSTANT_INTEGER(target, SQLITE_FULL, FULL);
DEFINE_CONSTANT_INTEGER(target, SQLITE_CANTOPEN, CANTOPEN);
DEFINE_CONSTANT_INTEGER(target, SQLITE_PROTOCOL, PROTOCOL);
DEFINE_CONSTANT_INTEGER(target, SQLITE_EMPTY, EMPTY);
DEFINE_CONSTANT_INTEGER(target, SQLITE_SCHEMA, SCHEMA);
DEFINE_CONSTANT_INTEGER(target, SQLITE_TOOBIG, TOOBIG);
DEFINE_CONSTANT_INTEGER(target, SQLITE_CONSTRAINT, CONSTRAINT);
DEFINE_CONSTANT_INTEGER(target, SQLITE_MISMATCH, MISMATCH);
DEFINE_CONSTANT_INTEGER(target, SQLITE_MISUSE, MISUSE);
DEFINE_CONSTANT_INTEGER(target, SQLITE_NOLFS, NOLFS);
DEFINE_CONSTANT_INTEGER(target, SQLITE_AUTH, AUTH);
DEFINE_CONSTANT_INTEGER(target, SQLITE_FORMAT, FORMAT);
DEFINE_CONSTANT_INTEGER(target, SQLITE_RANGE, RANGE);
DEFINE_CONSTANT_INTEGER(target, SQLITE_NOTADB, NOTADB);
DEFINE_CONSTANT_INTEGER(target, SQLITE_ROW, ROW);
DEFINE_CONSTANT_INTEGER(target, SQLITE_DONE, DONE);
} }
const char* sqlite_code_string(int code) { const char* sqlite_code_string(int code) {
......
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