@63pokupki/nodejs-common
Version:
Common nodejs functionality
213 lines • 9.41 kB
JavaScript
"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