From 90235d2788251056d64fd5d18afe1e97a5f438f6 Mon Sep 17 00:00:00 2001 From: Marcel Gansfusz Date: Thu, 30 Oct 2025 13:03:02 +0100 Subject: [PATCH] Made the database reconnect when connection is broken --- app/__pycache__/main.cpython-313.pyc | Bin 37154 -> 39342 bytes app/main.py | 44 ++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/app/__pycache__/main.cpython-313.pyc b/app/__pycache__/main.cpython-313.pyc index d5ae5f7c43f38b2151a381c664f1d0b6161452b6..bcae2a42362061b6f8eea0465bdf77ce4469a481 100644 GIT binary patch delta 9344 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 X%9SiT-1ViAKdukSr|Ptl8M5$yI!C{= delta 7146 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 diff --git a/app/main.py b/app/main.py index 5d97673..7bb9b66 100644 --- a/app/main.py +++ b/app/main.py @@ -3,7 +3,7 @@ from typing import List, Dict, Tuple, Sequence from starlette.responses import StreamingResponse from annotated_types import IsDigit -from fastapi import FastAPI, File, HTTPException, Path, UploadFile, Request, Form +from fastapi import FastAPI, File, HTTPException, UploadFile, Request, Form from fastapi.responses import FileResponse # import multiprocessing @@ -21,7 +21,9 @@ import re import os +import signal import mariadb +import sys import filetype @@ -41,6 +43,14 @@ logging.basicConfig( debug = log.debug info = log.info error = log.error +critical = log.critical + + +def exception_handler(etype, value, tb): + log.exception(f"Uncought Exception: {value}") + + +sys.excepthook = exception_handler db = mariadb.connect( host=os.environ.get("DB_HOST", "db"), @@ -117,12 +127,40 @@ def _sql_quarry( ) +def sql_connector_is_active(connector: mariadb.Connection) -> bool: + try: + connector.ping() + except mariadb.Error as e: + return False + return True + + +def sql_connect(connector: mariadb.Connection) -> mariadb.Connection: + try: + connector = mariadb.connect( + host=os.environ.get("DB_HOST", "db"), + user=os.environ.get("DB_USER", "user"), + password=os.environ.get("DB_PASSWORD", "DBPASSWORD"), + database=os.environ.get("DB_DATABASE", "Unizeug"), + ) + except mariadb.Error as e: + critical( + f"Cannot reconnect to Database {os.environ.get('DB_DATABASE', 'Unizeug')} on {os.environ.get('DB_HOST', 'db')}. Got Mariadb Error: {e}" + ) + os.kill(os.getpid(), signal.SIGTERM) + raise HTTPException(500, detail="Database failed") + return connector + + def sql( querry: str, data: Tuple[str | int, ...] | str | int = (), return_result: bool = True, commit: bool = False, ) -> List[Tuple]: + global db + if not sql_connector_is_active(db): + db = sql_connect(db) cur = db.cursor(dictionary=False) return _sql_quarry(cur, querry, data, return_result, commit) @@ -133,6 +171,10 @@ def sqlT( return_result: bool = True, commit: bool = False, ) -> List[Dict]: + global db + if not sql_connector_is_active(db): + db = sql_connect(db) + cur = db.cursor(dictionary=True) return _sql_quarry(cur, querry, data, return_result, commit)