lia-mysql
Version:
JavaScript library of data standards.
143 lines • 4.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Operator = void 0;
const sqlstring_1 = require("sqlstring");
class Operator {
constructor() {
}
format(sql, values, stringifyObjects, timeZone) {
// if values is object, not null, not Array;
if (!Array.isArray(values) && typeof values === 'object' && values !== null) {
// object not support replace column like ??;
return sql.replace(/:(\w+)/g, (text, key) => {
if (Object.prototype.hasOwnProperty.call(values, key)) {
return (0, sqlstring_1.escape)(values[key]);
}
// if values don't hasOwnProperty, return origin text;
return text;
});
}
return (0, sqlstring_1.format)(sql, values, stringifyObjects, timeZone);
}
/**
*
* @param key
* @param value
*/
_matchWhereItem(key, value) {
let sqls = [];
let values = [];
//normal
if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
sqls.push('?? = ?');
values.push(key);
values.push(value);
}
//operate
else if (Object.hasOwn(value, 'key') || Object.hasOwn(value, 'value') || Object.hasOwn(value, 'operate')) {
let _value = value;
let _key = key == '$or' ? _value.key : key;
let operate = _value.operate ?? '=';
if (operate.toUpperCase() == 'IN') {
sqls.push(`?? IN (?)`);
}
else {
sqls.push(`?? ${operate} ?`);
}
values.push(_key);
values.push(_value.value);
}
// array
else if (Array.isArray(value)) {
let items = value;
if (key == '$or') {
let orSqls = [];
let orValues = [];
let _items = items;
for (const item of _items) {
let _key = item.key;
let _value = item.value;
let result = this._matchWhereItem(_key, _value);
orSqls.push(...result.sqls);
orValues.push(...result.values);
}
sqls.push(` (${orSqls.join(' or ')}) `);
values.push(...orValues);
}
else {
sqls.push('?? IN (?)');
values.push(items);
}
}
return {
sqls, values
};
}
_where(where) {
if (!where) {
return '';
}
const wheres = [];
const values = [];
for (const key in where) {
let result = this._matchWhereItem(key, where[key]);
wheres.push(...result.sqls);
values.push(...result.values);
}
if (wheres.length > 0) {
return this.format(' WHERE ' + wheres.join(' AND '), values);
}
return '';
}
_selectColumns(table, columns) {
if (!columns || columns.length === 0) {
columns = '*';
}
if (columns === '*') {
return this.format('SELECT * FROM ??', [table]);
}
return this.format('SELECT ?? FROM ??', [columns, table]);
}
_orders(orders) {
if (!orders) {
return '';
}
if (typeof orders === 'string') {
orders = [orders];
}
const values = [];
for (const value of orders) {
if (typeof value === 'string') {
values.push(this.escapeId(value));
}
else if (Array.isArray(value)) {
// value format: ['name', 'desc'], ['name'], ['name', 'asc']
let sort = String(value[1]).toUpperCase();
if (sort !== 'ASC' && sort !== 'DESC') {
sort = '';
}
if (sort) {
values.push(this.escapeId(value[0]) + ' ' + sort);
}
else {
values.push(this.escapeId(value[0]));
}
}
}
return ' ORDER BY ' + values.join(', ');
}
_limit(limit, offset) {
if (!limit || typeof limit !== 'number') {
return '';
}
if (typeof offset !== 'number') {
offset = 0;
}
return ' LIMIT ' + offset + ', ' + limit;
}
escapeId(value, forbidQualified) {
return (0, sqlstring_1.escapeId)(value, forbidQualified);
}
}
exports.Operator = Operator;
//# sourceMappingURL=operator.js.map