- NodeQuery
+ NodeQuery(config)
Class for connection management
+ Parameters
+
Instance members
+
diff --git a/lib/NodeQuery.js b/lib/NodeQuery.js
index 58d4652..2e901d4 100755
--- a/lib/NodeQuery.js
+++ b/lib/NodeQuery.js
@@ -1,8 +1,22 @@
'use strict';
-let fs = require('fs'),
- helpers = require('./helpers'),
- QueryBuilder = require('./QueryBuilder');
+const fs = require('fs');
+const helpers = require('./helpers');
+const QueryBuilder = require('./QueryBuilder');
+
+// Map config driver name to code class name
+const dbDriverMap = new Map([
+ ['my', 'Mysql'],
+ ['mysql', 'Mysql'],
+ ['maria', 'Mysql'],
+ ['mariadb', 'Mysql'],
+ ['firebird', 'Firebird'],
+ ['postgresql', 'Pg'],
+ ['postgres', 'Pg'],
+ ['pg', 'Pg'],
+ ['sqlite3', 'Sqlite'],
+ ['sqlite', 'Sqlite'],
+]);
/**
* Class for connection management
@@ -12,11 +26,20 @@ class NodeQuery {
/**
* Constructor
*
- * @private
+ * @param {object} config - connection paramaters
* @constructor
*/
- constructor() {
+ constructor(config) {
this.instance = null;
+
+ if (config != null) {
+ let drivername = dbDriverMap.get(config.driver);
+ let driver = require(`./drivers/${drivername}`);
+ let $adapter = require(`./adapters/${drivername}`);
+
+ let adapter = new $adapter(config.connection);
+ this.instance = new QueryBuilder(driver, adapter);
+ }
}
/**
@@ -70,4 +93,6 @@ class NodeQuery {
}
}
-module.exports = new NodeQuery();
\ No newline at end of file
+module.exports = (config => {
+ return new NodeQuery(config);
+});
\ No newline at end of file
diff --git a/lib/adapters/node-firebird.js b/lib/adapters/Firebird.js
similarity index 77%
rename from lib/adapters/node-firebird.js
rename to lib/adapters/Firebird.js
index 0c121a0..f2a1ef3 100644
--- a/lib/adapters/node-firebird.js
+++ b/lib/adapters/Firebird.js
@@ -1,9 +1,18 @@
'use strict';
-let Adapter = require('../Adapter'),
- getArgs = require('getargs');
+const Adapter = require('../Adapter');
+const getArgs = require('getargs');
+const fb = require('node-firebird');
+
+class Firebird extends Adapter {
+
+ constructor(config) {
+ super({});
+ fb.attach(config, (err, instance) => {
+ this.instance = instance;
+ });
+ }
-module.exports = class nodefirebird extends Adapter {
/**
* Run the sql query as a prepared statement
*
@@ -40,4 +49,6 @@ module.exports = class nodefirebird extends Adapter {
close() {
this.instance.detach();
}
-};
\ No newline at end of file
+}
+
+module.exports = Firebird;
\ No newline at end of file
diff --git a/lib/adapters/mysql2.js b/lib/adapters/Mysql.js
similarity index 67%
rename from lib/adapters/mysql2.js
rename to lib/adapters/Mysql.js
index e3e1c28..239b40a 100644
--- a/lib/adapters/mysql2.js
+++ b/lib/adapters/Mysql.js
@@ -1,10 +1,17 @@
'use strict';
-let Adapter = require('../Adapter'),
- getArgs = require('getargs'),
- promisify = require('../promisify');
+const Adapter = require('../Adapter');
+const getArgs = require('getargs');
+const promisify = require('../promisify');
+const mysql2 = require('mysql2');
+
+class Mysql extends Adapter {
+
+ constructor(config) {
+ let instance = mysql2.createConnection(config);
+ super(instance);
+ }
-module.exports = class mysql2 extends Adapter {
/**
* Run the sql query as a prepared statement
*
@@ -22,4 +29,6 @@ module.exports = class mysql2 extends Adapter {
return this.instance.execute(args.sql, args.params, args.callback);
}
-};
\ No newline at end of file
+}
+
+module.exports = Mysql;
\ No newline at end of file
diff --git a/lib/adapters/pg.js b/lib/adapters/Pg.js
similarity index 50%
rename from lib/adapters/pg.js
rename to lib/adapters/Pg.js
index e1d8294..5dfb962 100644
--- a/lib/adapters/pg.js
+++ b/lib/adapters/Pg.js
@@ -1,9 +1,47 @@
'use strict';
-let Adapter = require('../Adapter'),
- getArgs = require('getargs');
+const Adapter = require('../Adapter');
+const getArgs = require('getargs');
+const helpers = require('../helpers');
+const pg = require('pg');
+const url = require('url');
+
+class Pg extends Adapter {
+
+ constructor(config) {
+ let instance = null;
+ let connectionString = '';
+ if (helpers.isObject(config)) {
+ let host = config.host || 'localhost';
+ let user = config.user || 'postgres';
+ let password = `:${config.password}` || '';
+ let port = config.port || 5432;
+
+ let conn = {
+ protocol: 'postgres',
+ slashes: true,
+ host: `${host}:${port}`,
+ auth: `${user}${password}`,
+ pathname: config.database,
+ };
+
+ connectionString = url.format(conn);
+ } else if (helpers.isString(config)) {
+ connectionString = config;
+ }
+
+ if (connectionString !== '') {
+ let connected = false;
+ instance = new pg.Client(connectionString);
+
+ instance.connect(err => {
+ connected = true;
+ });
+ }
+
+ super(instance);
+ }
-module.exports = class pg extends Adapter {
/**
* Run the sql query as a prepared statement
*
@@ -36,4 +74,6 @@ module.exports = class pg extends Adapter {
return this.instance.query(args.sql, args.params, args.callback);
}
-};
\ No newline at end of file
+}
+
+module.exports = Pg;
\ No newline at end of file
diff --git a/lib/adapters/dblite.js b/lib/adapters/Sqlite.js
similarity index 66%
rename from lib/adapters/dblite.js
rename to lib/adapters/Sqlite.js
index 6502721..02f7e0f 100644
--- a/lib/adapters/dblite.js
+++ b/lib/adapters/Sqlite.js
@@ -1,10 +1,17 @@
'use strict';
-let Adapter = require('../Adapter'),
- getArgs = require('getargs'),
- promisify = require('../promisify');
+const Adapter = require('../Adapter');
+const getArgs = require('getargs');
+const helpers = require('../helpers');
+const promisify = require('../promisify');
+const dbliteAdapter = require('dblite');
+
+class Sqlite extends Adapter {
+ constructor(config) {
+ let file = (helpers.isString(config)) ? config : config.file;
+ super(dbliteAdapter(file));
+ }
-module.exports = class dblite extends Adapter {
/**
* Run the sql query as a prepared statement
*
@@ -31,4 +38,6 @@ module.exports = class dblite extends Adapter {
close() {
this.instance.close();
}
-};
\ No newline at end of file
+}
+
+module.exports = Sqlite;
diff --git a/test/adapters/dblite_test.js b/test/adapters/dblite_test.js
index 714a447..faef847 100644
--- a/test/adapters/dblite_test.js
+++ b/test/adapters/dblite_test.js
@@ -4,95 +4,80 @@
const reload = require('require-reload')(require);
reload.emptyCache();
const testBase = reload('../base');
-const expect = testBase.expect,
- promiseTestRunner = testBase.promiseTestRunner,
- testRunner = testBase.testRunner;
-
+const expect = testBase.expect;
+const promiseTestRunner = testBase.promiseTestRunner;
+const testRunner = testBase.testRunner;
let tests = reload('../base/tests');
// Load the test config file
-let adapterName = 'dblite';
-let sqlite = null;
-let connection = null;
+const configFile = (process.env.TRAVIS) ? '../config-travis.json' : '../config.json';
+const config = reload(configFile);
-// Set up the connection
-try {
- sqlite = require(adapterName).withSQLite('3.7.11');
- connection = sqlite(':memory:');
-} catch (e) {
- // Export an empty testsuite if module not loaded
-}
+// Set up the query builder object
+let nodeQuery = require('../../lib/NodeQuery')(config.dblite);
+let qb = nodeQuery.getQuery();
-if (connection) {
- // Set up the query builder object
- let nodeQuery = require('../../lib/NodeQuery');
- let qb = nodeQuery.init('sqlite', connection, adapterName);
+suite('Dblite adapter tests -', () => {
+ suiteSetup(done => {
+ // Set up the sqlite database
+ let sql = `CREATE TABLE IF NOT EXISTS "create_test" ("id" INTEGER PRIMARY KEY, "key" TEXT, "val" TEXT);
+CREATE TABLE IF NOT EXISTS "create_join" ("id" INTEGER PRIMARY KEY, "key" TEXT, "val" TEXT);`;
- suite('Dblite adapter tests -', () => {
- suiteSetup(done => {
- // Set up the sqlite database
- let sql = 'CREATE TABLE IF NOT EXISTS "create_test" ("id" INTEGER PRIMARY KEY, "key" TEXT, "val" TEXT);' +
- 'CREATE TABLE IF NOT EXISTS "create_join" ("id" INTEGER PRIMARY KEY, "key" TEXT, "val" TEXT);';
- connection.query(sql, () => {
- return done();
- });
- });
- test('nodeQuery.getQuery = nodeQuery.init', () => {
- expect(nodeQuery.getQuery())
- .to.be.deep.equal(qb);
+ qb.query(sql, () => {
+ return done();
});
+ });
- /*---------------------------------------------------------------------------
- Callback Tests
- ---------------------------------------------------------------------------*/
+ /*---------------------------------------------------------------------------
+ Callback Tests
+ ---------------------------------------------------------------------------*/
- testRunner(qb, (err, done) => {
- expect(err).is.not.ok;
- done();
- });
- test('Callback - Select with function and argument in WHERE clause', done => {
- qb.select('id')
- .from('create_test')
- .where('id', 'ABS(-88)')
- .get((err, rows) => {
- expect(err).is.not.ok;
- return done();
- });
- });
- test('Callback - Test Insert Batch', done => {
- let data = [
- {
- id: 544,
- key: 3,
- val: new Buffer('7'),
- }, {
- id: 89,
- key: 34,
- val: new Buffer('10 o\'clock'),
- }, {
- id: 48,
- key: 403,
- val: new Buffer('97'),
- },
- ];
-
- qb.insertBatch('create_test', data, (err, rows) => {
+ testRunner(qb, (err, done) => {
+ expect(err).is.not.ok;
+ done();
+ });
+ test('Callback - Select with function and argument in WHERE clause', done => {
+ qb.select('id')
+ .from('create_test')
+ .where('id', 'ABS(-88)')
+ .get((err, rows) => {
expect(err).is.not.ok;
return done();
});
- });
+ });
+ test('Callback - Test Insert Batch', done => {
+ let data = [
+ {
+ id: 544,
+ key: 3,
+ val: new Buffer('7'),
+ }, {
+ id: 89,
+ key: 34,
+ val: new Buffer('10 o\'clock'),
+ }, {
+ id: 48,
+ key: 403,
+ val: new Buffer('97'),
+ },
+ ];
- /*---------------------------------------------------------------------------
- Promise Tests
- ---------------------------------------------------------------------------*/
- promiseTestRunner(qb);
- test('Promise - Select with function and argument in WHERE clause', () => {
- let promise = qb.select('id')
- .from('create_test')
- .where('id', 'ABS(-88)')
- .get();
-
- expect(promise).to.be.fulfilled;
+ qb.insertBatch('create_test', data, (err, rows) => {
+ expect(err).is.not.ok;
+ return done();
});
});
-}
\ No newline at end of file
+
+ /*---------------------------------------------------------------------------
+ Promise Tests
+ ---------------------------------------------------------------------------*/
+ promiseTestRunner(qb);
+ test('Promise - Select with function and argument in WHERE clause', () => {
+ let promise = qb.select('id')
+ .from('create_test')
+ .where('id', 'ABS(-88)')
+ .get();
+
+ expect(promise).to.be.fulfilled;
+ });
+});
diff --git a/test/adapters/mysql2_test.js b/test/adapters/mysql2_test.js
index cb8ed4b..770e43c 100644
--- a/test/adapters/mysql2_test.js
+++ b/test/adapters/mysql2_test.js
@@ -6,9 +6,9 @@ const configFile = (process.env.TRAVIS) ? '../config-travis.json' : '../config.j
const reload = require('require-reload')(require);
reload.emptyCache();
const testBase = reload('../base');
-const expect = testBase.expect,
- promiseTestRunner = testBase.promiseTestRunner,
- testRunner = testBase.testRunner;
+const expect = testBase.expect;
+const promiseTestRunner = testBase.promiseTestRunner;
+const testRunner = testBase.testRunner;
let getArgs = reload('getargs');
@@ -16,13 +16,9 @@ let getArgs = reload('getargs');
let adapterName = 'mysql2';
let config = reload(configFile)[adapterName];
-// Set up the connection
-let mysql2 = reload(adapterName);
-let connection = mysql2.createConnection(config.conn);
-
// Set up the query builder object
-let nodeQuery = reload('../../lib/NodeQuery');
-let qb = nodeQuery.init('mysql', connection, adapterName);
+let nodeQuery = reload('../../lib/NodeQuery')(config);
+let qb = nodeQuery.getQuery();
qb.query(qb.driver.truncate('create_test')).then(() => {
suite('Mysql2 adapter tests -', () => {
diff --git a/test/adapters/node-firebird_test.js b/test/adapters/node-firebird_test.js
index a546466..751d7a1 100644
--- a/test/adapters/node-firebird_test.js
+++ b/test/adapters/node-firebird_test.js
@@ -14,48 +14,43 @@
let adapterName = 'node-firebird';
let Firebird = reload(adapterName);
const config = reload('../config.json')[adapterName];
- config.conn.database = path.join(__dirname, config.conn.database);
- let nodeQuery = reload('../../lib/NodeQuery');
+ config.connection.database = path.join(__dirname, config.connection.database);
+ let nodeQuery = reload('../../lib/NodeQuery')(config);
- let qb = null;
+ let qb = nodeQuery.getQuery();
// Skip on TravisCi
if (process.env.CI) {
return;
}
- // Promisifying the connection seems to be the only way to get
- // this test suite to run consistently.
- promisify(Firebird.attach)(config.conn).then(db => {
- qb = nodeQuery.init('firebird', db, adapterName);
- suite('Firebird adapter tests -', () => {
- test('nodeQuery.getQuery = nodeQuery.init', () => {
- expect(nodeQuery.getQuery())
- .to.be.deep.equal(qb);
- });
- test('insertBatch throws error', () => {
- expect(() => {
- qb.driver.insertBatch('create_test', []);
- }).to.throw(Error, 'Not Implemented');
- });
- /*---------------------------------------------------------------------------
- Callback Tests
- ---------------------------------------------------------------------------*/
- testRunner(qb, (err, done) => {
- expect(err).is.not.ok;
- done();
- });
- /*---------------------------------------------------------------------------
- Promise Tests
- ---------------------------------------------------------------------------*/
- /*qb.adapter.execute(qb.driver.truncate('create_test')).then(() => {
- promiseTestRunner(qb);
- });*/
- suiteTeardown(() => {
- qb.end();
- });
+ suite('Firebird adapter tests -', () => {
+ test('nodeQuery.getQuery = nodeQuery.init', () => {
+ expect(nodeQuery.getQuery())
+ .to.be.deep.equal(qb);
+ });
+ test('insertBatch throws error', () => {
+ expect(() => {
+ qb.driver.insertBatch('create_test', []);
+ }).to.throw(Error, 'Not Implemented');
+ });
+
+ //---------------------------------------------------------------------------
+ // Callback Tests
+ //---------------------------------------------------------------------------
+ testRunner(qb, (err, done) => {
+ expect(err).is.not.ok;
+ done();
+ });
+
+ //---------------------------------------------------------------------------
+ // Promise Tests
+ //---------------------------------------------------------------------------
+ qb.adapter.execute(qb.driver.truncate('create_test')).then(() => {
+ promiseTestRunner(qb);
+ });
+ suiteTeardown(() => {
+ qb.end();
});
- }).catch(err => {
- throw new Error(err);
});
})();
diff --git a/test/adapters/pg_test.js b/test/adapters/pg_test.js
index 935ca59..becb2f2 100644
--- a/test/adapters/pg_test.js
+++ b/test/adapters/pg_test.js
@@ -6,26 +6,19 @@ let configFile = (process.env.CI) ? '../config-travis.json' : '../config.json';
const reload = require('require-reload')(require);
reload.emptyCache();
const testBase = reload('../base');
-const expect = testBase.expect,
- promiseTestRunner = testBase.promiseTestRunner,
- testRunner = testBase.testRunner;
+const expect = testBase.expect;
+const promiseTestRunner = testBase.promiseTestRunner;
+const testRunner = testBase.testRunner;
// Load the test config file
let adapterName = 'pg';
let config = reload(configFile)[adapterName];
-// Set up the connection
-let pg = reload(adapterName);
-let connection = new pg.Client(config.conn);
-
// Set up the query builder object
-let nodeQuery = reload('../../lib/NodeQuery');
-let qb = nodeQuery.init('pg', connection);
+let nodeQuery = reload('../../lib/NodeQuery')(config);
+let qb = nodeQuery.getQuery();
suite('Pg adapter tests -', () => {
- suiteSetup(done => {
- return connection.connect(done);
- });
test('nodeQuery.getQuery = nodeQuery.init', () => {
expect(nodeQuery.getQuery())
.to.be.deep.equal(qb);
diff --git a/test/base_test.js b/test/base_test.js
index 81a4ac1..e8ccfb9 100644
--- a/test/base_test.js
+++ b/test/base_test.js
@@ -3,7 +3,7 @@
let expect = require('chai').expect,
reload = require('require-reload')(require),
glob = require('glob'),
- nodeQuery = reload('../lib/NodeQuery'),
+ nodeQuery = reload('../lib/NodeQuery')(),
Adapter = reload('../lib/Adapter');
suite('Base tests -', () => {
diff --git a/test/config-travis.json b/test/config-travis.json
index 6a6bc62..bff8fa9 100644
--- a/test/config-travis.json
+++ b/test/config-travis.json
@@ -1,16 +1,7 @@
{
"mysql": {
"driver": "mysql",
- "conn": {
- "host": "localhost",
- "user": "root",
- "password": "",
- "database": "test"
- }
- },
- "mysql2": {
- "driver": "mysql",
- "conn": {
+ "connection": {
"host": "localhost",
"user": "root",
"password": "",
@@ -21,6 +12,15 @@
"driver": "pg",
"conn": "postgres://postgres@localhost/test"
},
+ "pg-object": {
+ "driver": "pg",
+ "connection": {
+ "host": "localhost",
+ "user": "postgres",
+ "password": "",
+ "database": "test"
+ }
+ },
"dblite": {
"driver": "sqlite",
"conn": ":memory:"
diff --git a/test/config.json b/test/config.json
index 8750235..de8c08c 100644
--- a/test/config.json
+++ b/test/config.json
@@ -1,16 +1,7 @@
{
- "mysql": {
- "driver": "mysql",
- "conn": {
- "host": "localhost",
- "user": "test",
- "password": "",
- "database": "test"
- }
- },
"mysql2": {
"driver": "mysql",
- "conn": {
+ "connection": {
"host": "localhost",
"user": "test",
"password": "",
@@ -19,15 +10,24 @@
},
"pg": {
"driver": "pg",
- "conn": "postgres://test:test@localhost/test"
+ "connection": "postgres://test:test@localhost/test"
+ },
+ "pg-object": {
+ "driver": "pg",
+ "connection": {
+ "host": "localhost",
+ "user": "test",
+ "password": "test",
+ "database": "test"
+ }
},
"dblite": {
"driver": "sqlite",
- "conn": ":memory:"
+ "connection": ":memory:"
},
"node-firebird": {
"driver": "firebird",
- "conn": {
+ "connection": {
"host": "127.0.0.1",
"database": "/../FB_TEST_DB.FDB",
"user": "SYSDBA",