UNPKG

lia-mysql

Version:

JavaScript library of data standards.

143 lines 4.7 kB
"use strict"; 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