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"); } }); };