timw4mail/node-query

View on GitHub
lib/NodeQuery.js

Summary

Maintainability
A
0 mins
Test Coverage
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'],
    ['sqlserver', 'MSSQLServer'],
    ['mssql', 'MSSQLServer']
]);

/**
 * Class for connection management
 *
 * @param {object} config - connection parameters
 */
class NodeQuery {
    /**
     * Constructor
     *
     * @param {object} config - connection parameters
     * @param {string} config.driver - the database driver to use, such as mysql, sqlite, mssql, or pgsql
     * @param {object|string} config.connection - the connection options for the database
     * @param {string} config.connection.host - the ip or hostname of the database server
     * @param {string} config.connection.user - the user to log in as
     * @param {string} config.connection.password - the password to log in with
     * @param {string} config.connection.database - the name of the database to connect to
     * @example let nodeQuery = require('ci-node-query')({
     *     driver: 'mysql',
     *     connection: {
     *         host: 'localhost',
     *         user: 'root',
     *         password: '',
     *         database: 'mysql'
     *     }
     * });
     * @example let nodeQuery = require('ci-node-query')({
     *     driver: 'sqlite',
     *     connection: ':memory:'
     * });
     */
    constructor (config) {
        this.instance = null;

        if (config !== undefined) {
            const driverName = dbDriverMap.get(config.driver);

            if (!driverName) {
                throw new Error(`Selected driver (${config.driver}) does not exist!`);
            }

            const driver = require(`./drivers/${driverName}`);
            const Adapter = require(`./adapters/${driverName}`);

            this.instance = new QueryBuilder(driver, Adapter(config));
        }
    }

    /**
     * Return an existing query builder instance
     *
     * @return {QueryBuilder} - The Query Builder object
     */
    getQuery () {
        if (this.instance == null) {
            throw new Error('No Query Builder instance to return');
        }

        return this.instance;
    }
}

module.exports = config => new NodeQuery(config);