Skip to content

Commit

Permalink
provide back ticks in adapter
Browse files Browse the repository at this point in the history
provide a means of upserting aout of adapter
provide tests ensuring it works
  • Loading branch information
robertleeplummerjr committed Feb 5, 2016
1 parent fc923c1 commit 7fefef1
Show file tree
Hide file tree
Showing 2 changed files with 127 additions and 34 deletions.
146 changes: 113 additions & 33 deletions lib/adapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,13 @@ var escapeMap = {
// '%' : '\\%',
// '_' : '\_'
};


var defaults = {
keep_db: true,
offset: true,
back_ticks: false
};

function escape(str) {
var res = [];
var c, e;
Expand Down Expand Up @@ -212,7 +218,7 @@ function js2nSQLExpr(val) {
obj.type = 'object';
obj.value = val;
}
break
break;
default:
obj.type = 'unknown';
}
Expand All @@ -231,7 +237,7 @@ function unionToSQL(s, options) {
res.push(str);
while (s._next) {
str = selectToSQL(s._next, options);
res.push('UNION')
res.push('UNION');
res.push(str);
s = s._next;
}
Expand All @@ -248,9 +254,7 @@ function selectToSQL(s, options) {
var limit = s.limit;

var clauses = [];
var i, str;

options = options || {};
var i, str, p;

clauses.push('SELECT');
//distinct
Expand Down Expand Up @@ -281,7 +285,7 @@ function selectToSQL(s, options) {
var cs = [];
var tbase = from[0];
str = tbase.table;
if (options.keep_db !== false && tbase.db != '') {
if (options.keep_db && tbase.db !== '') {
str = tbase.db + '.' + str;
}
if (tbase.as != '') {
Expand All @@ -290,15 +294,19 @@ function selectToSQL(s, options) {
cs.push(str);
for (i = 1; i < from.length; i++) {
var tref = from[i];
if (tref.join && tref.join != '') {
if (tref.join && tref.join !== '') {
str = ' ' + tref.join + ' ';
} else {
str = ', ';
}
if (options.keep_db !== false && tref.db != '') {
if (options.keep_db && tref.db !== '') {
str += (tref.db + '.');
}
str += tref.table;
if (options.back_ticks) {
str += '`' + tref.table + '`';
} else {
str += tref.table;
}

if (tref.as != '') {
str += ' AS ' + tref.as
Expand Down Expand Up @@ -362,15 +370,22 @@ function updateToSQL(stmt, options) {
var cs = [];
var sets = stmt.set;
var i, ele, str;
for (i = 0; i < sets.length; i++) {
str = sets[i].column + ' = ' + exprToSQL(sets[i].value);
cs.push(str);
if (options.back_ticks) {
for (i = 0; i < sets.length; i++) {
str = '`' + sets[i].column + '` = ' + exprToSQL(sets[i].value);
cs.push(str);
}
} else {
for (i = 0; i < sets.length; i++) {
str = sets[i].column + ' = ' + exprToSQL(sets[i].value);
cs.push(str);
}
}

res.push(cs.join(', '));

if (stmt.where && stmt.where != '') {
str = 'WHERE '
str = 'WHERE ';
str += exprToSQL(stmt.where);
res.push(str);
}
Expand All @@ -379,37 +394,102 @@ function updateToSQL(stmt, options) {

function replace_insertToSQL(stmt, options) {
options = options || {};
var res = [];
var res = [], i = 0;
res.push(stmt.type.toUpperCase());
res.push('INTO')
if (options.keep_db === false) {
res.push(stmt.table);
res.push('INTO');
if (options.back_ticks) {
if (options.keep_db === false || stmt.db === '') {
res.push('`' + stmt.table + '`');
} else {
res.push(stmt.db + '.' + '`' + stmt.table + '`');
}
} else {
res.push(stmt.db + '.' + stmt.table);
if (options.keep_db === false || stmt.db === '') {
res.push(stmt.table);
} else {
res.push(stmt.db + '.' + stmt.table);
}
}

res.push('(' + stmt.columns.join(', ') + ')');
res.push('VALUES')
if (stmt.columns) {
if (options.back_ticks) {
res.push('(`' + stmt.columns.join('`, `') + '`)');
} else {
res.push('(' + stmt.columns.join(', ') + ')');
}

var i, ele, str;
var cs = [];
var vs = stmt.values;
for (i = 0; i < vs.length; i++) {
var es = vs[i].value;
var rs = [];
for (var j = 0; j < es.length; j++) {
rs.push(exprToSQL(es[j]));

res.push('VALUES');

var ele, str;
var cs = [];
var vs = stmt.values;
for (; i < vs.length; i++) {
var es = vs[i].value;
var rs = [];
for (var j = 0; j < es.length; j++) {
rs.push(exprToSQL(es[j]));
}
cs.push('(' + rs.join(', ') + ')');
}
cs.push('(' + rs.join(', ') + ')');
res.push(cs.join(', '));
} else if (stmt.set) {
res.push('SET');
var record;
var columns = [];
if (options.back_ticks) {
for (; i < stmt.set.length; i++) {
record = stmt.set[i];
columns.push('`' + record.column + '` = ' + exprToSQL(record.value));
}
} else {
for (; i < stmt.set.length; i++) {
record = stmt.set[i];
columns.push(record.column + ' = ' + exprToSQL(record.value));
}
}
res.push(columns.join(', '));
}
res.push(cs.join(', '));

return res.join(' ');
}

function duplicateSetToSql(stmt, options) {
if (!stmt.duplicateSet) return '';

var result = [];
var i = 0;
var dSet = stmt.duplicateSet;
var max = dSet.length;
var record;
var columns = '';

if (options.back_ticks) {
for (; i < max; i++) {
record = dSet[i];
result.push('`' + record.column + '` = ' + exprToSQL(record.value));
}
} else {
for (; i < max; i++) {
record = dSet[i];
result.push(record.column + ' = ' + exprToSQL(record.value))
}
}

return ' ON DUPLICATE KEY UPDATE ' + result.join(', ');
}

exports.toSQL = function (stmt, options) {
var res ;
var res, p;

options = options || {};

for (p in defaults) {
if (defaults.hasOwnProperty(p)) {
options[p] = options.hasOwnProperty(p) ? options[p] : defaults[p];
}
}

switch (stmt.type) {
case 'select' :
res = unionToSQL(stmt, options);
Expand All @@ -419,7 +499,7 @@ exports.toSQL = function (stmt, options) {
break;
case 'insert' :
case 'replace':
res = replace_insertToSQL(stmt, options);
res = replace_insertToSQL(stmt, options) + duplicateSetToSql(stmt, options);
break;
case 'delete' :
res = deleteToSQL(stmt, options);
Expand Down
15 changes: 14 additions & 1 deletion test/unit/upsert.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
var should = require('should');
var Parser = require('../../lib/parser');
var Adapter = require('../../lib/adapter');

function inspect(obj) {
console.log(require('util').inspect(obj, false, 10, true));
}

describe('upsert test',function(){
it('insert test', function() {
it('should parse', function() {
var sql, ast;

sql = "INSERT INTO `user_info` SET `last_login_time` = '2012-12-18 12:44:21', `last_login_ip` = 'hohoo' ON duplicate KEY UPDATE `last_login_time` = '2012-12-18 12:44:21', `last_login_ip` = 'hohoo'";
Expand Down Expand Up @@ -42,3 +43,15 @@ describe('upsert test',function(){
});
});

describe('upsert test',function(){
it('should be able to adapt out', function() {
var sql, ast;

sql = "INSERT INTO `user_info` SET `last_login_time` = '2012-12-18 12:44:21', `last_login_ip` = 'hohoo' ON DUPLICATE KEY UPDATE `last_login_time` = '2012-12-18 12:44:21', `last_login_ip` = 'hohoo'";

ast = Parser.parse(sql);

Adapter.toSQL(ast, { back_ticks: true }).should.eql(sql);
});
});

0 comments on commit 7fefef1

Please sign in to comment.