Skip to content
Snippets Groups Projects
index.js 2.26 KiB
Newer Older
  • Learn to ignore specific revisions
  • Hossam Fares's avatar
    Hossam Fares committed
    /* jshint strict: true */
    
    'use strict';
    
    
    var Q = require('q');
    var mysql2 = require('mysql2');
    var instances = {};
    
    Hossam Fares's avatar
    Hossam Fares committed
    
    function DB() {
    
        this.pool = null;
    
    Hossam Fares's avatar
    Hossam Fares committed
    }
    
    /**
     * Setup the Database connection pool for this instance
     * @param  {Object} config
     */
    
    DB.prototype.configure = function(config) {
        this.pool = mysql2.createPool(config);
    
    Hossam Fares's avatar
    Hossam Fares committed
    };
    
    /**
     * Run DB query
     * @param  {String} query
     * @param  {Object} [params]
     * @return {Promise}
     */
    
    DB.prototype.query = function(query, params) {
        params = params || {};
        var db = this;
    
        return Q.Promise(function(resolve, reject) {
            db.pool.getConnection(function(err, con) {
                if (err) {
                    if (con) {
                        con.release();
                    }
    
                    return reject(err);
                }
    
                con.query(query, params, function(err) {
                    if (err) {
                        if (con) {
                            con.release();
                        }
    
                        return reject(err);
                    }
    
                    resolve([].splice.call(arguments, 1));
                    con.release();
                });
            });
    
    Hossam Fares's avatar
    Hossam Fares committed
        });
    };
    
    /**
     * Run DB execute
     * @param  {String} query
     * @param  {Object} [params]
     * @return {Promise}
     */
    
    DB.prototype.execute = function(query, params) {
        params = params || {};
        var db = this;
    
        return Q.Promise(function(resolve, reject) {
            db.pool.getConnection(function(err, con) {
                if (err) {
                    if (con) {
                        con.release();
                    }
    
                    return reject(err);
                }
    
                con.execute(query, params, function(err) {
                    if (err) {
                        if (con) {
                            con.unprepare(query);
                            con.release();
                        }
    
                        return reject(err);
                    }
    
                    resolve([].splice.call(arguments, 1));
                    con.unprepare(query);
                    con.release();
                });
            });
    
    Hossam Fares's avatar
    Hossam Fares committed
        });
    };
    
    
    Jonas Leder's avatar
    Jonas Leder committed
     * Disconnect from database
    
     */
    DB.prototype.end = function() {
        var db = this;
        db.end();
    };
    
    module.exports = function(name) {
        name = name || '_default_';
    
        if (!instances[name]) {
            instances[name] = new DB();
        }
    
        return instances[name];
    };