) and "not connected" in str(e):
return True
- if hasattr(error, "code"):
+ if hasattr(error, "code") and error.code in {
+ 28,
+ 3114,
+ 3113,
+ 3135,
+ 1033,
+ 2396,
+ }:
# ORA-00028: your session has been killed
# ORA-03114: not connected to ORACLE
# ORA-03113: end-of-file on communication channel
# ORA-01033: ORACLE initialization or shutdown in progress
# ORA-02396: exceeded maximum idle time, please connect again
# TODO: Others ?
- return error.code in (28, 3114, 3113, 3135, 1033, 2396)
- else:
- return False
+ return True
+
+ if re.match(r"^(?:DPI-1010|DPI-1080)", str(e)):
+ # DPI-1010: not connected
+ # DPI-1080: connection was closed by ORA-3113
+ # TODO: others?
+ return True
+
+ return False
def create_xid(self):
"""create a two-phase transaction ID.
# coding: utf-8
import re
+from unittest import mock
from unittest.mock import Mock
from sqlalchemy import bindparam
from sqlalchemy.testing import engines
from sqlalchemy.testing import eq_
from sqlalchemy.testing import fixtures
-from sqlalchemy.testing import mock
from sqlalchemy.testing.schema import Column
from sqlalchemy.testing.schema import Table
from sqlalchemy.testing.suite import test_select
exc.InvalidRequestError,
"cx_Oracle version 5.2 and above are supported",
cx_oracle.OracleDialect_cx_oracle,
- dbapi=Mock(),
+ dbapi=mock.Mock(),
)
with mock.patch(
"_parse_cx_oracle_ver",
lambda self, vers: (5, 3, 1),
):
- cx_oracle.OracleDialect_cx_oracle(dbapi=Mock())
+ cx_oracle.OracleDialect_cx_oracle(dbapi=mock.Mock())
class DialectWBackendTest(fixtures.TestBase):
__backend__ = True
__only_on__ = "oracle"
+ @testing.combinations(
+ (
+ "db is not connected",
+ None,
+ True,
+ ),
+ (
+ "ORA-1234 fake error",
+ 1234,
+ False,
+ ),
+ (
+ "ORA-03114: not connected to ORACLE",
+ 3114,
+ True,
+ ),
+ (
+ "DPI-1010: not connected",
+ None,
+ True,
+ ),
+ (
+ "DPI-1010: make sure we read the code",
+ None,
+ True,
+ ),
+ (
+ "DPI-1080: connection was closed by ORA-3113",
+ None,
+ True,
+ ),
+ (
+ "DPI-1234: some other DPI error",
+ None,
+ False,
+ ),
+ )
+ @testing.only_on("oracle+cx_oracle")
+ def test_is_disconnect(self, message, code, expected):
+
+ dialect = testing.db.dialect
+
+ exception_obj = dialect.dbapi.InterfaceError()
+ exception_obj.args = (Exception(message),)
+ exception_obj.args[0].code = code
+
+ eq_(dialect.is_disconnect(exception_obj, None, None), expected)
+
def test_hypothetical_not_implemented_isolation_level(self):
engine = engines.testing_engine()