databridge
Version:
Data bridging software to modularize, automate and schedule the transfer of data between different sources and destinations.
70 lines (59 loc) • 2.11 kB
JavaScript
module.exports = function(query, opt, moduleCallback) {
//read query, check binds, prompt or use defBinds
let qBinds = []
//remove comments
let sql = query.replace(/\/\*[.\s\S]*?\*\/|--.*?[\n\r]/g, '')
//find binds
//bindPattern = /[:].[a-z_0-9]+/g;
//now bind pattern ignores : inside quotes (date formats)
const bindPattern = /[:].[A-Za-z_0-9]+(?=([^']*'[^']*')*[^']*$)/g
//extend config binds with any attached to opt
const defBinds = Object.assign({}, opt.cfg.defaultBindVars, opt.binds)
const spinner = opt.spinner
//loop through query looking for binds
let result
while ((result = bindPattern.exec(sql))) {
var r = result[0].replace(':', '');
if (qBinds.indexOf(r) == -1) qBinds.push(r);
}
//if no binds in query, return the query file
if (!qBinds.length) return moduleCallback(null, sql, defBinds);
const replaceBinds = (query, binds) => {
qBinds.forEach(v => {
try {
//try replacing all binds with default
query = query.replace(new RegExp(':' + v, 'g'), binds[v]);
} catch (e) {
return moduleCallback('Problem finding bind for "' + r + '"' + e);
}
})
return query;
}
//check to see if ALL binds are present in defBinds AND opt.binds is present
if (opt.binds && qBinds.every(v => Object.keys(defBinds).indexOf(v) >= 0)) {
//return formatted query
var q = replaceBinds(sql, defBinds);
return moduleCallback(null, q, defBinds);
}
//if not using defBinds, prompt
const prompt = require('prompt')
const colors = require('colors')
let prompts = {
properties: {
}
}
prompt.message = colors.green('Enter bind variable')
qBinds.forEach(b => {
prompts.properties[b] = {
default: defBinds[b],
description: colors.green(b)
}
})
if (spinner) spinner.stop(true)
prompt.start()
prompt.get(prompts, (err, res) => {
if (err) return moduleCallback(err);
if (spinner) spinner.start()
moduleCallback(null, replaceBinds(sql, res), res);
});
};