From: Federico Caselli Date: Mon, 13 Feb 2023 21:35:09 +0000 (+0100) Subject: Improve ``oracledb`` thick mode flag. X-Git-Tag: rel_2_0_4~11^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c7a5c4dd2063be596be9731e493d4ea9a3ff1123;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Improve ``oracledb`` thick mode flag. Adjusted ``oracledb`` thick mode flag to make ``thick_mode=False`` not enable thick mode. Previously only ``None`` was accepted as off value. Fixes: #9295 Change-Id: I1a8397c19d065dfc2dda597e719922fc8d31acb1 --- diff --git a/doc/build/changelog/unreleased_20/9295.rst b/doc/build/changelog/unreleased_20/9295.rst new file mode 100644 index 0000000000..57b872f711 --- /dev/null +++ b/doc/build/changelog/unreleased_20/9295.rst @@ -0,0 +1,6 @@ +.. change:: + :tags: oracle, bug + :tickets: 9295 + + Adjusted ``oracledb`` ``thick_mode`` flag to accept any falsy value that's + not a dict as off value. Previously only ``None`` was accepted as off value. diff --git a/lib/sqlalchemy/dialects/oracle/oracledb.py b/lib/sqlalchemy/dialects/oracle/oracledb.py index eecbbd16c8..3ead846b15 100644 --- a/lib/sqlalchemy/dialects/oracle/oracledb.py +++ b/lib/sqlalchemy/dialects/oracle/oracledb.py @@ -76,7 +76,9 @@ class OracleDialect_oracledb(_OracleDialect_cx_oracle): **kwargs, ) - if self.dbapi is not None and thick_mode is not None: + if self.dbapi is not None and ( + thick_mode or isinstance(thick_mode, dict) + ): kw = thick_mode if isinstance(thick_mode, dict) else {} self.dbapi.init_oracle_client(**kw) diff --git a/test/dialect/oracle/_oracledb_mode.py b/test/dialect/oracle/_oracledb_mode.py index 21743d6ec7..a02a5389b2 100644 --- a/test/dialect/oracle/_oracledb_mode.py +++ b/test/dialect/oracle/_oracledb_mode.py @@ -14,16 +14,16 @@ def _get_version(conn): return conn.exec_driver_sql(sql).scalar() -def run_thin_mode(url, queue): - e = create_engine(url) +def run_thin_mode(url, queue, **kw): + e = create_engine(url, **kw) with e.connect() as conn: res = _get_version(conn) queue.put((res, e.dialect.is_thin_mode(conn))) e.dispose() -def run_thick_mode(url, queue): - e = create_engine(url, thick_mode={"driver_name": "custom-driver-name"}) +def run_thick_mode(url, queue, **kw): + e = create_engine(url, **kw) with e.connect() as conn: res = _get_version(conn) queue.put((res, e.dialect.is_thin_mode(conn))) diff --git a/test/dialect/oracle/test_dialect.py b/test/dialect/oracle/test_dialect.py index 38f4b176b8..4587fe6c09 100644 --- a/test/dialect/oracle/test_dialect.py +++ b/test/dialect/oracle/test_dialect.py @@ -96,10 +96,12 @@ class OracledbMode(fixtures.TestBase): __backend__ = True __only_on__ = "oracle+oracledb" - def _run_in_process(self, fn): + def _run_in_process(self, fn, fn_kw=None): ctx = get_context("spawn") queue = ctx.Queue() - process = ctx.Process(target=fn, args=(config.db_url, queue)) + process = ctx.Process( + target=fn, args=(config.db_url, queue), kwargs=fn_kw or {} + ) try: process.start() process.join(10) @@ -108,19 +110,24 @@ class OracledbMode(fixtures.TestBase): finally: process.kill() - def test_thin_mode(self): + @testing.combinations({}, {"thick_mode": None}, {"thick_mode": False}) + def test_thin_mode(self, options): from ._oracledb_mode import run_thin_mode - mode, is_thin = self._run_in_process(run_thin_mode) + mode, is_thin = self._run_in_process(run_thin_mode, options) is_true(is_thin) is_true(mode.startswith("python-oracledb thn")) - def test_thick_mode(self): + @testing.combinations(True, {}, {"driver_name": "custom-driver-name"}) + def test_thick_mode(self, value): from ._oracledb_mode import run_thick_mode - mode, is_thin = self._run_in_process(run_thick_mode) + mode, is_thin = self._run_in_process( + run_thick_mode, {"thick_mode": value} + ) is_false(is_thin) - eq_(mode.strip(), "custom-driver-name") + if isinstance(value, dict) and value.get("driver_name"): + eq_(mode.strip(), "custom-driver-name") class DialectWBackendTest(fixtures.TestBase):