var Expr = require('./expr'); /** * The equivalent of a SQL value. */ module.exports = new Class({ Extends: Expr ,Tag: 'sql-value' ,Properties: { /** * The master param. */ param: { type: Vn.Param ,set: function(x) { this.link({_param: x}, {'changed': this.onParamChange}); this.onParamChange(); } ,get: function() { return this._param; } }, /** * The value. */ value: { type: String ,set: function(x) { if (Vn.Value.compare(x, this._value)) return; if (x instanceof Date) x = x.clone(); this._value = x; if (this._param && !this.paramLock) { this.paramLock = true; this._param.value = x; this.paramLock = false; } this.signalEmit('changed'); } ,get: function() { return this._value; } } } ,_value: undefined ,_param: null ,regexp: new RegExp('(\\\\)|\'', 'g') ,paramLock: false ,onParamChange: function() { if (this.paramLock || !this._param) return; this.paramLock = true; this.value = this._param.value; this.paramLock = false; } ,isReady: function() { return this._value !== undefined; } ,replaceFunc: function(token) { switch (token) { case '\\': return '\\\\'; case '\'': return '\\\''; } return token; } ,render: function() { var v = this._value; switch (typeof v) { case 'number': return v; case 'boolean': return (v) ? 'TRUE' : 'FALSE'; case 'string': return "'" + v.replace(this.regexp, this.replaceFunc) + "'"; default: if (v instanceof Date) { if (!isNaN(v.getTime())) { var unixTime = parseInt(fixTz(v).getTime() / 1000); return 'DATE(FROM_UNIXTIME('+ unixTime +'))'; } else return '0000-00-00' } else return 'NULL'; } } }); // TODO: Read time zone from db configuration var tz = {timeZone: 'Europe/Madrid'}; var isLocal = Intl .DateTimeFormat() .resolvedOptions() .timeZone == tz.timeZone; function fixTz(date) { if (isLocal) return date; var hasTime = date.getHours() || date.getMinutes() || date.getSeconds() || date.getMilliseconds(); if (!hasTime) { date = new Date(date.getTime()); date.setHours(12, 0, 0, 0); } return date; }