]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
feat: add 'Pipeline.is_supported()'
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Sun, 27 Mar 2022 17:18:17 +0000 (19:18 +0200)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Sat, 2 Apr 2022 23:17:57 +0000 (01:17 +0200)
This makes easier to write conditional code depending on whether we
support pipeline mode or not.

psycopg/psycopg/_pipeline.py
tests/pq/test_pq.py

index 429b2c75dc35bf34709a84929c172d8e5662a7a0..8a745691064da347b9b6a8c8ac5e570cd0fad02f 100644 (file)
@@ -43,6 +43,7 @@ class BasePipeline:
 
     command_queue: Deque[PipelineCommand]
     result_queue: Deque[PendingResult]
+    _is_supported: Optional[bool] = None
 
     def __init__(self, conn: "BaseConnection[Any]") -> None:
         self._conn = conn
@@ -59,6 +60,16 @@ class BasePipeline:
         self.command_queue.append(self.pgconn.pipeline_sync)
         self.result_queue.append(None)
 
+    @staticmethod
+    def is_supported() -> bool:
+        """Return `True` if the psycopg libpq wrapper suports pipeline mode."""
+        if BasePipeline._is_supported is None:
+            # Support only depends on the libpq functions available in the pq
+            # wrapper, not on the database version.
+            pq_version = pq.__build_version__ or pq.version()
+            BasePipeline._is_supported = pq_version >= 140000
+        return BasePipeline._is_supported
+
     def _enter(self) -> None:
         self.pgconn.enter_pipeline_mode()
 
index e859a122afb2e240ad5a262c0c9165a830bdf03e..41e4b72a18428d16e57e28c856f16b1b3eac7a86 100644 (file)
@@ -1,3 +1,4 @@
+import psycopg
 from psycopg import pq
 
 
@@ -14,3 +15,12 @@ def test_build_version():
         assert pq.__build_version__ and pq.__build_version__ >= 70400
     else:
         assert False, f"unexpected libpq implementation: {pq.__impl__}"
+
+
+def test_pipeline_supported():
+    # Note: This test is here because pipeline tests are skipped on libpq < 14
+    if pq.__impl__ == "python":
+        assert psycopg.Pipeline.is_supported() == (pq.version() >= 140000)
+    else:
+        assert pq.__build_version__ is not None
+        assert psycopg.Pipeline.is_supported() == (pq.__build_version__ >= 140000)