Session Reset#

This example demonstrates how to reset Exasol parameter changes in the context of a database session to the global system values.

examples/features/specific_focuses/_6_session_reset.py#
from dataclasses import dataclass

import sqlalchemy

from examples.config import SQL_ALCHEMY

# 1. Define a class to conveniently reset EXA_PARAMETERS to
# their resp. system values


@dataclass
class ExaParam:
    name: str
    session_value: str
    system_value: str

    QUERY = sqlalchemy.text("SELECT * FROM EXA_PARAMETERS")

    @classmethod
    def alter_statement(
        cls,
        name: str,
        value: str,
        scope: str = "SESSION",
    ) -> sqlalchemy.TextClause:
        return sqlalchemy.text(f"ALTER {scope} SET {name} = '{value}'")

    @property
    def differs(self) -> bool:
        return self.session_value != self.system_value

    @property
    def alter_session(self) -> sqlalchemy.TextClause:
        return self.alter_statement(self.name, self.system_value)


# 2. Create an engine using a connection pool
engine = SQL_ALCHEMY.create_engine(
    poolclass=sqlalchemy.QueuePool,
    pool_size=10,
    max_overflow=2,
    pool_recycle=3600,  # recycle connections after an hour
    pool_pre_ping=True,  # test connection liveness before use
)


# 3. Listen when a connection is reset
def on_reset(con, connection_record, reset_state):
    with con.cursor() as cur:
        # Retrieve changed parameters
        cur.execute(ExaParam.QUERY)
        altered_parameters = (
            exa_param for row in cur.fetchall() if (exa_param := ExaParam(*row)).differs
        )
        # Reset parameter values
        for p in altered_parameters:
            reset = p.alter_session
            print(f"{reset}")
            cur.execute(reset)


sqlalchemy.event.listen(engine, "reset", on_reset)

with engine.connect() as con:
    # 4. Intentionally modify one parameter to showcase an example
    con.execute(ExaParam.alter_statement("IDLE_TIMEOUT", "80000"))


# 5. Rely on Event handler on_reset() to reset changed parameters to their
# resp. system values.