@jakub.knejzlik/ts-query
Version:
TypeScript implementation of SQL builder
44 lines (43 loc) • 1.94 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SQLiteFlavor = void 0;
const Expression_1 = require("../Expression");
const mysql_1 = require("./mysql");
class SQLiteFlavor extends mysql_1.MySQLFlavor {
constructor() {
super(...arguments);
// protected columnQuotes: string = "'"
this.stringQuotes = "'";
}
escapeFunction(fn) {
const args = fn.value.map((arg) => Expression_1.ExpressionBase.deserialize(arg).toSQL(this));
if (fn.name === "MONTH") {
return `strftime('%m', ${args.join(", ")}, 'localtime')`;
}
if (fn.name === "YEAR") {
return `strftime('%Y', ${args.join(", ")}, 'localtime')`;
}
if (fn.name === "IF") {
return `IIF(${args.join(", ")})`;
}
if (fn.name === "DATEADD") {
const argsValues = fn.value.map((x) => Expression_1.ExpressionBase.deserializeValue(x));
const interval = parseInt(argsValues[1].value.toString(), 10);
if (isNaN(interval)) {
throw new Error(`Invalid DATEADD interval: ${argsValues[1].value}`);
}
const intervalType = argsValues[2].value.toString().toLowerCase();
// SQLite supports: years, months, days, hours, minutes, seconds
const validIntervalTypes = ['year', 'month', 'day', 'hour', 'minute', 'second', 'years', 'months', 'days', 'hours', 'minutes', 'seconds'];
if (!validIntervalTypes.includes(intervalType)) {
throw new Error(`Invalid DATEADD interval type: ${intervalType}`);
}
return `DateTime(${args[0]}, '${interval >= 0 ? "+" + interval : interval} ${intervalType}')`;
}
return super.escapeFunction(fn);
}
escapeTable(table) {
return super.escapeTable(table.substring(table.indexOf("@") + 1));
}
}
exports.SQLiteFlavor = SQLiteFlavor;