Commit dd0e118b by Konstantin Käfer

bind parameters for .prepare()

parent 96208ca5
...@@ -28,10 +28,15 @@ var Statement = sqlite3.Statement; ...@@ -28,10 +28,15 @@ var Statement = sqlite3.Statement;
Database.prototype.prepare = function(sql) { Database.prototype.prepare = function(sql) {
var callback, params = Array.prototype.slice.call(arguments, 1); var callback, params = Array.prototype.slice.call(arguments, 1);
if (params.length && typeof params[params.length - 1] === 'function') { if (params.length && typeof params[params.length - 1] !== 'function') {
callback = params.pop(); params.push(undefined);
} }
return new Statement(this, sql, params, callback); if (params.length > 1) {
var statement = new Statement(this, sql);
return statement.bind.apply(statement, params);
} else {
return new Statement(this, sql, params.pop());
}
}; };
...@@ -93,19 +93,15 @@ Handle<Value> Statement::New(const Arguments& args) { ...@@ -93,19 +93,15 @@ Handle<Value> Statement::New(const Arguments& args) {
if (length <= 0 || !Database::HasInstance(args[0])) { if (length <= 0 || !Database::HasInstance(args[0])) {
return ThrowException(Exception::TypeError( return ThrowException(Exception::TypeError(
String::New("First argument must be a Database object"))); String::New("Database object expected")));
} }
else if (length <= 1 || !args[1]->IsString()) { else if (length <= 1 || !args[1]->IsString()) {
return ThrowException(Exception::TypeError( return ThrowException(Exception::TypeError(
String::New("Second argument must be a SQL query"))); String::New("SQL query expected")));
} }
else if (length <= 2 || !args[2]->IsObject()) { else if (length > 2 && !args[2]->IsUndefined() && !args[2]->IsFunction()) {
return ThrowException(Exception::TypeError( return ThrowException(Exception::TypeError(
String::New("Third argument must be an array or object of parameters"))); String::New("Callback expected")));
}
else if (length > 3 && !args[3]->IsUndefined() && !args[3]->IsFunction()) {
return ThrowException(Exception::TypeError(
String::New("Fourth argument must be a function")));
} }
Database* db = ObjectWrap::Unwrap<Database>(args[0]->ToObject()); Database* db = ObjectWrap::Unwrap<Database>(args[0]->ToObject());
...@@ -115,7 +111,7 @@ Handle<Value> Statement::New(const Arguments& args) { ...@@ -115,7 +111,7 @@ Handle<Value> Statement::New(const Arguments& args) {
Statement* stmt = new Statement(db); Statement* stmt = new Statement(db);
stmt->Wrap(args.This()); stmt->Wrap(args.This());
PrepareBaton* baton = new PrepareBaton(db, Local<Function>::Cast(args[3]), stmt); PrepareBaton* baton = new PrepareBaton(db, Local<Function>::Cast(args[2]), stmt);
baton->sql = std::string(*String::Utf8Value(sql)); baton->sql = std::string(*String::Utf8Value(sql));
db->Schedule(EIO_BeginPrepare, baton, false); db->Schedule(EIO_BeginPrepare, baton, false);
......
...@@ -159,3 +159,23 @@ exports['test get() function binding'] = function(beforeExit) { ...@@ -159,3 +159,23 @@ exports['test get() function binding'] = function(beforeExit) {
assert.equal(10, retrieved, "Didn't retrieve all rows"); assert.equal(10, retrieved, "Didn't retrieve all rows");
}); });
}; };
exports['test prepare() 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 = ?", 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");
});
};
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