不要怂,就是干,撸起袖子干!

Commit a8efaea4 by Sascha Depold

made addQuotes and removeQuotes parts of the QueryGenerator

1 parent 7139a630
...@@ -20,20 +20,20 @@ module.exports = (function() { ...@@ -20,20 +20,20 @@ module.exports = (function() {
if (Utils._.includes(dataType, 'PRIMARY KEY')) { if (Utils._.includes(dataType, 'PRIMARY KEY')) {
primaryKeys.push(attr) primaryKeys.push(attr)
attrStr.push(Utils.addTicks(attr) + " " + dataType.replace(/PRIMARY KEY/, '')) attrStr.push(QueryGenerator.addQuotes(attr) + " " + dataType.replace(/PRIMARY KEY/, ''))
} else { } else {
attrStr.push(Utils.addTicks(attr) + " " + dataType) attrStr.push(QueryGenerator.addQuotes(attr) + " " + dataType)
} }
} }
} }
var values = { var values = {
table: Utils.addTicks(tableName), table: QueryGenerator.addQuotes(tableName),
attributes: attrStr.join(", "), attributes: attrStr.join(", "),
engine: options.engine, engine: options.engine,
charset: (options.charset ? "DEFAULT CHARSET=" + options.charset : "") charset: (options.charset ? "DEFAULT CHARSET=" + options.charset : "")
} }
, pkString = primaryKeys.map(function(pk) { return Utils.addTicks(pk) }).join(", ") , pkString = primaryKeys.map(function(pk) { return QueryGenerator.addQuotes(pk) }).join(", ")
if (pkString.length > 0) { if (pkString.length > 0) {
values.attributes += ", PRIMARY KEY (" + pkString + ")" values.attributes += ", PRIMARY KEY (" + pkString + ")"
...@@ -47,7 +47,9 @@ module.exports = (function() { ...@@ -47,7 +47,9 @@ module.exports = (function() {
var query = "DROP TABLE IF EXISTS <%= table %>;" var query = "DROP TABLE IF EXISTS <%= table %>;"
return Utils._.template(query)({table: Utils.addTicks(tableName)}) return Utils._.template(query)({
table: QueryGenerator.addQuotes(tableName)
})
}, },
renameTableQuery: function(before, after) { renameTableQuery: function(before, after) {
...@@ -118,12 +120,12 @@ module.exports = (function() { ...@@ -118,12 +120,12 @@ module.exports = (function() {
, table = null , table = null
options = options || {} options = options || {}
options.table = table = Array.isArray(tableName) ? tableName.map(function(tbl){ return Utils.addTicks(tbl) }).join(", ") : Utils.addTicks(tableName) options.table = table = Array.isArray(tableName) ? tableName.map(function(tbl){ return QueryGenerator.addQuotes(tbl) }).join(", ") : QueryGenerator.addQuotes(tableName)
options.attributes = options.attributes && options.attributes.map(function(attr){ options.attributes = options.attributes && options.attributes.map(function(attr){
if(Array.isArray(attr) && attr.length == 2) { if(Array.isArray(attr) && attr.length == 2) {
return [attr[0], Utils.addTicks(attr[1])].join(' as ') return [attr[0], QueryGenerator.addQuotes(attr[1])].join(' as ')
} else { } else {
return attr.indexOf(Utils.TICK_CHAR) < 0 ? Utils.addTicks(attr) : attr return attr.indexOf(Utils.TICK_CHAR) < 0 ? QueryGenerator.addQuotes(attr) : attr
} }
}).join(", ") }).join(", ")
options.attributes = options.attributes || '*' options.attributes = options.attributes || '*'
...@@ -159,7 +161,7 @@ module.exports = (function() { ...@@ -159,7 +161,7 @@ module.exports = (function() {
} }
if (options.group) { if (options.group) {
options.group = Array.isArray(options.group) ? options.group.map(function(grp){return Utils.addTicks(grp)}).join(', ') : Utils.addTicks(options.group) options.group = Array.isArray(options.group) ? options.group.map(function(grp){return QueryGenerator.addQuotes(grp)}).join(', ') : QueryGenerator.addQuotes(options.group)
query += " GROUP BY <%= group %>" query += " GROUP BY <%= group %>"
} }
...@@ -187,8 +189,8 @@ module.exports = (function() { ...@@ -187,8 +189,8 @@ module.exports = (function() {
var query = "INSERT INTO <%= table %> (<%= attributes %>) VALUES (<%= values %>);" var query = "INSERT INTO <%= table %> (<%= attributes %>) VALUES (<%= values %>);"
var replacements = { var replacements = {
table: Utils.addTicks(tableName), table: QueryGenerator.addQuotes(tableName),
attributes: Object.keys(attrValueHash).map(function(attr){return Utils.addTicks(attr)}).join(","), attributes: Object.keys(attrValueHash).map(function(attr){return QueryGenerator.addQuotes(attr)}).join(","),
values: Utils._.values(attrValueHash).map(function(value){ values: Utils._.values(attrValueHash).map(function(value){
return Utils.escape((value instanceof Date) ? Utils.toSqlDate(value) : value) return Utils.escape((value instanceof Date) ? Utils.toSqlDate(value) : value)
}).join(",") }).join(",")
...@@ -207,11 +209,11 @@ module.exports = (function() { ...@@ -207,11 +209,11 @@ module.exports = (function() {
var value = attrValueHash[key] var value = attrValueHash[key]
, _value = (value instanceof Date) ? Utils.toSqlDate(value) : value , _value = (value instanceof Date) ? Utils.toSqlDate(value) : value
values.push(Utils.addTicks(key) + "=" + Utils.escape(_value)) values.push(QueryGenerator.addQuotes(key) + "=" + Utils.escape(_value))
} }
var replacements = { var replacements = {
table: Utils.addTicks(tableName), table: QueryGenerator.addQuotes(tableName),
values: values.join(","), values: values.join(","),
where: QueryGenerator.getWhereConditions(where) where: QueryGenerator.getWhereConditions(where)
} }
...@@ -225,7 +227,7 @@ module.exports = (function() { ...@@ -225,7 +227,7 @@ module.exports = (function() {
var query = "DELETE FROM <%= table %> WHERE <%= where %> LIMIT <%= limit %>" var query = "DELETE FROM <%= table %> WHERE <%= where %> LIMIT <%= limit %>"
var replacements = { var replacements = {
table: Utils.addTicks(tableName), table: QueryGenerator.addQuotes(tableName),
where: QueryGenerator.getWhereConditions(where), where: QueryGenerator.getWhereConditions(where),
limit: Utils.escape(options.limit) limit: Utils.escape(options.limit)
} }
...@@ -243,11 +245,11 @@ module.exports = (function() { ...@@ -243,11 +245,11 @@ module.exports = (function() {
var value = attrValueHash[key] var value = attrValueHash[key]
, _value = (value instanceof Date) ? Utils.toSqlDate(value) : value , _value = (value instanceof Date) ? Utils.toSqlDate(value) : value
values.push(Utils.addTicks(key) + "=" + Utils.addTicks(key) + " + " +Utils.escape(_value)) values.push(QueryGenerator.addQuotes(key) + "=" + QueryGenerator.addQuotes(key) + " + " +Utils.escape(_value))
} }
var replacements = { var replacements = {
table: Utils.addTicks(tableName), table: QueryGenerator.addQuotes(tableName),
values: values.join(","), values: values.join(","),
where: QueryGenerator.getWhereConditions(where) where: QueryGenerator.getWhereConditions(where)
} }
...@@ -342,7 +344,7 @@ module.exports = (function() { ...@@ -342,7 +344,7 @@ module.exports = (function() {
var value = hash[key] var value = hash[key]
//handle qualified key names //handle qualified key names
var _key = key.split('.').map(function(col){return Utils.addTicks(col)}).join(".") var _key = key.split('.').map(function(col){return QueryGenerator.addQuotes(col)}).join(".")
, _value = null , _value = null
if (Array.isArray(value)) { if (Array.isArray(value)) {
...@@ -357,7 +359,7 @@ module.exports = (function() { ...@@ -357,7 +359,7 @@ module.exports = (function() {
// is value an object? // is value an object?
//using as sentinel for join column => value //using as sentinel for join column => value
_value = value.join.split('.').map(function(col){ return Utils.addTicks(col) }).join(".") _value = value.join.split('.').map(function(col){ return QueryGenerator.addQuotes(col) }).join(".")
result.push([_key, _value].join("=")) result.push([_key, _value].join("="))
} else { } else {
_value = Utils.escape(value) _value = Utils.escape(value)
...@@ -432,6 +434,14 @@ module.exports = (function() { ...@@ -432,6 +434,14 @@ module.exports = (function() {
} }
return fields return fields
},
addQuotes: function(s, quoteChar) {
return Utils.addTicks(s, quoteChar)
},
removeQuotes: function(s, quoteChar) {
return Utils.removeTicks(s, quoteChar)
} }
} }
......
...@@ -2,88 +2,7 @@ var Utils = require("../../utils") ...@@ -2,88 +2,7 @@ var Utils = require("../../utils")
, util = require("util") , util = require("util")
, DataTypes = require("../../data-types") , DataTypes = require("../../data-types")
, tables = {} , tables = {}
, primaryKeys = {}; , primaryKeys = {}
function removeQuotes(s, quoteChar) {
quoteChar = quoteChar || '"'
return s.replace(new RegExp(quoteChar, 'g'), '')
}
function addQuotes(s, quoteChar) {
quoteChar = quoteChar || '"'
return removeQuotes(s, quoteChar)
.split('.')
.map(function(e) { return quoteChar + String(e) + quoteChar })
.join('.')
}
function pgEscape(val) {
if (val === undefined || val === null) {
return 'NULL';
}
switch (typeof val) {
case 'boolean': return (val) ? 'true' : 'false';
case 'number': return val+'';
case 'object':
if (Array.isArray(val)) {
return 'ARRAY['+ val.map(function(it) { return pgEscape(it) }).join(',') +']';
}
}
if (val instanceof Date) {
val = pgSqlDate(val);
}
// http://www.postgresql.org/docs/8.2/static/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS
val = val.replace(/'/g, "''");
return "'"+val+"'";
}
function pgEscapeAndQuote(val) {
return addQuotes(removeQuotes(pgEscape(val), "'"))
}
function pgEnum(tableName, attr, dataType) {
var enumName = pgEscapeAndQuote("enum_" + tableName + "_" + attr)
return "DROP TYPE IF EXISTS " + enumName + "; CREATE TYPE " + enumName + " AS " + dataType.match(/^ENUM\(.+\)/)[0] + "; "
}
function padInt(i) {
return (i < 10) ? '0' + i.toString() : i.toString()
}
function pgSqlDate(dt) {
var date = [ dt.getUTCFullYear(), padInt(dt.getUTCMonth()+1), padInt(dt.getUTCDate()) ].join('-')
var time = [ dt.getUTCHours(), padInt(dt.getUTCMinutes()), padInt(dt.getUTCSeconds())].join(':')
return date + ' ' + time + '.' + ((dt.getTime() % 1000) * 1000) + 'Z'
}
function pgDataTypeMapping(tableName, attr, dataType) {
if (Utils._.includes(dataType, 'PRIMARY KEY')) {
primaryKeys[tableName].push(attr)
dataType = dataType.replace(/PRIMARY KEY/, '')
}
if (Utils._.includes(dataType, 'TINYINT(1)')) {
dataType = dataType.replace(/TINYINT\(1\)/, 'BOOLEAN')
}
if (Utils._.includes(dataType, 'DATETIME')) {
dataType = dataType.replace(/DATETIME/, 'TIMESTAMP WITH TIME ZONE')
}
if (Utils._.includes(dataType, 'SERIAL')) {
dataType = dataType.replace(/INTEGER/, '')
dataType = dataType.replace(/NOT NULL/, '')
tables[tableName][attr] = 'serial'
}
if (dataType.match(/^ENUM\(/)) {
dataType = dataType.replace(/^ENUM\(.+\)/, pgEscapeAndQuote("enum_" + tableName + "_" + attr))
}
return dataType
}
module.exports = (function() { module.exports = (function() {
var QueryGenerator = { var QueryGenerator = {
...@@ -100,20 +19,23 @@ module.exports = (function() { ...@@ -100,20 +19,23 @@ module.exports = (function() {
, attrStr = [] , attrStr = []
for (var attr in attributes) { for (var attr in attributes) {
var dataType = pgDataTypeMapping(tableName, attr, attributes[attr]) var dataType = QueryGenerator.pgDataTypeMapping(tableName, attr, attributes[attr])
attrStr.push(addQuotes(attr) + " " + dataType) attrStr.push(QueryGenerator.addQuotes(attr) + " " + dataType)
if (attributes[attr].match(/^ENUM\(/)) { if (attributes[attr].match(/^ENUM\(/)) {
query = pgEnum(tableName, attr, attributes[attr]) + query; query = QueryGenerator.pgEnum(tableName, attr, attributes[attr]) + query
} }
} }
var values = { var values = {
table: addQuotes(tableName), table: QueryGenerator.addQuotes(tableName),
attributes: attrStr.join(", "), attributes: attrStr.join(", "),
} }
var pks = primaryKeys[tableName].map(function(pk){ return addQuotes(pk) }).join(",") var pks = primaryKeys[tableName].map(function(pk){
return QueryGenerator.addQuotes(pk)
}).join(",")
if (pks.length > 0) { if (pks.length > 0) {
values.attributes += ", PRIMARY KEY (" + pks + ")" values.attributes += ", PRIMARY KEY (" + pks + ")"
} }
...@@ -124,12 +46,17 @@ module.exports = (function() { ...@@ -124,12 +46,17 @@ module.exports = (function() {
dropTableQuery: function(tableName, options) { dropTableQuery: function(tableName, options) {
options = options || {} options = options || {}
var query = "DROP TABLE IF EXISTS <%= table %>;" var query = "DROP TABLE IF EXISTS <%= table %>;"
return Utils._.template(query)({ table: addQuotes(tableName) }) return Utils._.template(query)({
table: QueryGenerator.addQuotes(tableName)
})
}, },
renameTableQuery: function(before, after) { renameTableQuery: function(before, after) {
var query = "ALTER TABLE <%= before %> RENAME TO <%= after %>;" var query = "ALTER TABLE <%= before %> RENAME TO <%= after %>;"
return Utils._.template(query)({ before: addQuotes(before), after: addQuotes(after) }) return Utils._.template(query)({
before: QueryGenerator.addQuotes(before),
after: QueryGenerator.addQuotes(after)
})
}, },
showTablesQuery: function() { showTablesQuery: function() {
...@@ -138,7 +65,9 @@ module.exports = (function() { ...@@ -138,7 +65,9 @@ module.exports = (function() {
describeTableQuery: function(tableName) { describeTableQuery: function(tableName) {
var query = 'SELECT column_name as "Field", column_default as "Default", is_nullable as "Null", data_type as "Type" FROM information_schema.columns WHERE table_name = <%= table %>;' var query = 'SELECT column_name as "Field", column_default as "Default", is_nullable as "Null", data_type as "Type" FROM information_schema.columns WHERE table_name = <%= table %>;'
return Utils._.template(query)({ table: addQuotes(tableName, "'") }) return Utils._.template(query)({
table: QueryGenerator.addQuotes(tableName, "'")
})
}, },
addColumnQuery: function(tableName, attributes) { addColumnQuery: function(tableName, attributes) {
...@@ -149,21 +78,26 @@ module.exports = (function() { ...@@ -149,21 +78,26 @@ module.exports = (function() {
var definition = attributes[attrName] var definition = attributes[attrName]
attrString.push(Utils._.template('<%= attrName %> <%= definition %>')({ attrString.push(Utils._.template('<%= attrName %> <%= definition %>')({
attrName: addQuotes(attrName), attrName: QueryGenerator.addQuotes(attrName),
definition: pgDataTypeMapping(tableName, attrName, definition) definition: QueryGenerator.pgDataTypeMapping(tableName, attrName, definition)
})) }))
if (definition.match(/^ENUM\(/)) { if (definition.match(/^ENUM\(/)) {
query = pgEnum(tableName, attrName, definition) + query query = QueryGenerator.pgEnum(tableName, attrName, definition) + query
} }
} }
return Utils._.template(query)({ tableName: addQuotes(tableName), attributes: attrString.join(', ') }) return Utils._.template(query)({
tableName: QueryGenerator.addQuotes(tableName),
attributes: attrString.join(', ') })
}, },
removeColumnQuery: function(tableName, attributeName) { removeColumnQuery: function(tableName, attributeName) {
var query = "ALTER TABLE <%= tableName %> DROP COLUMN <%= attributeName %>;" var query = "ALTER TABLE <%= tableName %> DROP COLUMN <%= attributeName %>;"
return Utils._.template(query)({ tableName: addQuotes(tableName), attributeName: addQuotes(attributeName) }) return Utils._.template(query)({
tableName: QueryGenerator.addQuotes(tableName),
attributeName: QueryGenerator.addQuotes(attributeName)
})
}, },
changeColumnQuery: function(tableName, attributes) { changeColumnQuery: function(tableName, attributes) {
...@@ -176,40 +110,40 @@ module.exports = (function() { ...@@ -176,40 +110,40 @@ module.exports = (function() {
if (definition.indexOf('NOT NULL') > 0) { if (definition.indexOf('NOT NULL') > 0) {
attrSql += Utils._.template(query)({ attrSql += Utils._.template(query)({
tableName: addQuotes(tableName), tableName: QueryGenerator.addQuotes(tableName),
query: addQuotes(attributeName) + ' SET NOT NULL' query: QueryGenerator.addQuotes(attributeName) + ' SET NOT NULL'
}) })
definition = definition.replace('NOT NULL', '').trim() definition = definition.replace('NOT NULL', '').trim()
} else { } else {
attrSql += Utils._.template(query)({ attrSql += Utils._.template(query)({
tableName: addQuotes(tableName), tableName: QueryGenerator.addQuotes(tableName),
query: addQuotes(attributeName) + ' DROP NOT NULL' query: QueryGenerator.addQuotes(attributeName) + ' DROP NOT NULL'
}) })
} }
if (definition.indexOf('DEFAULT') > 0) { if (definition.indexOf('DEFAULT') > 0) {
attrSql += Utils._.template(query)({ attrSql += Utils._.template(query)({
tableName: addQuotes(tableName), tableName: QueryGenerator.addQuotes(tableName),
query: addQuotes(attributeName) + ' SET DEFAULT' + definition.match(/DEFAULT ([^;]+)/)[1] query: QueryGenerator.addQuotes(attributeName) + ' SET DEFAULT' + definition.match(/DEFAULT ([^;]+)/)[1]
}) })
definition = definition.replace(/(DEFAULT[^;]+)/, '').trim() definition = definition.replace(/(DEFAULT[^;]+)/, '').trim()
} else { } else {
attrSql += Utils._.template(query)({ attrSql += Utils._.template(query)({
tableName: addQuotes(tableName), tableName: QueryGenerator.addQuotes(tableName),
query: addQuotes(attributeName) + ' DROP DEFAULT' query: QueryGenerator.addQuotes(attributeName) + ' DROP DEFAULT'
}) })
} }
if (definition.match(/^ENUM\(/)) { if (definition.match(/^ENUM\(/)) {
query = pgEnum(tableName, attributeName, definition) + query query = QueryGenerator.pgEnum(tableName, attributeName, definition) + query
definition = definition.replace(/^ENUM\(.+\)/, Utils.escape("enum_" + tableName + "_" + attributeName)) definition = definition.replace(/^ENUM\(.+\)/, Utils.escape("enum_" + tableName + "_" + attributeName))
} }
attrSql += Utils._.template(query)({ attrSql += Utils._.template(query)({
tableName: addQuotes(tableName), tableName: QueryGenerator.addQuotes(tableName),
query: addQuotes(attributeName) + ' TYPE ' + definition query: QueryGenerator.addQuotes(attributeName) + ' TYPE ' + definition
}) })
sql.push(attrSql) sql.push(attrSql)
...@@ -224,12 +158,15 @@ module.exports = (function() { ...@@ -224,12 +158,15 @@ module.exports = (function() {
for (var attributeName in attributes) { for (var attributeName in attributes) {
attrString.push(Utils._.template('<%= before %> TO <%= after %>')({ attrString.push(Utils._.template('<%= before %> TO <%= after %>')({
before: addQuotes(attrBefore), before: QueryGenerator.addQuotes(attrBefore),
after: addQuotes(attributeName), after: QueryGenerator.addQuotes(attributeName),
})) }))
} }
return Utils._.template(query)({ tableName: addQuotes(tableName), attributes: attrString.join(', ') }) return Utils._.template(query)({
tableName: QueryGenerator.addQuotes(tableName),
attributes: attrString.join(', ')
})
}, },
selectQuery: function(tableName, options) { selectQuery: function(tableName, options) {
...@@ -237,16 +174,28 @@ module.exports = (function() { ...@@ -237,16 +174,28 @@ module.exports = (function() {
, table = null , table = null
options = options || {} options = options || {}
options.table = table = Array.isArray(tableName) ? tableName.map(function(t){return addQuotes(t);}).join(", ") : addQuotes(tableName)
if (Array.isArray(tableName)) {
options.table = table = tableName.map(function(t){
return QueryGenerator.addQuotes(t)
}).join(", ")
} else {
options.table = table = QueryGenerator.addQuotes(tableName)
}
options.attributes = options.attributes && options.attributes.map(function(attr) { options.attributes = options.attributes && options.attributes.map(function(attr) {
if (Array.isArray(attr) && attr.length === 2) { if (Array.isArray(attr) && attr.length === 2) {
return [attr[0], addQuotes(removeQuotes(attr[1], '`'))].join(' as ') return [
attr[0],
QueryGenerator.addQuotes(QueryGenerator.removeQuotes(attr[1], '`'))
].join(' as ')
} else if (attr.indexOf('`') >= 0) { } else if (attr.indexOf('`') >= 0) {
return attr.replace(/`/g, '"') return attr.replace(/`/g, '"')
} else { } else {
return addQuotes(attr) return QueryGenerator.addQuotes(attr)
} }
}).join(", ") }).join(", ")
options.attributes = options.attributes || '*' options.attributes = options.attributes || '*'
if (options.include) { if (options.include) {
...@@ -261,6 +210,7 @@ module.exports = (function() { ...@@ -261,6 +210,7 @@ module.exports = (function() {
optAttributes = optAttributes.concat(attributes) optAttributes = optAttributes.concat(attributes)
var joinQuery = ' LEFT OUTER JOIN "<%= table %>" AS "<%= as %>" ON "<%= tableLeft %>"."<%= attrLeft %>" = "<%= tableRight %>"."<%= attrRight %>"' var joinQuery = ' LEFT OUTER JOIN "<%= table %>" AS "<%= as %>" ON "<%= tableLeft %>"."<%= attrLeft %>" = "<%= tableRight %>"."<%= attrRight %>"'
query += Utils._.template(joinQuery)({ query += Utils._.template(joinQuery)({
table: include.daoFactory.tableName, table: include.daoFactory.tableName,
as: include.as, as: include.as,
...@@ -280,12 +230,21 @@ module.exports = (function() { ...@@ -280,12 +230,21 @@ module.exports = (function() {
} }
if(options.order) { if(options.order) {
options.order = options.order.replace(/([^ ]+)(.*)/, function(m, g1, g2) { return addQuotes(g1)+g2 }) options.order = options.order.replace(/([^ ]+)(.*)/, function(m, g1, g2) {
return QueryGenerator.addQuotes(g1) + g2
})
query += " ORDER BY <%= order %>" query += " ORDER BY <%= order %>"
} }
if(options.group) { if(options.group) {
options.group = Array.isArray(options.group) ? options.group.map(function(grp){return addQuotes(grp)}).join(', ') : addQuotes(options.group) if (Array.isArray(options.group)) {
options.group = options.group.map(function(grp){
return QueryGenerator.addQuotes(grp)
}).join(', ')
} else {
options.group = QueryGenerator.addQuotes(options.group)
}
query += " GROUP BY <%= group %>" query += " GROUP BY <%= group %>"
} }
...@@ -322,10 +281,12 @@ module.exports = (function() { ...@@ -322,10 +281,12 @@ module.exports = (function() {
}); });
var replacements = { var replacements = {
table: addQuotes(tableName), table: QueryGenerator.addQuotes(tableName)
attributes: Object.keys(attrValueHash).map(function(attr){return addQuotes(attr)}).join(","), , attributes: Object.keys(attrValueHash).map(function(attr){
values: Utils._.values(attrValueHash).map(function(value){ return QueryGenerator.addQuotes(attr)
return pgEscape(value) }).join(",")
, values: Utils._.values(attrValueHash).map(function(value){
return QueryGenerator.pgEscape(value)
}).join(",") }).join(",")
} }
...@@ -340,11 +301,11 @@ module.exports = (function() { ...@@ -340,11 +301,11 @@ module.exports = (function() {
for (var key in attrValueHash) { for (var key in attrValueHash) {
var value = attrValueHash[key] var value = attrValueHash[key]
values.push(addQuotes(key) + "=" + pgEscape(value)) values.push(QueryGenerator.addQuotes(key) + "=" + QueryGenerator.pgEscape(value))
} }
var replacements = { var replacements = {
table: addQuotes(tableName), table: QueryGenerator.addQuotes(tableName),
values: values.join(","), values: values.join(","),
where: QueryGenerator.getWhereConditions(where) where: QueryGenerator.getWhereConditions(where)
} }
...@@ -362,15 +323,17 @@ module.exports = (function() { ...@@ -362,15 +323,17 @@ module.exports = (function() {
var pks; var pks;
if (primaryKeys[tableName] && primaryKeys[tableName].length > 0) { if (primaryKeys[tableName] && primaryKeys[tableName].length > 0) {
pks = primaryKeys[tableName].map(function(pk) { return addQuotes(pk) }).join(',') pks = primaryKeys[tableName].map(function(pk) {
return QueryGenerator.addQuotes(pk)
}).join(',')
} else { } else {
pks = addQuotes('id') pks = QueryGenerator.addQuotes('id')
} }
var replacements = { var replacements = {
table: addQuotes(tableName), table: QueryGenerator.addQuotes(tableName),
where: QueryGenerator.getWhereConditions(where), where: QueryGenerator.getWhereConditions(where),
limit: pgEscape(options.limit), limit: QueryGenerator.pgEscape(options.limit),
primaryKeys: primaryKeys[tableName].length > 1 ? '(' + pks + ')' : pks, primaryKeys: primaryKeys[tableName].length > 1 ? '(' + pks + ')' : pks,
primaryKeysSelection: pks primaryKeysSelection: pks
} }
...@@ -386,11 +349,11 @@ module.exports = (function() { ...@@ -386,11 +349,11 @@ module.exports = (function() {
for (var key in attrValueHash) { for (var key in attrValueHash) {
var value = attrValueHash[key] var value = attrValueHash[key]
values.push(addQuotes(key) + "=" + addQuotes(key) + " + " + pgEscape(value)) values.push(QueryGenerator.addQuotes(key) + "=" + QueryGenerator.addQuotes(key) + " + " + QueryGenerator.pgEscape(value))
} }
var replacements = { var replacements = {
table: addQuotes(tableName), table: QueryGenerator.addQuotes(tableName),
values: values.join(","), values: values.join(","),
where: QueryGenerator.getWhereConditions(where) where: QueryGenerator.getWhereConditions(where)
} }
...@@ -402,7 +365,7 @@ module.exports = (function() { ...@@ -402,7 +365,7 @@ module.exports = (function() {
addIndexQuery: function(tableName, attributes, options) { addIndexQuery: function(tableName, attributes, options) {
var transformedAttributes = attributes.map(function(attribute) { var transformedAttributes = attributes.map(function(attribute) {
if (typeof attribute === 'string') { if (typeof attribute === 'string') {
return addQuotes(attribute) return QueryGenerator.addQuotes(attribute)
} else { } else {
var result = "" var result = ""
...@@ -410,7 +373,7 @@ module.exports = (function() { ...@@ -410,7 +373,7 @@ module.exports = (function() {
throw new Error('The following index attribute has no attribute: ' + util.inspect(attribute)) throw new Error('The following index attribute has no attribute: ' + util.inspect(attribute))
} }
result += addQuotes(attribute.attribute) result += QueryGenerator.addQuotes(attribute.attribute)
if (attribute.length) { if (attribute.length) {
result += '(' + attribute.length + ')' result += '(' + attribute.length + ')'
...@@ -436,9 +399,9 @@ module.exports = (function() { ...@@ -436,9 +399,9 @@ module.exports = (function() {
}, options || {}) }, options || {})
return Utils._.compact([ return Utils._.compact([
"CREATE", options.indicesType, "INDEX", addQuotes(options.indexName), "CREATE", options.indicesType, "INDEX", QueryGenerator.addQuotes(options.indexName),
(options.indexType ? ('USING ' + options.indexType) : undefined), (options.indexType ? ('USING ' + options.indexType) : undefined),
"ON", addQuotes(tableName), '(' + transformedAttributes.join(', ') + ')' "ON", QueryGenerator.addQuotes(tableName), '(' + transformedAttributes.join(', ') + ')'
]).join(' ') ]).join(' ')
}, },
...@@ -455,7 +418,10 @@ module.exports = (function() { ...@@ -455,7 +418,10 @@ module.exports = (function() {
indexName = Utils._.underscored(tableName + '_' + indexNameOrAttributes.join('_')) indexName = Utils._.underscored(tableName + '_' + indexNameOrAttributes.join('_'))
} }
return Utils._.template(sql)({ tableName: addQuotes(tableName), indexName: addQuotes(indexName) }) return Utils._.template(sql)({
tableName: QueryGenerator.addQuotes(tableName),
indexName: QueryGenerator.addQuotes(indexName)
})
}, },
getWhereConditions: function(smth) { getWhereConditions: function(smth) {
...@@ -465,7 +431,7 @@ module.exports = (function() { ...@@ -465,7 +431,7 @@ module.exports = (function() {
result = QueryGenerator.hashToWhereConditions(smth) result = QueryGenerator.hashToWhereConditions(smth)
} }
else if (typeof smth === "number") { else if (typeof smth === "number") {
result = '\"id\"' + "=" + pgEscape(smth) result = '\"id\"' + "=" + QueryGenerator.pgEscape(smth)
} }
else if (typeof smth === "string") { else if (typeof smth === "string") {
result = smth result = smth
...@@ -484,23 +450,23 @@ module.exports = (function() { ...@@ -484,23 +450,23 @@ module.exports = (function() {
var value = hash[key] var value = hash[key]
//handle qualified key names //handle qualified key names
var _key = key.split('.').map(function(col){return addQuotes(col)}).join(".") var _key = key.split('.').map(function(col){return QueryGenerator.addQuotes(col)}).join(".")
, _value = null , _value = null
if (Array.isArray(value)) { if (Array.isArray(value)) {
if (value.length == 0) { value = [null] } if (value.length == 0) { value = [null] }
_value = "(" + value.map(function(subValue) { _value = "(" + value.map(function(subValue) {
return pgEscape(subValue); return QueryGenerator.pgEscape(subValue);
}).join(',') + ")" }).join(',') + ")"
result.push([_key, _value].join(" IN ")) result.push([_key, _value].join(" IN "))
} }
else if ((value) && (typeof value === "object")) { else if ((value) && (typeof value === "object")) {
//using as sentinel for join column => value //using as sentinel for join column => value
_value = value.join.split('.').map(function(col){return addQuotes(col)}).join(".") _value = value.join.split('.').map(function(col){return QueryGenerator.addQuotes(col)}).join(".")
result.push([_key, _value].join("=")) result.push([_key, _value].join("="))
} else { } else {
_value = pgEscape(value) _value = QueryGenerator.pgEscape(value)
result.push((_value == 'NULL') ? _key + " IS NULL" : [_key, _value].join("=")) result.push((_value == 'NULL') ? _key + " IS NULL" : [_key, _value].join("="))
} }
} }
...@@ -546,7 +512,7 @@ module.exports = (function() { ...@@ -546,7 +512,7 @@ module.exports = (function() {
if (dataType.defaultValue !== undefined) { if (dataType.defaultValue !== undefined) {
template += " DEFAULT <%= defaultValue %>" template += " DEFAULT <%= defaultValue %>"
replacements.defaultValue = pgEscape(dataType.defaultValue) replacements.defaultValue = QueryGenerator.pgEscape(dataType.defaultValue)
} }
if (dataType.unique) { if (dataType.unique) {
...@@ -591,6 +557,88 @@ module.exports = (function() { ...@@ -591,6 +557,88 @@ module.exports = (function() {
port: config.port, port: config.port,
protocol: config.protocol protocol: config.protocol
}) })
},
removeQuotes: function (s, quoteChar) {
quoteChar = quoteChar || '"'
return s.replace(new RegExp(quoteChar, 'g'), '')
},
addQuotes: function (s, quoteChar) {
quoteChar = quoteChar || '"'
return QueryGenerator.removeQuotes(s, quoteChar)
.split('.')
.map(function(e) { return quoteChar + String(e) + quoteChar })
.join('.')
},
pgEscape: function (val) {
if (val === undefined || val === null) {
return 'NULL';
}
switch (typeof val) {
case 'boolean': return (val) ? 'true' : 'false';
case 'number': return val+'';
case 'object':
if (Array.isArray(val)) {
return 'ARRAY['+ val.map(function(it) { return QueryGenerator.pgEscape(it) }).join(',') +']';
}
}
if (val instanceof Date) {
val = QueryGenerator.pgSqlDate(val);
}
// http://www.postgresql.org/docs/8.2/static/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS
val = val.replace(/'/g, "''");
return "'"+val+"'";
},
pgEscapeAndQuote: function (val) {
return QueryGenerator.addQuotes(QueryGenerator.removeQuotes(QueryGenerator.pgEscape(val), "'"))
},
pgEnum: function (tableName, attr, dataType) {
var enumName = QueryGenerator.pgEscapeAndQuote("enum_" + tableName + "_" + attr)
return "DROP TYPE IF EXISTS " + enumName + "; CREATE TYPE " + enumName + " AS " + dataType.match(/^ENUM\(.+\)/)[0] + "; "
},
padInt: function (i) {
return (i < 10) ? '0' + i.toString() : i.toString()
},
pgSqlDate: function (dt) {
var date = [ dt.getUTCFullYear(), QueryGenerator.padInt(dt.getUTCMonth()+1), QueryGenerator.padInt(dt.getUTCDate()) ].join('-')
var time = [ dt.getUTCHours(), QueryGenerator.padInt(dt.getUTCMinutes()), QueryGenerator.padInt(dt.getUTCSeconds())].join(':')
return date + ' ' + time + '.' + ((dt.getTime() % 1000) * 1000) + 'Z'
},
pgDataTypeMapping: function (tableName, attr, dataType) {
if (Utils._.includes(dataType, 'PRIMARY KEY')) {
primaryKeys[tableName].push(attr)
dataType = dataType.replace(/PRIMARY KEY/, '')
}
if (Utils._.includes(dataType, 'TINYINT(1)')) {
dataType = dataType.replace(/TINYINT\(1\)/, 'BOOLEAN')
}
if (Utils._.includes(dataType, 'DATETIME')) {
dataType = dataType.replace(/DATETIME/, 'TIMESTAMP WITH TIME ZONE')
}
if (Utils._.includes(dataType, 'SERIAL')) {
dataType = dataType.replace(/INTEGER/, '')
dataType = dataType.replace(/NOT NULL/, '')
tables[tableName][attr] = 'serial'
}
if (dataType.match(/^ENUM\(/)) {
dataType = dataType.replace(/^ENUM\(.+\)/, QueryGenerator.pgEscapeAndQuote("enum_" + tableName + "_" + attr))
}
return dataType
} }
} }
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!