]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Improve ``oracledb`` thick mode flag.
authorFederico Caselli <cfederico87@gmail.com>
Mon, 13 Feb 2023 21:35:09 +0000 (22:35 +0100)
committerFederico Caselli <cfederico87@gmail.com>
Tue, 14 Feb 2023 20:40:37 +0000 (21:40 +0100)
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

doc/build/changelog/unreleased_20/9295.rst [new file with mode: 0644]
lib/sqlalchemy/dialects/oracle/oracledb.py
test/dialect/oracle/_oracledb_mode.py
test/dialect/oracle/test_dialect.py

diff --git a/doc/build/changelog/unreleased_20/9295.rst b/doc/build/changelog/unreleased_20/9295.rst
new file mode 100644 (file)
index 0000000..57b872f
--- /dev/null
@@ -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.
index eecbbd16c835f31489df8295ec37af2acc521c7a..3ead846b154e8fcd86cdd4e4c9a8b64cfeee4a39 100644 (file)
@@ -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)
 
index 21743d6ec73408ae39d2574ef3afb1bb03214465..a02a5389b2c2d068fa5380a650433532d6272b36 100644 (file)
@@ -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)))
index 38f4b176b8374bcb296cd8a50a5abf6d6e179354..4587fe6c096d1a615aa803e40d736b2c8105e65d 100644 (file)
@@ -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):