123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- var SqlString = exports;
- SqlString.escapeId = function (val, forbidQualified) {
- if (forbidQualified) {
- return '`' + val.replace(/`/g, '``') + '`';
- }
- return '`' + val.replace(/`/g, '``').replace(/\./g, '`.`') + '`';
- };
- SqlString.escape = function(val, stringifyObjects, timeZone) {
- if (val === undefined || val === null) {
- return 'NULL';
- }
- switch (typeof val) {
- case 'boolean': return (val) ? 'true' : 'false';
- case 'number': return val+'';
- }
- if (val instanceof Date) {
- val = SqlString.dateToString(val, timeZone || "Z");
- }
- if (Buffer.isBuffer(val)) {
- return SqlString.bufferToString(val);
- }
- if (Array.isArray(val)) {
- return SqlString.arrayToList(val, timeZone);
- }
- if (typeof val === 'object') {
- if (stringifyObjects) {
- val = val.toString();
- } else {
- return SqlString.objectToValues(val, timeZone);
- }
- }
- val = val.replace(/[\0\n\r\b\t\\\'\"\x1a]/g, function(s) {
- switch(s) {
- case "\0": return "\\0";
- case "\n": return "\\n";
- case "\r": return "\\r";
- case "\b": return "\\b";
- case "\t": return "\\t";
- case "\x1a": return "\\Z";
- default: return "\\"+s;
- }
- });
- return "'"+val+"'";
- };
- SqlString.arrayToList = function(array, timeZone) {
- return array.map(function(v) {
- if (Array.isArray(v)) return '(' + SqlString.arrayToList(v) + ')';
- return SqlString.escape(v, true, timeZone);
- }).join(', ');
- };
- SqlString.format = function(sql, values, timeZone) {
- values = [].concat(values);
- return sql.replace(/\?/g, function(match) {
- if (!values.length) {
- return match;
- }
- return SqlString.escape(values.shift(), false, timeZone);
- });
- };
- SqlString.dateToString = function(date, timeZone) {
- var dt = new Date(date);
- if (timeZone != 'local') {
- var tz = convertTimezone(timeZone);
- dt.setTime(dt.getTime() + (dt.getTimezoneOffset() * 60000));
- if (tz !== false) {
- dt.setTime(dt.getTime() + (tz * 60000));
- }
- }
- var year = dt.getFullYear();
- var month = zeroPad(dt.getMonth() + 1);
- var day = zeroPad(dt.getDate());
- var hour = zeroPad(dt.getHours());
- var minute = zeroPad(dt.getMinutes());
- var second = zeroPad(dt.getSeconds());
- return year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + second;
- };
- SqlString.bufferToString = function(buffer) {
- var hex = '';
- try {
- hex = buffer.toString('hex');
- } catch (err) {
- // node v0.4.x does not support hex / throws unknown encoding error
- for (var i = 0; i < buffer.length; i++) {
- var byte = buffer[i];
- hex += zeroPad(byte.toString(16));
- }
- }
- return "X'" + hex+ "'";
- };
- SqlString.objectToValues = function(object, timeZone) {
- var values = [];
- for (var key in object) {
- var value = object[key];
- if(typeof value === 'function') {
- continue;
- }
- values.push(this.escapeId(key) + ' = ' + SqlString.escape(value, true, timeZone));
- }
- return values.join(', ');
- };
- function zeroPad(number) {
- return (number < 10) ? '0' + number : number;
- }
- function convertTimezone(tz) {
- if (tz == "Z") return 0;
- var m = tz.match(/([\+\-\s])(\d\d):?(\d\d)?/);
- if (m) {
- return (m[1] == '-' ? -1 : 1) * (parseInt(m[2], 10) + ((m[3] ? parseInt(m[3], 10) : 0) / 60)) * 60;
- }
- return false;
- }
|