From 71efbd1b42dbcb5835c909a627ca55431eb16bca Mon Sep 17 00:00:00 2001 From: Sven Heidemann Date: Tue, 19 Jul 2022 07:33:51 +0200 Subject: [PATCH] Fixed database connection handling by reconnecting --- src/cpl_core/__init__.py | 4 ++-- src/cpl_core/application/__init__.py | 4 ++-- src/cpl_core/configuration/__init__.py | 4 ++-- src/cpl_core/console/__init__.py | 4 ++-- src/cpl_core/cpl-core.json | 2 +- src/cpl_core/database/__init__.py | 4 ++-- src/cpl_core/database/connection/__init__.py | 4 ++-- src/cpl_core/database/context/__init__.py | 4 ++-- .../database/context/database_context.py | 19 ++++++++++++++++++- .../database/context/database_context_abc.py | 4 ++-- src/cpl_core/dependency_injection/__init__.py | 4 ++-- src/cpl_core/environment/__init__.py | 4 ++-- src/cpl_core/logging/__init__.py | 4 ++-- src/cpl_core/mailing/__init__.py | 4 ++-- src/cpl_core/pipes/__init__.py | 4 ++-- src/cpl_core/time/__init__.py | 4 ++-- src/cpl_core/utils/__init__.py | 4 ++-- 17 files changed, 49 insertions(+), 32 deletions(-) diff --git a/src/cpl_core/__init__.py b/src/cpl_core/__init__.py index 0a3cb04e..c6cfa50b 100644 --- a/src/cpl_core/__init__.py +++ b/src/cpl_core/__init__.py @@ -15,7 +15,7 @@ __title__ = 'cpl_core' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.7.0.post4' +__version__ = '2022.7.0.post5' from collections import namedtuple @@ -23,4 +23,4 @@ from collections import namedtuple # imports: VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='7', micro='0.post4') +version_info = VersionInfo(major='2022', minor='7', micro='0.post5') diff --git a/src/cpl_core/application/__init__.py b/src/cpl_core/application/__init__.py index 9e70c054..c9483801 100644 --- a/src/cpl_core/application/__init__.py +++ b/src/cpl_core/application/__init__.py @@ -15,7 +15,7 @@ __title__ = 'cpl_core.application' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.7.0.post4' +__version__ = '2022.7.0.post5' from collections import namedtuple @@ -29,4 +29,4 @@ from .startup_abc import StartupABC from .startup_extension_abc import StartupExtensionABC VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='7', micro='0.post4') +version_info = VersionInfo(major='2022', minor='7', micro='0.post5') diff --git a/src/cpl_core/configuration/__init__.py b/src/cpl_core/configuration/__init__.py index fabea4a5..351e723a 100644 --- a/src/cpl_core/configuration/__init__.py +++ b/src/cpl_core/configuration/__init__.py @@ -15,7 +15,7 @@ __title__ = 'cpl_core.configuration' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.7.0.post4' +__version__ = '2022.7.0.post5' from collections import namedtuple @@ -35,4 +35,4 @@ from .validator_abc import ValidatorABC from .variable_argument import VariableArgument VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='7', micro='0.post4') +version_info = VersionInfo(major='2022', minor='7', micro='0.post5') diff --git a/src/cpl_core/console/__init__.py b/src/cpl_core/console/__init__.py index 8b07b7b2..7173b0ce 100644 --- a/src/cpl_core/console/__init__.py +++ b/src/cpl_core/console/__init__.py @@ -15,7 +15,7 @@ __title__ = 'cpl_core.console' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.7.0.post4' +__version__ = '2022.7.0.post5' from collections import namedtuple @@ -28,4 +28,4 @@ from .foreground_color_enum import ForegroundColorEnum from .spinner_thread import SpinnerThread VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='7', micro='0.post4') +version_info = VersionInfo(major='2022', minor='7', micro='0.post5') diff --git a/src/cpl_core/cpl-core.json b/src/cpl_core/cpl-core.json index bc354a00..29c2da08 100644 --- a/src/cpl_core/cpl-core.json +++ b/src/cpl_core/cpl-core.json @@ -4,7 +4,7 @@ "Version": { "Major": "2022", "Minor": "7", - "Micro": "0.post4" + "Micro": "0.post5" }, "Author": "Sven Heidemann", "AuthorEmail": "sven.heidemann@sh-edraft.de", diff --git a/src/cpl_core/database/__init__.py b/src/cpl_core/database/__init__.py index a90963e6..d22440f7 100644 --- a/src/cpl_core/database/__init__.py +++ b/src/cpl_core/database/__init__.py @@ -15,7 +15,7 @@ __title__ = 'cpl_core.database' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.7.0.post4' +__version__ = '2022.7.0.post5' from collections import namedtuple @@ -26,4 +26,4 @@ from .database_settings import DatabaseSettings from .table_abc import TableABC VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='7', micro='0.post4') +version_info = VersionInfo(major='2022', minor='7', micro='0.post5') diff --git a/src/cpl_core/database/connection/__init__.py b/src/cpl_core/database/connection/__init__.py index 8fc9b5e7..6a3fda86 100644 --- a/src/cpl_core/database/connection/__init__.py +++ b/src/cpl_core/database/connection/__init__.py @@ -15,7 +15,7 @@ __title__ = 'cpl_core.database.connection' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.7.0.post4' +__version__ = '2022.7.0.post5' from collections import namedtuple @@ -25,4 +25,4 @@ from .database_connection import DatabaseConnection from .database_connection_abc import DatabaseConnectionABC VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='7', micro='0.post4') +version_info = VersionInfo(major='2022', minor='7', micro='0.post5') diff --git a/src/cpl_core/database/context/__init__.py b/src/cpl_core/database/context/__init__.py index c9a4edce..ab5580bf 100644 --- a/src/cpl_core/database/context/__init__.py +++ b/src/cpl_core/database/context/__init__.py @@ -15,7 +15,7 @@ __title__ = 'cpl_core.database.context' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.7.0.post4' +__version__ = '2022.7.0.post5' from collections import namedtuple @@ -25,4 +25,4 @@ from .database_context import DatabaseContext from .database_context_abc import DatabaseContextABC VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='7', micro='0.post4') +version_info = VersionInfo(major='2022', minor='7', micro='0.post5') diff --git a/src/cpl_core/database/context/database_context.py b/src/cpl_core/database/context/database_context.py index 2e00775f..e634eb0c 100644 --- a/src/cpl_core/database/context/database_context.py +++ b/src/cpl_core/database/context/database_context.py @@ -1,6 +1,8 @@ from typing import Optional +import mysql + from cpl_core.database.connection.database_connection import DatabaseConnection from cpl_core.database.connection.database_connection_abc import \ DatabaseConnectionABC @@ -23,12 +25,25 @@ class DatabaseContext(DatabaseContextABC): self._db: DatabaseConnectionABC = DatabaseConnection() self._tables: list[TableABC] = TableABC.__subclasses__() + self._settings: Optional[DatabaseSettings] = None @property def cursor(self) -> MySQLCursorBuffered: + self._ping_and_reconnect() return self._db.cursor - + + def _ping_and_reconnect(self): + try: + self._db.server.ping(reconnect=True, attempts=3, delay=5) + except mysql.connector.Error as err: + # reconnect your cursor as you did in __init__ or wherever + if self._settings is None: + raise Exception('Call DatabaseContext.connect first') + self.connect(self._settings) + def connect(self, database_settings: DatabaseSettings): + if self._settings is None: + self._settings = database_settings self._db.connect(database_settings) for table in self._tables: self._db.cursor.execute(table.get_create_string()) @@ -36,8 +51,10 @@ class DatabaseContext(DatabaseContextABC): self.save_changes() def save_changes(self): + self._ping_and_reconnect() self._db.server.commit() def select(self, statement: str) -> list[tuple]: + self._ping_and_reconnect() self._db.cursor.execute(statement) return self._db.cursor.fetchall() diff --git a/src/cpl_core/database/context/database_context_abc.py b/src/cpl_core/database/context/database_context_abc.py index fe263e95..3a28bc5f 100644 --- a/src/cpl_core/database/context/database_context_abc.py +++ b/src/cpl_core/database/context/database_context_abc.py @@ -12,8 +12,8 @@ class DatabaseContextABC(ABC): pass @property - def cursor(self) -> MySQLCursorBuffered: - return self._cursor + @abstractmethod + def cursor(self) -> MySQLCursorBuffered: pass @abstractmethod def connect(self, database_settings: DatabaseSettings): diff --git a/src/cpl_core/dependency_injection/__init__.py b/src/cpl_core/dependency_injection/__init__.py index 14cae7a3..8126e047 100644 --- a/src/cpl_core/dependency_injection/__init__.py +++ b/src/cpl_core/dependency_injection/__init__.py @@ -15,7 +15,7 @@ __title__ = 'cpl_core.dependency_injection' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.7.0.post4' +__version__ = '2022.7.0.post5' from collections import namedtuple @@ -31,4 +31,4 @@ from .service_provider import ServiceProvider from .service_provider_abc import ServiceProviderABC VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='7', micro='0.post4') +version_info = VersionInfo(major='2022', minor='7', micro='0.post5') diff --git a/src/cpl_core/environment/__init__.py b/src/cpl_core/environment/__init__.py index 9383c79a..f478ea26 100644 --- a/src/cpl_core/environment/__init__.py +++ b/src/cpl_core/environment/__init__.py @@ -15,7 +15,7 @@ __title__ = 'cpl_core.environment' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.7.0.post4' +__version__ = '2022.7.0.post5' from collections import namedtuple @@ -26,4 +26,4 @@ from .environment_name_enum import EnvironmentNameEnum from .application_environment import ApplicationEnvironment VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='7', micro='0.post4') +version_info = VersionInfo(major='2022', minor='7', micro='0.post5') diff --git a/src/cpl_core/logging/__init__.py b/src/cpl_core/logging/__init__.py index fd6d1e5f..238c0859 100644 --- a/src/cpl_core/logging/__init__.py +++ b/src/cpl_core/logging/__init__.py @@ -15,7 +15,7 @@ __title__ = 'cpl_core.logging' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.7.0.post4' +__version__ = '2022.7.0.post5' from collections import namedtuple @@ -28,4 +28,4 @@ from .logging_settings import LoggingSettings from .logging_settings_name_enum import LoggingSettingsNameEnum VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='7', micro='0.post4') +version_info = VersionInfo(major='2022', minor='7', micro='0.post5') diff --git a/src/cpl_core/mailing/__init__.py b/src/cpl_core/mailing/__init__.py index 1652932e..64ef752d 100644 --- a/src/cpl_core/mailing/__init__.py +++ b/src/cpl_core/mailing/__init__.py @@ -15,7 +15,7 @@ __title__ = 'cpl_core.mailing' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.7.0.post4' +__version__ = '2022.7.0.post5' from collections import namedtuple @@ -28,4 +28,4 @@ from .email_client_settings import EMailClientSettings from .email_client_settings_name_enum import EMailClientSettingsNameEnum VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='7', micro='0.post4') +version_info = VersionInfo(major='2022', minor='7', micro='0.post5') diff --git a/src/cpl_core/pipes/__init__.py b/src/cpl_core/pipes/__init__.py index 405f9d93..52bb2ed0 100644 --- a/src/cpl_core/pipes/__init__.py +++ b/src/cpl_core/pipes/__init__.py @@ -15,7 +15,7 @@ __title__ = 'cpl_core.pipes' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.7.0.post4' +__version__ = '2022.7.0.post5' from collections import namedtuple @@ -30,4 +30,4 @@ from .to_camel_case_pipe import ToCamelCasePipe from .to_snake_case_pipe import ToSnakeCasePipe VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='7', micro='0.post4') +version_info = VersionInfo(major='2022', minor='7', micro='0.post5') diff --git a/src/cpl_core/time/__init__.py b/src/cpl_core/time/__init__.py index be3afc80..80254875 100644 --- a/src/cpl_core/time/__init__.py +++ b/src/cpl_core/time/__init__.py @@ -15,7 +15,7 @@ __title__ = 'cpl_core.time' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.7.0.post4' +__version__ = '2022.7.0.post5' from collections import namedtuple @@ -25,4 +25,4 @@ from .time_format_settings import TimeFormatSettings from .time_format_settings_names_enum import TimeFormatSettingsNamesEnum VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='7', micro='0.post4') +version_info = VersionInfo(major='2022', minor='7', micro='0.post5') diff --git a/src/cpl_core/utils/__init__.py b/src/cpl_core/utils/__init__.py index 05b38c5e..b20282d1 100644 --- a/src/cpl_core/utils/__init__.py +++ b/src/cpl_core/utils/__init__.py @@ -15,7 +15,7 @@ __title__ = 'cpl_core.utils' __author__ = 'Sven Heidemann' __license__ = 'MIT' __copyright__ = 'Copyright (c) 2020 - 2022 sh-edraft.de' -__version__ = '2022.7.0.post4' +__version__ = '2022.7.0.post5' from collections import namedtuple @@ -26,4 +26,4 @@ from .string import String from .pip import Pip VersionInfo = namedtuple('VersionInfo', 'major minor micro') -version_info = VersionInfo(major='2022', minor='7', micro='0.post4') +version_info = VersionInfo(major='2022', minor='7', micro='0.post5')