oslo.db/oslo_db/sqlalchemy/compat/__init__.py
Stephen Finucane 64e50494f2 Use SQLAlchemy native pre-ping
This functionality has been available upstream since SQLALchemy 1.2 [1].
However, for oslo.db to use this feature while maintaining full
behavior, we need at least SQLAlchemy 2.0.5 to provide complete event
support.  In particular, oslo.db adds several new "is disconnect"
conditions including those specific to Galera.

Behavior of the handle_error event is modified to expect the "pre-ping"
calling form, which may not have an "engine" present (only a dialect),
and additionally takes advantage of the new is_pre_ping attribute which
informs on the correct way to affect the disconnection status within the
ping handler.

Change-Id: I50d862d3cbb126987a63209795352c6e801ed919
2023-04-06 14:55:03 +01:00

39 lines
1.2 KiB
Python

# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from oslo_utils import versionutils
from sqlalchemy import __version__
_vers = versionutils.convert_version_to_tuple(__version__)
sqla_2 = _vers >= (2, )
native_pre_ping_event_support = _vers >= (2, 0, 5)
def dialect_from_exception_context(ctx):
if sqla_2:
# SQLAlchemy 2.0 still has context.engine, however if the
# exception context is called in the context of a ping handler,
# engine is not present. need to use dialect instead
return ctx.dialect
else:
return ctx.engine.dialect
def driver_connection(connection):
if sqla_2:
return connection.connection.driver_connection
else:
return connection.connection.connection