diff --git a/README.md b/README.md index 89da254..1ee7398 100755 --- a/README.md +++ b/README.md @@ -9,6 +9,8 @@ A node query builder for various SQL databases, based on CodeIgniter's query bui * mysql * mysql2 * pg +* dblite +* sqlite3 ### Installation @@ -21,7 +23,10 @@ A node query builder for various SQL databases, based on CodeIgniter's query bui var connection = ... // Database module connection // Three arguments: database type, database connection, database connection library - var query = nodeQuery('mysql', connection, 'mysql2'); + var query = nodeQuery.init('mysql', connection, 'mysql2'); + + // You can also retrieve the instance later + query = nodeQuery.getQuery(); query.select('foo') .from('bar') diff --git a/lib/adapters/sqlite3.js b/lib/adapters/sqlite3.js new file mode 100644 index 0000000..f39e687 --- /dev/null +++ b/lib/adapters/sqlite3.js @@ -0,0 +1,29 @@ +'use strict'; + +var adapter = require('../adapter'), + getArgs = require('getargs'); + +/** @module adapters/dblite */ +var Sqlite3 = function(instance) { + + // That 'new' keyword is annoying + if ( ! (this instanceof Sqlite3)) return new Sqlite3(instance); + + /** + * Run the sql query as a prepared statement + * + * @param {String} sql - The sql with placeholders + * @param {Array} params - The values to insert into the query + * @param {Function} callback - Callback to run when a response is recieved + * @return void + */ + adapter.execute = function(/*sql, params, callback*/) { + var args = getArgs('sql:string, [params]:array, callback:function', arguments); + + instance.all(args.sql, args.params, args.callback); + }; + + return adapter; +} + +module.exports = Sqlite3; \ No newline at end of file diff --git a/lib/node-query.js b/lib/node-query.js index 0e3a7a5..798a8e1 100755 --- a/lib/node-query.js +++ b/lib/node-query.js @@ -3,6 +3,8 @@ /** @module node-query */ var nodeQuery = {}; +var instance = null; + /** * Create a query builder object * @@ -29,8 +31,22 @@ nodeQuery.init = function (driverType, connObject, connLib) { } }); - return qb(require(paths.driver), require(paths.adapter)(connObject)); + instance = qb(require(paths.driver), require(paths.adapter)(connObject)); + + return instance; }; +/** + * Return an existing query builder instance + * + * @return {queryBuilder} + */ +nodeQuery.getQuery = function () { + if ( ! instance) { + throw new Error("No Query Builder instance to return"); + } -module.exports = nodeQuery.init; \ No newline at end of file + return instance; +}; + +module.exports = nodeQuery; \ No newline at end of file diff --git a/tests/adapters/dblite_test.js b/tests/adapters/dblite_test.js index 2c64ce8..adebb11 100644 --- a/tests/adapters/dblite_test.js +++ b/tests/adapters/dblite_test.js @@ -25,7 +25,7 @@ if (connection) { // Set up the query builder object var nodeQuery = require('../../lib/node-query'); - var qb = nodeQuery('sqlite', connection, adapterName); + var qb = nodeQuery.init('sqlite', connection, adapterName); // Set up the sqlite database var sql = 'CREATE TABLE IF NOT EXISTS "create_test" ("id" INTEGER PRIMARY KEY, "key" TEXT, "val" TEXT);' + diff --git a/tests/adapters/mysql2_test.js b/tests/adapters/mysql2_test.js index 493af89..6fdb970 100644 --- a/tests/adapters/mysql2_test.js +++ b/tests/adapters/mysql2_test.js @@ -17,7 +17,7 @@ var connection = mysql2.createConnection(config.conn); // Set up the query builder object var nodeQuery = require('../../lib/node-query'); -var qb = nodeQuery('mysql', connection, adapterName); +var qb = nodeQuery.init('mysql', connection, adapterName); // Set up the test base testBase._setUp(qb, function(test, err, rows) { diff --git a/tests/adapters/mysql_test.js b/tests/adapters/mysql_test.js index 13e360e..63f2426 100644 --- a/tests/adapters/mysql_test.js +++ b/tests/adapters/mysql_test.js @@ -17,7 +17,7 @@ var connection = mysql.createConnection(config.conn); // Set up the query builder object var nodeQuery = require('../../lib/node-query'); -var qb = nodeQuery('mysql', connection, adapterName); +var qb = nodeQuery.init('mysql', connection, adapterName); // Set up the test base testBase._setUp(qb, function(test, err, rows) { diff --git a/tests/adapters/pg_test.js b/tests/adapters/pg_test.js index 4496e2e..3a4639a 100644 --- a/tests/adapters/pg_test.js +++ b/tests/adapters/pg_test.js @@ -22,7 +22,7 @@ connection.connect(function(err) { // Set up the query builder object var nodeQuery = require('../../lib/node-query'); -var qb = nodeQuery('pg', connection, adapterName); +var qb = nodeQuery.init('pg', connection, adapterName); // Set up the test base diff --git a/tests/adapters/sqlite3_test.js b/tests/adapters/sqlite3_test.js new file mode 100644 index 0000000..8b6493d --- /dev/null +++ b/tests/adapters/sqlite3_test.js @@ -0,0 +1,72 @@ +'use strict'; + +// Load the test base +delete require.cache[require.resolve('../query-builder-base')]; +var testBase = require('../query-builder-base'); +var tests = testBase.tests; + +// Load the test config file +var adapterName = 'sqlite3'; +var sqlite = null; +var connection = null; + +// Set up the connection +try { + sqlite = require(adapterName).verbose(); + connection = new sqlite.Database(':memory:'); +} catch (e) { + // Export an empty testsuite if module not loaded + console.log(e); + console.log("Database adapter sqlite3 not found"); + return {}; +} + +if (connection) +{ + // Set up the query builder object + var nodeQuery = require('../../lib/node-query'); + var qb = nodeQuery.init('sqlite', connection, adapterName); + + // Set up the sqlite database + var sql = 'CREATE TABLE IF NOT EXISTS "create_test" ("id" INTEGER PRIMARY KEY, "key" TEXT, "val" TEXT);'; + var sql2 = 'CREATE TABLE IF NOT EXISTS "create_join" ("id" INTEGER PRIMARY KEY, "key" TEXT, "val" TEXT);'; + connection.serialize(function() { + connection.run(sql); + connection.run(sql2); + }); + + // Set up the test base + testBase._setUp(qb, function(test, err, result) { + if (err != null) { + test.done(); + throw new Error(err); + } + + // Insert/Update/Delete queries return undefined + if (result === undefined) { + result = {}; + } + + test.ok(result, 'sqlite3: Valid result for generated query'); + test.done(); + }); + + tests["sqlite3 adapter with query builder"] = function(test) { + test.expect(1); + test.ok(testBase.qb); + + // Close the db connection + connection.close(); + test.done(); + }; + + // Export the final test object + module.exports = tests; +} +else +{ + module.exports = {}; +} + + + diff --git a/tests/base_test.js b/tests/base_test.js index 99acd66..2f945b2 100755 --- a/tests/base_test.js +++ b/tests/base_test.js @@ -27,7 +27,7 @@ module.exports = { 'Invalid driver type': function(test) { test.expect(1); test.throws(function() { - modules['node-query']('foo', {}, 'bar'); + modules['node-query'].init('foo', {}, 'bar'); }, Error, "Bad driver throws exception"); test.done(); }