sql-templar
Version:
A sql template module that takes a template based approach to mysql queries
87 lines (73 loc) • 2.13 kB
JavaScript
var mysql = require('mysql');
var fs = require('fs');
var _ = require('underscore');
var log = console.log;
var ONE_MINUTE = 60000;
var where2 = require('where2');
var templates = {};
module.exports = function(config) {
if (!config.db) {
if (!config.pool) {
throw new Error('database configuration info is required!');
}
}
var dir = './sql';
var ext = 'sql';
var timeout = ONE_MINUTE;
if (config.templates && config.templates.dir) {
dir = config.templates.dir;
}
if (config.templates && config.templates.ext) {
ext = config.templates.ext;
}
if (config.timeout) { timeout = config.timeout; }
// load templates
var files = _(fs.readdirSync(dir)).filter(function (file) {
return (new RegExp('.' + ext + '$')).test(file);
});
_(files).each(function(file) {
templates[file.split('.').shift()] = fs.readFileSync(dir + '/' + file).toString();
});
var pool;
if(config.pool) {
pool = config.pool;
} else {
pool = mysql.createPool(config.db);
}
// perform query
var exec = function(name, params, cb) {
pool.getConnection(function(err, conn) {
if(err) { return cb(err); }
if (typeof params === 'function') {
cb = params;
params = null;
}
if (!templates[name]) { return cb(new Error('sql-templar: Template not found!')); }
if (params && _(params).isObject() && !_(params).isArray()) {
// assume ? in sql string
// build where and replace ? with where
params = where2(params);
sql = templates[name].replace('?', params);
conn.query(sql, handleResponse);
} else if (params && _(params).isArray()) {
conn.query(templates[name], params, handleResponse);
} else {
conn.query(templates[name], handleResponse);
}
function handleResponse(err, rows) {
conn.release();
cb(err,rows);
}
});
};
process.setMaxListeners(100);
// close connection on exit()
process.once('exit', function() {
if (pool) {
pool.end();
}
});
return Object.freeze({
exec: exec
});
};