From 2ce81681d69a88ea256140ef65e62fc79b0fd0c3 Mon Sep 17 00:00:00 2001 From: Raymond Feng Date: Mon, 14 Oct 2013 14:32:19 -0700 Subject: [PATCH] Use the columnEscaped for names --- lib/mysql.js | 51 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/lib/mysql.js b/lib/mysql.js index 281d4f7..275da16 100644 --- a/lib/mysql.js +++ b/lib/mysql.js @@ -176,7 +176,7 @@ MySQL.prototype.updateOrCreate = function (model, data, callback) { var props = this._models[model].properties; Object.keys(data).forEach(function (key) { if (props[key] || mysql.id(model, key)) { - var k = '`' + key + '`'; + var k = mysql.columnEscaped(model, key); var v; if (!mysql.id(model, key)) { v = mysql.toDatabase(props[key], data[key]); @@ -203,13 +203,14 @@ MySQL.prototype.updateOrCreate = function (model, data, callback) { }; MySQL.prototype.toFields = function (model, data) { + var self = this; var fields = []; var props = this._models[model].properties; Object.keys(data).forEach(function (key) { if (props[key]) { var value = this.toDatabase(props[key], data[key]); if ('undefined' === typeof value) return; - fields.push('`' + key.replace(/\./g, '`.`') + '` = ' + value); + fields.push(self.columnEscaped(model, key) + ' = ' + value); } }.bind(this)); return fields.join(','); @@ -353,7 +354,7 @@ function buildWhere(self, model, conds) { var cs = []; Object.keys(conds).forEach(function (key) { - var keyEscaped = '`' + key.replace(/\./g, '`.`') + '`'; + var keyEscaped = self.columnEscaped(model, key); var val = self.toDatabase(props[key], conds[key]); if (conds[key] === null || conds[key] === undefined) { cs.push(keyEscaped + ' IS NULL'); @@ -402,14 +403,16 @@ function buildWhere(self, model, conds) { return 'WHERE ' + cs.join(' AND '); } -function buildOrderBy(order) { +function buildOrderBy(self, model, order) { if (typeof order === 'string') { order = [order]; } return 'ORDER BY ' + order.map(function(o) { var t = o.split(/[\s,]+/); - if (t.length === 1) return '`' + o + '`'; - return '`' + t[0] + '` ' + t[1]; + if (t.length === 1) { + return self.columnEscaped(model, o); + } + return self.columnEscaped(model, t[0]) + ' ' + t[1]; }).join(', '); } @@ -444,7 +447,7 @@ MySQL.prototype.all = function all(model, filter, callback) { } if (filter.order) { - sql += ' ' + buildOrderBy(filter.order); + sql += ' ' + buildOrderBy(self, model, filter.order); } if (filter.limit) { @@ -742,11 +745,35 @@ MySQL.prototype.alterTable = function (model, actualFields, actualIndexes, done, MySQL.prototype.propertiesSQL = function (model) { var self = this; + + var pks = this.idNames(model).map(function (i) { + return self.columnEscaped(model, i); + }); + + var sql = []; + if (pks.length === 1) { + var idName = this.idName(model); + sql.push(self.columnEscaped(model, idName) + ' INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY'); + } + Object.keys(this._models[model].properties).forEach(function (prop) { + if (self.id(model, prop) && pks.length === 1) { + return; + } + var colName = self.columnEscaped(model, prop); + sql.push(colName + ' ' + self.propertySettingsSQL(model, prop)); + }); + if (pks.length > 1) { + sql.push('PRIMARY KEY(' + pks.join(',') + ')'); + } + + /* var sql = ['`id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY']; Object.keys(this._models[model].properties).forEach(function (prop) { if (self.id(model, prop)) return; sql.push('`' + prop + '` ' + self.propertySettingsSQL(model, prop)); }); + */ + // Declared in model index property indexes. Object.keys(this._models[model].properties).forEach(function (prop) { var i = self._models[model].properties[prop].index; @@ -775,10 +802,11 @@ MySQL.prototype.singleIndexSettingsSQL = function (model, prop) { if (i.kind) { kind = i.kind; } + var columnName = this.columnEscaped(model, prop); if (kind && type) { - return (kind + ' INDEX `' + prop + '` (`' + prop + '`) ' + type); + return (kind + ' INDEX ' + columnName + ' (' + columnName + ') ' + type); } else { - return (kind + ' INDEX `' + prop + '` ' + type + ' (`' + prop + '`) '); + return (kind + ' INDEX ' + columnName + ' ' + type + ' (' + columnName + ') '); } }; @@ -793,10 +821,11 @@ MySQL.prototype.indexSettingsSQL = function (model, prop) { if (i.kind) { kind = i.kind; } + var columnName = this.columnEscaped(model, prop); if (kind && type) { - return (kind + ' INDEX `' + prop + '` (' + i.columns + ') ' + type); + return (kind + ' INDEX ' + columnName + ' (' + i.columns + ') ' + type); } else { - return (kind + ' INDEX ' + type + ' `' + prop + '` (' + i.columns + ')'); + return (kind + ' INDEX ' + type + ' ' + columnName + ' (' + i.columns + ')'); } };