Commit b72f6bcd by Orlando Vazquez

get query working now. should even be able to handle multi statement queries!

parent 88a01961
/* /*
Copyright (c) 2009, Eric Fredricksen <e@fredricksen.net> Copyright (c) 2009, Eric Fredricksen <e@fredricksen.net>
Copyright (c) 2010, Orlando Vazquez <ovazquez@gmail.com>
Permission to use, copy, modify, and/or distribute this software for any Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above purpose with or without fee is hereby granted, provided that the above
...@@ -14,31 +15,15 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ...@@ -14,31 +15,15 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
// TODO: async var sys = require("sys");
var puts = sys.puts;
var sqlite = require("./sqlite3_bindings");
var bindings = require("./sqlite3_bindings"); var Database = exports.Database = sqlite.Database;
process.mixin(GLOBAL, bindings);
process.mixin(exports, bindings);
Database.prototype.query = function (sql, bindings, queryCallback) {
var self = this;
// Conform somewhat to http://dev.w3.org/html5/webdatabase/#sql
exports.SQLITE_DELETE = 9;
exports.SQLITE_INSERT = 18;
exports.SQLITE_UPDATE = 23;
exports.openDatabaseSync = function (name, version, displayName,
estimatedSize, creationCallback) {
// 2nd-4th parameters are ignored
var db = new DatabaseSync(name);
if (creationCallback) creationCallback(db);
return db;
}
DatabaseSync.prototype.query = function (sql, bindings, callback) {
// TODO: error callback
if (typeof(bindings) == "function") { if (typeof(bindings) == "function") {
var tmp = bindings; var tmp = bindings;
bindings = callback; bindings = callback;
...@@ -47,58 +32,73 @@ DatabaseSync.prototype.query = function (sql, bindings, callback) { ...@@ -47,58 +32,73 @@ DatabaseSync.prototype.query = function (sql, bindings, callback) {
var all = []; var all = [];
var stmt = this.prepare(sql); // Iterate over the list of bindings. Since we can't use something as
while(stmt) { // simple as a for or while loop, we'll use the event loop
if (bindings) { function doBindingsByIndex(statement, bindings, queryCallback, startIndex) {
if (Object.prototype.toString.call(bindings) === "[object Array]") { (function (statement, bindings, startIndex) {
for (var i = 0; i < stmt.bindParameterCount(); ++i) var innerFunction = arguments.callee;
stmt.bind(i+1, bindings.shift()); if (!bindings.length) {
} else { process.nextTick(function () {
for (var key in bindings) queryCallback(statement);
if (bindings.hasOwnProperty(key)) });
stmt.bind(key, bindings[key]); return;
}
} }
var rows = []; startIndex = startIndex || 1;
var value = bindings.shift();
while (true) { puts("setting index " + startIndex + " to " + value);
var row = stmt.step(); process.nextTick(function () {
if (!row) break; statement.bind(startIndex, value, function () {
rows.push(row); innerFunction(statement, bindings, startIndex+1);
});
});
})(statement, bindings, startIndex);
} }
rows.rowsAffected = this.changes(); function queryDone(statement, rows) {
rows.insertId = this.lastInsertRowid(); if (statement.tail) {
puts("omg it has a tail");
all.push(rows); self.prepare(statement.tail, onPrepare);
}
queryCallback(undefined, rows);
}
stmt.finalize(); function doStep(statement) {
stmt = this.prepare(stmt.tail); var rows = [];
(function () {
var innerFunction = arguments.callee;
statement.step(function (error, row) {
if (error) throw error;
if (!row) {
// rows.rowsAffected = this.changes();
// rows.insertId = this.lastInsertRowid();
process.nextTick(function () {
queryDone(statement, rows);
});
return;
}
rows.push(row);
puts("added " + inspect(row));
process.nextTick(innerFunction);
});
})();
} }
if (all.length == 0) { function onPrepare(error, statement) {
var result = null; puts("prep args " + inspect(arguments));
} else { if (bindings) {
for (var i = 0; i < all.length; ++i) { if (Object.prototype.toString.call(bindings) === "[object Array]") {
var resultset = all[i]; doBindingsByIndex(statement, bindings, doStep);
resultset.all = all; }
resultset.rows = {item: function (index) { return resultset[index]; }, else {
length: resultset.length}; // TODO index by keys
} }
var result = all[0];
} }
if (typeof(callback) == "function") {
callback.apply(result, all);
} }
return result;
}
// TODO: void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*);
// TODO: void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*);
this.prepare(sql, onPrepare);
}
function SQLTransactionSync(db, txCallback, errCallback, successCallback) { function SQLTransactionSync(db, txCallback, errCallback, successCallback) {
this.database = db; this.database = db;
...@@ -133,11 +133,10 @@ function SQLTransactionSync(db, txCallback, errCallback, successCallback) { ...@@ -133,11 +133,10 @@ function SQLTransactionSync(db, txCallback, errCallback, successCallback) {
} }
DatabaseSync.prototype.transaction = function (txCallback, errCallback, Database.prototype.transaction = function (txCallback, errCallback,
successCallback) { successCallback) {
var tx = new SQLTransactionSync(this, txCallback, var tx = new SQLTransactionSync(this, txCallback,
errCallback, successCallback); errCallback, successCallback);
} }
// TODO: readTransaction() // TODO: readTransaction()
...@@ -878,6 +878,9 @@ protected: ...@@ -878,6 +878,9 @@ protected:
} }
} }
} }
else if (SQLITE_DONE) {
// no more results
}
else { else {
step_req->error_msg = (char *) step_req->error_msg = (char *)
sqlite3_errmsg(sqlite3_db_handle(*sto)); sqlite3_errmsg(sqlite3_db_handle(*sto));
......
var fs = require("fs");
process.mixin(GLOBAL, require("assert"));
process.mixin(GLOBAL, require("sys"));
var sqlite = require("./sqlite");
var db = new sqlite.Database();
db.open("mydatabase.db", function () {
puts("opened the db");
db.query("SELECT * FROM foo WHERE baz < ? OR baz > ?; SELECT 1;", [6, 3], function (error, result) {
puts(inspect(arguments));
puts("query callback " + inspect(result));
});
});
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