ZoeApi/connections/mysql-server.js

125 lines
4.4 KiB
JavaScript

const mysql = require('mysql');
require('../helpers/config');
require('../helpers/CheckToken');
require("dotenv-safe").load();
var jwt = require('jsonwebtoken');
var MySQLConfig = {
connectionLimit: 100, // Reduzido de 1000 para 100
host: Variables('ip_mysql'),
user: Variables('user_mysql'),
database: Variables('database_mysql'),
password: Variables('password_mysql'),
charset: "utf8mb4"
};
// Criação do pool de conexões MySQL
let pool = mysql.createPool(MySQLConfig);
console.log("MySQL Pool criado!");
// Atribui a conexão global à primeira conexão disponível do pool
global.mysqlConnection = pool;
// Função para verificar se o pool está ativo
function isPoolActive() {
return pool && !pool._closed;
}
// Função para recriar o pool se ele estiver fechado
function recreatePoolIfClosed() {
if (!isPoolActive()) {
console.log('Recriando o pool de conexões MySQL...');
pool = mysql.createPool(MySQLConfig);
console.log("Novo MySQL Pool criado!");
}
}
// Função para executar uma query SQL com verificação do pool
global.execSQLQuery = function execSQLQuery(sqlQry, res, req, Parametros = null, callback = null) {
// Verifica e recria o pool se necessário
recreatePoolIfClosed();
pool.query(sqlQry, Parametros, function (error, results, fields) {
if (error) {
console.error('Erro na consulta MySQL:', error);
if (error.toString().includes("PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR") || error.toString().includes("Connection lost")) {
console.log('Tentando reconectar e executar a consulta novamente...');
execSQLQuery(sqlQry, res, req, Parametros, callback); // Reexecuta a query
return;
}
if (error.toString().includes("Too many connections")) {
console.log('Muitas conexões abertas. Aguardando antes de tentar novamente...');
setTimeout(() => {
execSQLQuery(sqlQry, res, req, Parametros, callback);
}, 1000); // Aumente o tempo de espera para reduzir a sobrecarga
return;
}
// Retorno de erro
let Retorno = { "status": 500, "error": error, "response": [] };
res.send(JSON.stringify(Retorno));
console.log(new Date().toUTCString() + ` - ${req}/ error 500`);
if (callback) callback(Retorno);
return;
}
// Retorno de sucesso
let Retorno = { "status": 200, "error": null, "response": results };
res.send(JSON.stringify(Retorno));
console.log(new Date().toUTCString() + ` - ${req}/ success 200`);
if (callback) callback(Retorno);
});
};
// Similarmente, aplique a verificação nas outras funções
global.execMySQLQueryLogin = function execMySQLQueryLogin(sqlQry, res, req) {
recreatePoolIfClosed();
pool.query(sqlQry, function (error, results, fields) {
if (error || results.length == 0) {
res.send(JSON.stringify({
"status": 500,
"error": error,
"response": [],
"token": null
}));
console.log(new Date().toUTCString() + " - " + req + "/ error 500");
return;
}
var token = jwt.sign({ id }, process.env.SECRET, {
expiresIn: Variables('time_token')
});
res.send(JSON.stringify({
"status": 200,
"error": null,
"response": results,
"token": token
}));
console.log(new Date().toUTCString() + " - " + req + "/ success 200");
});
};
global.execSQLQueryVideo = function execSQLQueryVideo(sqlQry, res, req) {
recreatePoolIfClosed();
pool.query(sqlQry, function (error, results, fields) {
if (!error && results.length != 0) {
let idvideoaccess = results[0]['idvideoaccess'];
res.redirect(results[0]['url']);
// Atualização após redirecionamento
setTimeout(() => {
pool.query(`UPDATE videoaccess SET expired = 1 where idvideoaccess = ${idvideoaccess}`, function (error, results, fields) {
if (error) {
console.error('Erro ao atualizar videoaccess:', error);
}
});
}, 1000);
} else {
res.send("not found");
}
});
};