From 7b2482ad991065d15570ebd9b3d6e37735f4e4ee Mon Sep 17 00:00:00 2001 From: Timothy J Warren Date: Thu, 10 Nov 2016 20:15:16 -0500 Subject: [PATCH] Revert "Remove Firebird." This reverts commit 8f0b394d3c60bf19a3b7a819d6ed1c66a32c1f25. --- lib/adapters/Firebird.js | 58 +++++++++++++++++++++++++++++ lib/drivers/Firebird.js | 46 +++++++++++++++++++++++ test/adapters/node-firebird_test.js | 56 ++++++++++++++++++++++++++++ 3 files changed, 160 insertions(+) create mode 100644 lib/adapters/Firebird.js create mode 100644 lib/drivers/Firebird.js create mode 100644 test/adapters/node-firebird_test.js diff --git a/lib/adapters/Firebird.js b/lib/adapters/Firebird.js new file mode 100644 index 0000000..480893f --- /dev/null +++ b/lib/adapters/Firebird.js @@ -0,0 +1,58 @@ +'use strict'; + +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; + + if (err) { + throw new Error(err); + } + }); + } + + /** + * 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|Promise} - Returns a promise if no callback is provided + */ + execute(/*sql, params, callback*/) { + let args = getArgs('sql:string, [params], [callback]:function', arguments); + + if (! args.callback) { + //return instance.queryAsync(args.sql, args.params); + if (! args.callback) { + return new Promise((resolve, reject) => { + this.instance.query(args.sql, args.params, (err, result) => { + if (err) { + return reject(err); + } + + return resolve(result); + }); + }); + } + } + + return this.instance.query(args.sql, args.params, args.callback); + } + + /** + * Close the current database connection + * @return {void} + */ + close() { + this.instance.detach(); + } +} + +module.exports = Firebird; \ No newline at end of file diff --git a/lib/drivers/Firebird.js b/lib/drivers/Firebird.js new file mode 100644 index 0000000..7f6d93c --- /dev/null +++ b/lib/drivers/Firebird.js @@ -0,0 +1,46 @@ +'use strict'; + +let helpers = require('../helpers'); + +/** + * Driver for Firebird databases + * + * @module drivers/firebird + */ +module.exports = (() => { + delete require.cache[require.resolve('../Driver')]; + let driver = require('../Driver'); + + driver.hasTruncate = false; + + /** + * Set the limit clause + + * @param {String} origSql - SQL statement to modify + * @param {Number} limit - Maximum number of rows to fetch + * @param {Number|null} offset - Number of rows to skip + * @return {String} - Modified SQL statement + */ + driver.limit = (origSql, limit, offset) => { + let sql = `FIRST ${limit}`; + + if (helpers.isNumber(offset)) + { + sql += ` SKIP ${offset}`; + } + + return origSql.replace(/SELECT/i, `SELECT ${sql}`); + }; + + /** + * SQL to insert a group of rows + * + * @return {void} + * @throws {Error} + */ + driver.insertBatch = () => { + throw new Error('Not Implemented'); + }; + + return driver; +})(); \ No newline at end of file diff --git a/test/adapters/node-firebird_test.js b/test/adapters/node-firebird_test.js new file mode 100644 index 0000000..106ca6f --- /dev/null +++ b/test/adapters/node-firebird_test.js @@ -0,0 +1,56 @@ +'use strict'; + +(() => { + // Load the test base + const path = require('path'); + const reload = require('require-reload')(require); + const testBase = reload('../base'); + const promisify = require('../../lib/promisify'); + const expect = reload('chai').expect; + const testRunner = testBase.testRunner; + const promiseTestRunner = testBase.promiseTestRunner; + + // Skip on CI + if (process.env.CI || process.env.TRAVIS) { + return; + } + + // Load the test config file + let adapterName = 'node-firebird'; + let Firebird = reload(adapterName); + const config = reload('../config.json')[adapterName]; + config.connection.database = path.join(__dirname, config.connection.database); + let nodeQuery = reload('../../lib/NodeQuery')(config); + + let qb = nodeQuery.getQuery(); + + 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(); + }); + }); +})();