Correction robustesse : vérification et rétablissement automatique de la connexion MariaDB en tout début de chaque route (assurer_connexion_bdd) - corrige une perte silencieuse de données après une longue période d'exécution continue (connexion tombée sans jamais être rétablie), validé par test direct (KILL de la connexion côté MariaDB)

This commit is contained in:
2026-09-23 19:27:52 +02:00
parent d1514cae2d
commit 88591790d0
3 changed files with 630 additions and 0 deletions
+31
View File
@@ -164,6 +164,32 @@ static QHttpServerResponse withCors(QHttpServerResponse &&resp)
return std::move(resp);
}
// ----------------------------------------------------------------------------
// Vérifie que la connexion MariaDB (ouverte une seule fois au démarrage) est
// toujours active, et la rétablit sinon. isOpen() peut rester vrai même après
// une coupure réseau ou un dépassement de wait_timeout côté serveur - un test
// léger (SELECT 1) confirme que la connexion répond réellement. Sans ce
// contrôle, l'API reste "vivante" indéfiniment mais chaque requête SQL échoue
// silencieusement après une longue période d'inactivité (constaté après
// plusieurs semaines d'exécution continue, cf synthèse).
// À appeler en tout premier dans chaque route qui touche la base.
// ----------------------------------------------------------------------------
static void assurer_connexion_bdd()
{
QSqlDatabase db = QSqlDatabase::database();
if (db.isOpen()) {
QSqlQuery test(db);
if (test.exec("SELECT 1")) return;
}
qWarning() << "Connexion MariaDB perdue, tentative de reconnexion...";
db.close();
if (db.open()) {
qInfo() << "Reconnexion MariaDB réussie.";
} else {
qCritical() << "Reconnexion MariaDB échouée :" << db.lastError().text();
}
}
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
@@ -196,6 +222,7 @@ int main(int argc, char *argv[])
// requêtes onglets de mise_a_jour_onglets_circuits()).
// ------------------------------------------------------------------
server.route("/elements/familles", [](const QHttpServerRequest &request) {
assurer_connexion_bdd();
QUrlQuery query(request.query());
const QString type = query.queryItemValue("type");
@@ -352,6 +379,7 @@ int main(int argc, char *argv[])
// différents, mais un seul, appelé deux fois).
// ------------------------------------------------------------------
server.route("/elements", [](const QHttpServerRequest &request) {
assurer_connexion_bdd();
QUrlQuery query(request.query());
const QString type = query.queryItemValue("type");
const QString familleStr = query.queryItemValue("famille");
@@ -610,6 +638,7 @@ int main(int argc, char *argv[])
// ------------------------------------------------------------------
server.route("/elements/circuit/<arg>", QHttpServerRequest::Method::Patch,
[](int idCircuit, const QHttpServerRequest &request) {
assurer_connexion_bdd();
const QJsonDocument body = QJsonDocument::fromJson(request.body());
if (!body.isObject()) {
QJsonObject err;
@@ -686,6 +715,7 @@ int main(int argc, char *argv[])
// Circuits/batteries (sélection de variable côté client) à venir.
// ------------------------------------------------------------------
server.route("/mesures", [](const QHttpServerRequest &request) {
assurer_connexion_bdd();
QUrlQuery query(request.query());
const QString type = query.queryItemValue("type");
const QString idStr = query.queryItemValue("id");
@@ -1037,6 +1067,7 @@ int main(int argc, char *argv[])
// 90% du temps de traitement natif pour un gain marginal).
// ------------------------------------------------------------------
server.route("/energie", [](const QHttpServerRequest &request) {
assurer_connexion_bdd();
QUrlQuery query(request.query());
const QString type = query.queryItemValue("type");
const QString idStr = query.queryItemValue("id");