UNPKG

@63pokupki/nodejs-common

Version:
213 lines 9.41 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const lib_1 = require("@63pokupki/components/lib"); const Json_1 = require("../Helpers/Json"); let iQCounter = 0; let iQBSlave = 0; let iQBMaster = 0; let iQRSlave = 0; let iQRMaster = 0; let iQIncorrect = 0; /** * SQL Запросы */ class BaseSQL { /** init */ constructor(ctx) { this.ctx = ctx; this.modelValidatorSys = new lib_1.ModelValidatorSys(ctx.sys.errorSys); this.errorSys = ctx.sys.errorSys; this.userSys = ctx.sys.userSys; this.logicSys = ctx.sys.logicSys; this.cacheSys = ctx.sys.cacheSys; this.monitoringSys = ctx.sys.monitoringSys; if (ctx.infrastructure.mysql) { this.db = ctx.infrastructure.mysql; } else { this.errorSys.error('db_no_connection', 'Отсутствует подключение к mysql'); } if (ctx.infrastructure.redis) { this.redisSys = ctx.infrastructure.redis; } else { this.errorSys.error('db_redis', 'Отсутствует подключение к redis'); } } /** * TODO устаревший балансировщик запросов * Выполняем запрос */ async dbExe(vQueryBuilder) { let out = null; const builder = vQueryBuilder; if (builder._method && builder.sql) { iQIncorrect++; } if (!builder._method) { // Если метода нет значит raw запрос const sQueryStart = builder.sql.substr(0, 50).toLowerCase(); const iSelectPos = sQueryStart.indexOf('select'); const iInsertPos = sQueryStart.indexOf('insert'); const iDeletePos = sQueryStart.indexOf('delete'); const iUpdatePos = sQueryStart.indexOf('update'); const bWrite = (iInsertPos >= 0 || iDeletePos >= 0 || iUpdatePos >= 0); if (iSelectPos >= 0 && !bWrite) { iQRSlave++; builder.client = this.db.client; } else { iQRMaster++; builder.client = this.db.client; } } else if (builder._method === 'select' || builder._method === 'first' || builder._method === 'pluck') { iQBSlave++; builder.client = this.db.client; } else { iQBMaster++; builder.client = this.db.client; if ((builder._method !== 'insert' && builder._method !== 'update' && builder._method !== 'delete')) { // console.log('builder._method>', builder._method, builder.sql); iQIncorrect++; } } // Выполнить запрос if (builder._method) { // _method только у билдера out = await builder; } else { out = (await builder)[0]; } iQCounter++; if (iQCounter % 100 == 0) { console.log('>>>', ' iQCounter', iQCounter, ' iQBSlave>', iQBSlave, ' iQBMaster>', iQBMaster, ' iQRSlave>', iQRSlave, ' iQRMaster>', iQRMaster, 'iQIncorrect>', iQIncorrect); } return out; } /** * TODO устаревший балансировщик запросов * Получаем инстанс запроса Knex.Raw учитывая pool соединений */ async dbRaw(sql, param) { // const q = this.dbOne.raw(sql, param); let out = null; const sQueryStart = sql.substr(0, 50).toLowerCase(); const iSelectPos = sQueryStart.indexOf('select'); const iInsertPos = sQueryStart.indexOf('insert'); const iDeletePos = sQueryStart.indexOf('delete'); const iUpdatePos = sQueryStart.indexOf('update'); const bWrite = (iInsertPos >= 0 || iDeletePos >= 0 || iUpdatePos >= 0); if (iSelectPos >= 0 && !bWrite) { iQRSlave++; out = (await this.db.raw(sql, param)); } else { iQRMaster++; out = (await this.db.raw(sql, param)); } iQCounter++; if (iQCounter % 100 == 0) { console.log('>>>', ' iQCounter', iQCounter, ' iQBSlave>', iQBSlave, ' iQBMaster>', iQBMaster, ' iQRSlave>', iQRSlave, ' iQRMaster>', iQRMaster, 'iQIncorrect>', iQIncorrect); } return out; } async exe(key, cb) { var _a, _b; const vMsgMonitoring = { time_start: Date.now(), info: { user_id: String((_b = (_a = this.ctx.sys) === null || _a === void 0 ? void 0 : _a.userSys) === null || _b === void 0 ? void 0 : _b.idUser), } }; try { await cb(); if (Date.now() - vMsgMonitoring.time_start > 5000) { this.monitoringSys.sendInfoSqlTimelong('sqltimelong:' + this.ctx.common.nameApp + ':' + this.ctx.req.url + ':' + key, Object.assign(Object.assign({}, vMsgMonitoring), { msg: (0, Json_1.tryJsonToString)({ body: this.ctx.body, param: this.ctx.param, }), time_end: Date.now() })); } else { this.monitoringSys.sendInfoSqlSuccsess('sql:' + this.ctx.common.nameApp + ':' + this.ctx.req.url + ':' + key, Object.assign(Object.assign({}, vMsgMonitoring), { time_end: Date.now() })); } } catch (e) { this.errorSys.errorEx(e, key, 'SQLError>>>' + key); this.monitoringSys.sendErrorSql('sqlerror:' + this.ctx.common.nameApp + ':' + this.ctx.req.url + ':' + key, Object.assign(Object.assign({}, vMsgMonitoring), { msg: (0, Json_1.tryJsonToString)({ trace: e, body: this.ctx.body, param: this.ctx.param, }), time_end: Date.now() })); } } async throwExe(key, cb) { var _a, _b; const vMsgMonitoring = { time_start: Date.now(), val: (_b = (_a = this.ctx.sys) === null || _a === void 0 ? void 0 : _a.userSys) === null || _b === void 0 ? void 0 : _b.idUser }; try { await cb(); if (this.monitoringSys && Date.now() - vMsgMonitoring.time_start > 5000) { this.monitoringSys.sendInfoSqlTimelong('sqltimelong:' + this.ctx.common.nameApp + ':' + this.ctx.req.url + ':' + key, Object.assign(Object.assign({}, vMsgMonitoring), { msg: (0, Json_1.tryJsonToString)({ body: this.ctx.body, param: this.ctx.param, }), time_end: Date.now() })); } else if (this.monitoringSys) { this.monitoringSys.sendInfoSqlSuccsess('sql:' + this.ctx.common.nameApp + ':' + this.ctx.req.url + ':' + key, Object.assign(Object.assign({}, vMsgMonitoring), { time_end: Date.now() })); } } catch (e) { if (this.monitoringSys) { this.monitoringSys.sendErrorSql('sqlerror:' + this.ctx.common.nameApp + ':' + this.ctx.req.url + ':' + key, Object.assign(Object.assign({}, vMsgMonitoring), { msg: (0, Json_1.tryJsonToString)({ trace: e, body: this.ctx.body, param: this.ctx.param, }), time_end: Date.now() })); } throw this.errorSys.throwEx(e, key, 'SQLError>>>' + key); } } /** * Авто кеширование для встраивания в функцию * @param sKey - Ключ кеша * @param iTimeSec - Время кеширования * @param callback - функция получающая данные из БД */ async autoCache(sKey, iTimeSec, callback) { // todo временно проксируем для совместимости return await this.cacheSys.autoCache(sKey, iTimeSec, callback); } /** * Авто кеширование int переменной для встраивания в функцию * @param sKey - Ключ кеша * @param iTimeSec - Время кеширования * @param callback - функция получающая данные из БД */ async autoCacheInt(sKey, iTimeSec, callback) { // todo временно проксируем для совместимости return await this.cacheSys.autoCacheInt(sKey, iTimeSec, callback); } /** * Авто кеширование ID переменной для встраивания в функцию * @param sKey - Ключ кеша * @param iTimeSec - Время кеширования * @param callback - функция получающая данные из БД */ async autoCacheID(sKey, iTimeSec, callback) { // todo временно проксируем для совместимости return await this.cacheSys.autoCacheID(sKey, iTimeSec, callback); } /** * Очистить кеш редиса * @param sKey */ async clearCache(sKey) { // todo временно проксируем для совместимости return await this.cacheSys.clearCache(sKey); } } exports.default = BaseSQL; //# sourceMappingURL=BaseSQL.js.map