Skip to content
Snippets Groups Projects
index.js 1.75 KiB
Newer Older
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;
}

/**
 * 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;
Hossam Fares's avatar
Hossam Fares committed

  return Q.Promise(function (resolve, reject) {
    db.pool.getConnection(function (err, con) {
Hossam Fares's avatar
Hossam Fares committed
      if (err) {
        if (con) {
          con.release();
        }

        reject(err);
Hossam Fares's avatar
Hossam Fares committed
      }

      con.query(query, params, function (err) {
        if (err) {
          if (con) {
            con.release();
          }
          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;
Hossam Fares's avatar
Hossam Fares committed

  return Q.Promise(function (resolve, reject) {
    db.pool.getConnection(function (err, con) {
Hossam Fares's avatar
Hossam Fares committed
      if (err) {
        if (con) {
          con.release();
        }

        reject(err);
Hossam Fares's avatar
Hossam Fares committed
      }

      con.execute(query, params, function (err) {
        if (err) {
          if (con) {
            con.release();
          }
          reject(err);
        }

        resolve([].splice.call(arguments, 1));
        con.release();
      });
Hossam Fares's avatar
Hossam Fares committed
    });
  });
};

module.exports = function (name) {
  name = name || '_default_';
Hossam Fares's avatar
Hossam Fares committed
  if (!instances[name]) {
    instances[name] = new DB();
  }
Hossam Fares's avatar
Hossam Fares committed
  return instances[name];
};