Commit 416ffb25 by Konstantin Käfer

wrap in namespace

parent 481cfbbb
...@@ -22,9 +22,7 @@ ...@@ -22,9 +22,7 @@
#include "statement.h" #include "statement.h"
#include "deferred_call.h" #include "deferred_call.h"
using namespace v8; using namespace node_sqlite3;
using namespace node;
Persistent<FunctionTemplate> Database::constructor_template; Persistent<FunctionTemplate> Database::constructor_template;
......
...@@ -27,6 +27,8 @@ ...@@ -27,6 +27,8 @@
using namespace v8; using namespace v8;
using namespace node; using namespace node;
namespace node_sqlite3 {
class Database; class Database;
...@@ -122,4 +124,6 @@ protected: ...@@ -122,4 +124,6 @@ protected:
std::queue<Call*> queue; std::queue<Call*> queue;
}; };
}
#endif #endif
...@@ -21,7 +21,8 @@ ...@@ -21,7 +21,8 @@
#include "macros.h" #include "macros.h"
#include "database.h" #include "database.h"
#include "statement.h" #include "statement.h"
#include "demo.h"
using namespace node_sqlite3;
extern "C" void init (v8::Handle<Object> target) { extern "C" void init (v8::Handle<Object> target) {
Database::Init(target); Database::Init(target);
......
...@@ -22,6 +22,8 @@ ...@@ -22,6 +22,8 @@
#include "statement.h" #include "statement.h"
#include "deferred_call.h" #include "deferred_call.h"
using namespace node_sqlite3;
Persistent<FunctionTemplate> Statement::constructor_template; Persistent<FunctionTemplate> Statement::constructor_template;
void Statement::Init(v8::Handle<Object> target) { void Statement::Init(v8::Handle<Object> target) {
...@@ -185,19 +187,19 @@ template <class T> T* Statement::Bind(const Arguments& args, int start) { ...@@ -185,19 +187,19 @@ template <class T> T* Statement::Bind(const Arguments& args, int start) {
for (int i = start; i < last; i++) { for (int i = start; i < last; i++) {
if (args[i]->IsString()) { if (args[i]->IsString()) {
String::Utf8Value val(args[i]->ToString()); String::Utf8Value val(args[i]->ToString());
baton->parameters.push_back(new Result::Text(val.length(), *val)); baton->parameters.push_back(new Data::Text(val.length(), *val));
} }
else if (args[i]->IsInt32() || args[i]->IsUint32()) { else if (args[i]->IsInt32() || args[i]->IsUint32()) {
baton->parameters.push_back(new Result::Integer(args[i]->Int32Value())); baton->parameters.push_back(new Data::Integer(args[i]->Int32Value()));
} }
else if (args[i]->IsNumber()) { else if (args[i]->IsNumber()) {
baton->parameters.push_back(new Result::Float(args[i]->NumberValue())); baton->parameters.push_back(new Data::Float(args[i]->NumberValue()));
} }
else if (args[i]->IsBoolean()) { else if (args[i]->IsBoolean()) {
baton->parameters.push_back(new Result::Integer(args[i]->BooleanValue() ? 1 : 0)); baton->parameters.push_back(new Data::Integer(args[i]->BooleanValue() ? 1 : 0));
} }
else if (args[i]->IsNull()) { else if (args[i]->IsNull()) {
baton->parameters.push_back(new Result::Null()); baton->parameters.push_back(new Data::Null());
} }
else if (args[i]->IsUndefined()) { else if (args[i]->IsUndefined()) {
// Skip parameter position. // Skip parameter position.
...@@ -212,7 +214,7 @@ template <class T> T* Statement::Bind(const Arguments& args, int start) { ...@@ -212,7 +214,7 @@ template <class T> T* Statement::Bind(const Arguments& args, int start) {
return baton; return baton;
} }
bool Statement::Bind(const Result::Row parameters) { bool Statement::Bind(const Data::Parameters parameters) {
if (parameters.size() == 0) { if (parameters.size() == 0) {
return true; return true;
} }
...@@ -220,27 +222,27 @@ bool Statement::Bind(const Result::Row parameters) { ...@@ -220,27 +222,27 @@ bool Statement::Bind(const Result::Row parameters) {
sqlite3_reset(handle); sqlite3_reset(handle);
sqlite3_clear_bindings(handle); sqlite3_clear_bindings(handle);
Result::Row::const_iterator it = parameters.begin(); Data::Parameters::const_iterator it = parameters.begin();
Result::Row::const_iterator end = parameters.end(); Data::Parameters::const_iterator end = parameters.end();
// Note: bind parameters start with 1. // Note: bind parameters start with 1.
for (int i = 1; it < end; it++, i++) { for (int i = 1; it < end; it++, i++) {
Result::Field* field = *it; Data::Field* field = *it;
if (field == NULL) { if (field == NULL) {
continue; continue;
} }
switch (field->type) { switch (field->type) {
case SQLITE_INTEGER: { case SQLITE_INTEGER: {
status = sqlite3_bind_int(handle, i, ((Result::Integer*)field)->value); status = sqlite3_bind_int(handle, i, ((Data::Integer*)field)->value);
} break; } break;
case SQLITE_FLOAT: { case SQLITE_FLOAT: {
status = sqlite3_bind_double(handle, i, ((Result::Float*)field)->value); status = sqlite3_bind_double(handle, i, ((Data::Float*)field)->value);
} break; } break;
case SQLITE_TEXT: { case SQLITE_TEXT: {
status = sqlite3_bind_text( status = sqlite3_bind_text(
handle, i, ((Result::Text*)field)->value.c_str(), handle, i, ((Data::Text*)field)->value.c_str(),
((Result::Text*)field)->value.size(), SQLITE_TRANSIENT); ((Data::Text*)field)->value.size(), SQLITE_TRANSIENT);
} break; } break;
// case SQLITE_BLOB: { // case SQLITE_BLOB: {
// //
...@@ -487,24 +489,24 @@ int Statement::EIO_AfterReset(eio_req *req) { ...@@ -487,24 +489,24 @@ int Statement::EIO_AfterReset(eio_req *req) {
return 0; return 0;
} }
Local<Array> Statement::RowToJS(Result::Row* row) { Local<Array> Statement::RowToJS(Data::Row* row) {
Local<Array> result(Array::New(row->size())); Local<Array> result(Array::New(row->size()));
Result::Row::iterator it = row->begin(); Data::Row::iterator it = row->begin();
for (int i = 0; it < row->end(); it++, i++) { for (int i = 0; it < row->end(); it++, i++) {
Result::Field* field = *it; Data::Field* field = *it;
switch (field->type) { switch (field->type) {
case SQLITE_INTEGER: { case SQLITE_INTEGER: {
result->Set(i, Local<Integer>(Integer::New(((Result::Integer*)field)->value))); result->Set(i, Local<Integer>(Integer::New(((Data::Integer*)field)->value)));
} break; } break;
case SQLITE_FLOAT: { case SQLITE_FLOAT: {
result->Set(i, Local<Number>(Number::New(((Result::Float*)field)->value))); result->Set(i, Local<Number>(Number::New(((Data::Float*)field)->value)));
} break; } break;
case SQLITE_TEXT: { case SQLITE_TEXT: {
result->Set(i, Local<String>(String::New(((Result::Text*)field)->value.c_str(), ((Result::Text*)field)->value.size()))); result->Set(i, Local<String>(String::New(((Data::Text*)field)->value.c_str(), ((Data::Text*)field)->value.size())));
} break; } break;
// case SQLITE_BLOB: { // case SQLITE_BLOB: {
// result->Set(i, Local<String>(String::New(((Result::Text*)field)->value.c_str()))); // result->Set(i, Local<String>(String::New(((Data::Text*)field)->value.c_str())));
// } break; // } break;
case SQLITE_NULL: { case SQLITE_NULL: {
result->Set(i, Local<Value>::New(Null())); result->Set(i, Local<Value>::New(Null()));
...@@ -515,30 +517,30 @@ Local<Array> Statement::RowToJS(Result::Row* row) { ...@@ -515,30 +517,30 @@ Local<Array> Statement::RowToJS(Result::Row* row) {
return result; return result;
} }
void Statement::GetRow(Result::Row* row, sqlite3_stmt* stmt) { void Statement::GetRow(Data::Row* row, sqlite3_stmt* stmt) {
int rows = sqlite3_column_count(stmt); int rows = sqlite3_column_count(stmt);
for (int i = 0; i < rows; i++) { for (int i = 0; i < rows; i++) {
int type = sqlite3_column_type(stmt, i); int type = sqlite3_column_type(stmt, i);
switch (type) { switch (type) {
case SQLITE_INTEGER: { case SQLITE_INTEGER: {
row->push_back(new Result::Integer(sqlite3_column_int(stmt, i))); row->push_back(new Data::Integer(sqlite3_column_int(stmt, i)));
} break; } break;
case SQLITE_FLOAT: { case SQLITE_FLOAT: {
row->push_back(new Result::Float(sqlite3_column_double(stmt, i))); row->push_back(new Data::Float(sqlite3_column_double(stmt, i)));
} break; } break;
case SQLITE_TEXT: { case SQLITE_TEXT: {
const char* text = (const char*)sqlite3_column_text(stmt, i); const char* text = (const char*)sqlite3_column_text(stmt, i);
int length = sqlite3_column_bytes(stmt, i); int length = sqlite3_column_bytes(stmt, i);
row->push_back(new Result::Text(length, text)); row->push_back(new Data::Text(length, text));
} break; } break;
case SQLITE_BLOB: { case SQLITE_BLOB: {
const void* blob = sqlite3_column_blob(stmt, i); const void* blob = sqlite3_column_blob(stmt, i);
int length = sqlite3_column_bytes(stmt, i); int length = sqlite3_column_bytes(stmt, i);
row->push_back(new Result::Blob(length, blob)); row->push_back(new Data::Blob(length, blob));
} break; } break;
case SQLITE_NULL: { case SQLITE_NULL: {
row->push_back(new Result::Null()); row->push_back(new Data::Null());
} break; } break;
default: default:
assert(false); assert(false);
......
...@@ -31,8 +31,9 @@ ...@@ -31,8 +31,9 @@
using namespace v8; using namespace v8;
using namespace node; using namespace node;
namespace node_sqlite3 {
namespace Result { namespace Data {
struct Field { struct Field {
Field(unsigned short _type = SQLITE_NULL) : type(_type) {} Field(unsigned short _type = SQLITE_NULL) : type(_type) {}
unsigned short type; unsigned short type;
...@@ -67,6 +68,8 @@ namespace Result { ...@@ -67,6 +68,8 @@ namespace Result {
typedef Field Null; typedef Field Null;
typedef std::vector<Field*> Row; typedef std::vector<Field*> Row;
typedef Row Parameters;
typedef std::vector<Row*> Rows;
} }
...@@ -82,7 +85,7 @@ public: ...@@ -82,7 +85,7 @@ public:
static struct Baton { static struct Baton {
Statement* stmt; Statement* stmt;
Persistent<Function> callback; Persistent<Function> callback;
Result::Row parameters; Data::Parameters parameters;
Baton(Statement* stmt_, Handle<Function> cb_) : stmt(stmt_) { Baton(Statement* stmt_, Handle<Function> cb_) : stmt(stmt_) {
stmt->Ref(); stmt->Ref();
...@@ -99,7 +102,7 @@ public: ...@@ -99,7 +102,7 @@ public:
static struct RowBaton : Baton { static struct RowBaton : Baton {
RowBaton(Statement* stmt_, Handle<Function> cb_) : RowBaton(Statement* stmt_, Handle<Function> cb_) :
Baton(stmt_, cb_) {} Baton(stmt_, cb_) {}
Result::Row row; Data::Row row;
}; };
static struct PrepareBaton : Database::Baton { static struct PrepareBaton : Database::Baton {
...@@ -145,6 +148,7 @@ protected: ...@@ -145,6 +148,7 @@ protected:
EIO_DEFINITION(Bind); EIO_DEFINITION(Bind);
EIO_DEFINITION(Get); EIO_DEFINITION(Get);
EIO_DEFINITION(Run); EIO_DEFINITION(Run);
EIO_DEFINITION(All);
EIO_DEFINITION(Reset); EIO_DEFINITION(Reset);
static Handle<Value> Finalize(const Arguments& args); static Handle<Value> Finalize(const Arguments& args);
...@@ -152,10 +156,10 @@ protected: ...@@ -152,10 +156,10 @@ protected:
void Finalize(); void Finalize();
template <class T> T* Bind(const Arguments& args, int start = 0); template <class T> T* Bind(const Arguments& args, int start = 0);
bool Bind(const Result::Row parameters); bool Bind(const Data::Parameters parameters);
static void GetRow(Result::Row* row, sqlite3_stmt* stmt); static void GetRow(Data::Row* row, sqlite3_stmt* stmt);
static Local<Array> RowToJS(Result::Row* row); static Local<Array> RowToJS(Data::Row* row);
void Schedule(EIO_Callback callback, Baton* baton); void Schedule(EIO_Callback callback, Baton* baton);
void Process(); void Process();
void CleanQueue(); void CleanQueue();
...@@ -174,4 +178,6 @@ protected: ...@@ -174,4 +178,6 @@ protected:
std::queue<Call*> queue; std::queue<Call*> queue;
}; };
}
#endif #endif
...@@ -128,7 +128,7 @@ exports['test retrieving reset() function'] = function(beforeExit) { ...@@ -128,7 +128,7 @@ exports['test retrieving reset() function'] = function(beforeExit) {
}); });
}; };
exports['test get() function binding'] = function(beforeExit) { exports['test multiple get() function binding'] = function(beforeExit) {
var db = new sqlite3.Database('test/support/prepare.db', sqlite3.OPEN_READONLY); var db = new sqlite3.Database('test/support/prepare.db', sqlite3.OPEN_READONLY);
var retrieved = 0; var retrieved = 0;
...@@ -166,7 +166,29 @@ exports['test prepare() function binding'] = function(beforeExit) { ...@@ -166,7 +166,29 @@ exports['test prepare() function binding'] = function(beforeExit) {
var retrieved = 0; var retrieved = 0;
db.prepare("SELECT txt, num, flt, blb FROM foo WHERE num = ? AND txt = ?", 10, 'String 10').get(function(err, row) { db.prepare("SELECT txt, num, flt, blb FROM foo WHERE num = ? AND txt = ?", 10, 'String 10')
.get(function(err, row) {
if (err) throw err;
assert.equal(row[0], 'String 10');
assert.equal(row[1], 10);
assert.equal(row[2], 10 * Math.PI);
assert.equal(row[3], null);
retrieved++;
});
beforeExit(function() {
assert.equal(1, retrieved, "Didn't retrieve all rows");
});
};
exports['test get() function binding'] = function(beforeExit) {
var db = new sqlite3.Database('test/support/prepare.db', sqlite3.OPEN_READONLY);
var retrieved = 0;
db.prepare("SELECT txt, num, flt, blb FROM foo WHERE num = ? AND txt = ?")
.get(10, 'String 10', function(err, row) {
if (err) throw err; if (err) throw err;
assert.equal(row[0], 'String 10'); assert.equal(row[0], 'String 10');
assert.equal(row[1], 10); assert.equal(row[1], 10);
......
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