packages feed

pqi-conformance 0.1.0.0 → 0.1.0.1

raw patch · 105 files changed

+506/−505 lines, 105 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

Files

CHANGELOG.md view
@@ -1,3 +1,9 @@+# v0.1.0.1++## Fixes++- Removed remaining `OverloadedRecordDot` usages from the source, since that extension (along with `DuplicateRecordFields` and `NoFieldSelectors`) was dropped from the default extensions to support GHC 8.10+ # v0.1.0.0  ## Breaking
pqi-conformance.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.0 name: pqi-conformance-version: 0.1.0.0+version: 0.1.0.1 category: Database, PostgreSQL, Testing synopsis: Differential conformance tests for pqi adapters description:@@ -27,7 +27,6 @@ common base   default-language: Haskell2010   default-extensions:-    ApplicativeDo     BangPatterns     BinaryLiterals     BlockArguments@@ -40,7 +39,6 @@     DeriveTraversable     DerivingStrategies     DerivingVia-    DuplicateRecordFields     EmptyDataDecls     ExistentialQuantification     FlexibleContexts@@ -54,11 +52,9 @@     MultiParamTypeClasses     MultiWayIf     NamedFieldPuns-    NoFieldSelectors     NoImplicitPrelude     NoMonomorphismRestriction     NumericUnderscores-    OverloadedRecordDot     OverloadedStrings     ParallelListComp     PatternGuards@@ -68,7 +64,6 @@     ScopedTypeVariables     StandaloneDeriving     StrictData-    TemplateHaskell     TupleSections     TypeApplications     TypeFamilies
src/library/Pqi/Conformance/Harness.hs view
@@ -55,8 +55,8 @@   Expectation differential adapter adminConninfo scenario =   withTestDb adminConninfo \testConninfo -> do-    candidate <- bracket (adapter.connectdb testConninfo) (.finish) scenario-    reference <- bracket (Reference.adapter.connectdb testConninfo) (.finish) scenario+    candidate <- bracket (Pqi.connectdb adapter testConninfo) Pqi.finish scenario+    reference <- bracket (Pqi.connectdb Reference.adapter testConninfo) Pqi.finish scenario     candidate `shouldBe` reference  -- Create a uniquely named database, run the action against it, and drop it on@@ -76,9 +76,9 @@  adminExec :: ByteString -> ByteString -> IO () adminExec conninfo sql = do-  conn <- Reference.adapter.connectdb conninfo-  _ <- conn.exec sql-  conn.finish+  conn <- Pqi.connectdb Reference.adapter conninfo+  _ <- Pqi.exec conn sql+  Pqi.finish conn  -- | Like 'differential', but for scenarios that exercise connection -- establishment itself ('Pqi.connectdb' on a broken conninfo,
src/library/Pqi/Conformance/Observation.hs view
@@ -68,45 +68,45 @@ -- | Project a result into a 'ResultObservation'. observeResult :: Lq.Result -> IO ResultObservation observeResult result = do-  status <- result.resultStatus+  status <- Lq.resultStatus result   errorFields <-     traverse-      (\code -> (,) code <$> result.resultErrorField code)+      (\code -> (,) code <$> Lq.resultErrorField result code)       [minBound .. maxBound]-  errorMessage <- result.resultErrorMessage-  ntuples <- result.ntuples-  nfields <- result.nfields-  nparams <- result.nparams-  paramTypes <- traverse result.paramtype [0 .. nparams - 1]+  errorMessage <- Lq.resultErrorMessage result+  ntuples <- Lq.ntuples result+  nfields <- Lq.nfields result+  nparams <- Lq.nparams result+  paramTypes <- traverse (Lq.paramtype result) [0 .. nparams - 1]   fields <- traverse (observeField result) [0 .. nfields - 1]   rows <- traverse (\row -> traverse (observeCell result row) [0 .. nfields - 1]) [0 .. ntuples - 1]-  cmdStatus <- result.cmdStatus-  cmdTuples <- result.cmdTuples+  cmdStatus <- Lq.cmdStatus result+  cmdTuples <- Lq.cmdTuples result   pure ResultObservation {..}  observeField :: Lq.Result -> Int32 -> IO FieldObservation observeField result column = do-  name <- result.fname column-  typeOid <- result.ftype column-  modifier <- result.fmod column-  size <- result.fsize column-  format <- result.fformat column-  tableOid <- result.ftable column-  tableColumn <- result.ftablecol column+  name <- Lq.fname result column+  typeOid <- Lq.ftype result column+  modifier <- Lq.fmod result column+  size <- Lq.fsize result column+  format <- Lq.fformat result column+  tableOid <- Lq.ftable result column+  tableColumn <- Lq.ftablecol result column   pure FieldObservation {..}  observeCell :: Lq.Result -> Int32 -> Int32 -> IO CellObservation observeCell result row column = do-  value <- result.getvalue row column-  isNull <- result.getisnull row column-  length <- result.getlength row column+  value <- Lq.getvalue result row column+  isNull <- Lq.getisnull result row column+  length <- Lq.getlength result row column   pure CellObservation {..}  -- | A snapshot of the comparable portion of a connection's state. The -- candidate and the reference open their connections from the same conninfo -- string, so the conninfo-derived identity accessors agree as well. data ConnectionObservation = ConnectionObservation-  { status :: Lq.ConnStatus,+  { connectionStatus :: Lq.ConnStatus,     transactionStatus :: Lq.TransactionStatus,     serverVersion :: Int,     serverVersionParam :: Maybe ByteString,@@ -119,25 +119,25 @@     options :: Maybe ByteString,     connectionNeedsPassword :: Bool,     connectionUsedPassword :: Bool,-    isNull :: Bool+    connectionIsNull :: Bool   }   deriving stock (Eq, Show)  -- | Project a connection into a 'ConnectionObservation'. observeConnection :: Lq.Connection -> IO ConnectionObservation observeConnection connection = do-  status <- connection.status-  transactionStatus <- connection.transactionStatus-  serverVersion <- connection.serverVersion-  serverVersionParam <- connection.parameterStatus "server_version"-  protocolVersion <- connection.protocolVersion-  db <- connection.db-  user <- connection.user-  pass <- connection.pass-  host <- connection.host-  port <- connection.port-  options <- connection.options-  connectionNeedsPassword <- connection.connectionNeedsPassword-  connectionUsedPassword <- connection.connectionUsedPassword-  let isNull = connection.isNullConnection+  connectionStatus <- Lq.status connection+  transactionStatus <- Lq.transactionStatus connection+  serverVersion <- Lq.serverVersion connection+  serverVersionParam <- Lq.parameterStatus connection "server_version"+  protocolVersion <- Lq.protocolVersion connection+  db <- Lq.db connection+  user <- Lq.user connection+  pass <- Lq.pass connection+  host <- Lq.host connection+  port <- Lq.port connection+  options <- Lq.options connection+  connectionNeedsPassword <- Lq.connectionNeedsPassword connection+  connectionUsedPassword <- Lq.connectionUsedPassword connection+  let connectionIsNull = Lq.isNullConnection connection   pure ConnectionObservation {..}
src/library/Pqi/Conformance/Operation/BackendPID.hs view
@@ -17,4 +17,4 @@   describe "backendPID" do     it "is positive on an open connection" \conninfo ->       differential adapter conninfo \connection ->-        (> 0) <$> connection.backendPID+        (> 0) <$> Pqi.backendPID connection
src/library/Pqi/Conformance/Operation/Cancel.hs view
@@ -22,15 +22,15 @@   describe "cancel" do     it "succeeds on an idle connection" \conninfo ->       differential adapter conninfo \connection -> do-        handle <- connection.getCancel-        for handle (.cancel)+        handle <- Pqi.getCancel connection+        for handle Pqi.cancel      it "fails a running query with 57014" \conninfo ->       differential adapter conninfo \connection -> do-        sent <- connection.sendQuery "select pg_sleep(10)"+        sent <- Pqi.sendQuery connection "select pg_sleep(10)"         threadDelay 100000-        handle <- connection.getCancel-        cancelled <- for handle (.cancel)+        handle <- Pqi.getCancel connection+        cancelled <- for handle Pqi.cancel         results <- drainResults connection         usable <- execScenario "select 1" connection         pure (sent, cancelled, results, usable)@@ -38,10 +38,10 @@     it "leaves the connection usable after cancelling a short-running query" \conninfo ->       differential adapter conninfo \connection -> do         outcomes <- replicateM 3 do-          sent <- connection.sendQuery "select pg_sleep(0.1)"+          sent <- Pqi.sendQuery connection "select pg_sleep(0.1)"           threadDelay 50000-          handle <- connection.getCancel-          cancelled <- for handle (.cancel)+          handle <- Pqi.getCancel connection+          cancelled <- for handle Pqi.cancel           results <- drainResults connection           usable <- execScenario "select 1" connection           pure (sent, cancelled, results, usable)
src/library/Pqi/Conformance/Operation/Cancel/Cleanup.hs view
@@ -38,11 +38,11 @@     --   5. exec runs a follow-up command — it must NOT be cancelled by the     --      stale signal that arrived in step 2.     it "does not corrupt subsequent commands when cancel is called after pipeline results are drained" \conninfo ->-      bracket (adapter.connectdb conninfo) (.finish) \connection -> do+      bracket (Lq.connectdb adapter conninfo) Lq.finish \connection -> do         -- Enter pipeline mode and dispatch a fast query.-        _ <- connection.enterPipelineMode-        _ <- connection.sendQueryParams "select 1" [] Lq.Text-        _ <- connection.pipelineSync+        _ <- Lq.enterPipelineMode connection+        _ <- Lq.sendQueryParams connection "select 1" [] Lq.Text+        _ <- Lq.pipelineSync connection          -- Wait for the server to process the query so both messages         -- (CommandComplete + ReadyForQuery) are already in the socket by the@@ -53,7 +53,7 @@         -- After this loop exits, asyncPending=True in pqi-native because         -- ReadyForQuery has not been read yet.         let drainAll = do-              mr <- connection.getResult+              mr <- Lq.getResult connection               case mr of                 Nothing -> pure ()                 Just _ -> drainAll@@ -61,8 +61,8 @@          -- Send cancel.  Because asyncPending=True in pqi-native, a cancel         -- request is dispatched to the server despite the query being done.-        handle <- connection.getCancel-        for_ handle (.cancel)+        handle <- Lq.getCancel connection+        for_ handle Lq.cancel          -- Give the stale cancel enough time to reach the server and set         -- QueryCancelPending before the next command arrives.@@ -72,13 +72,13 @@         drainAll          -- Exit pipeline mode (sends an implicit Sync in the reference impl).-        _ <- connection.exitPipelineMode+        _ <- Lq.exitPipelineMode connection          -- A follow-up command must succeed; 57014 here means the stale cancel         -- corrupted the connection.-        mResult <- connection.exec "select 1"+        mResult <- Lq.exec connection "select 1"         case mResult of           Nothing -> expectationFailure "exec returned no result after pipeline cleanup"           Just result -> do-            status <- result.resultStatus+            status <- Lq.resultStatus result             status `shouldBe` Lq.TuplesOk
src/library/Pqi/Conformance/Operation/Cancel/Stale.hs view
@@ -67,16 +67,16 @@   ByteString ->   IO (Maybe (Lq.ExecStatus, Maybe ByteString)) runScenario adapter conninfo =-  bracket (adapter.connectdb conninfo) (.finish) \connection -> do+  bracket (Lq.connectdb adapter conninfo) Lq.finish \connection -> do     -- Build a pipeline with a fast query followed by a slow one, mirroring the     -- sequence hasql issues.  Two prepared statements keep pendingParses in     -- play, matching the real-world reproduction.-    _ <- connection.enterPipelineMode-    _ <- connection.sendPrepare "s1" "select $1::int" Nothing-    _ <- connection.sendQueryPrepared "s1" [Just ("42", Lq.Text)] Lq.Text-    _ <- connection.sendPrepare "s2" "select pg_sleep($1)" (Just [float8Oid])-    _ <- connection.sendQueryPrepared "s2" [Just ("0.1", Lq.Text)] Lq.Text-    _ <- connection.pipelineSync+    _ <- Lq.enterPipelineMode connection+    _ <- Lq.sendPrepare connection "s1" "select $1::int" Nothing+    _ <- Lq.sendQueryPrepared connection "s1" [Just ("42", Lq.Text)] Lq.Text+    _ <- Lq.sendPrepare connection "s2" "select pg_sleep($1)" (Just [float8Oid])+    _ <- Lq.sendQueryPrepared connection "s2" [Just ("0.1", Lq.Text)] Lq.Text+    _ <- Lq.pipelineSync connection      -- Interrupt the read mid-pipeline, exactly as hasql's timeout does: the     -- slow pg_sleep is still running when the read is abandoned.@@ -85,27 +85,27 @@     -- cleanUpAfterInterruption: drain, cancel, drain.  The cancel is sent while     -- the pipeline is mid-flight; on buggy code its SIGINT can arrive late.     _ <- drainResults connection-    mHandle <- connection.getCancel-    _ <- for mHandle (.cancel)+    mHandle <- Lq.getCancel connection+    _ <- for mHandle Lq.cancel     _ <- drainResults connection      -- leavePipeline: the exact restore sequence hasql performs, including the     -- retry it falls back to.-    statusBefore <- connection.pipelineStatus+    statusBefore <- Lq.pipelineStatus connection     when (statusBefore == Lq.PipelineOn) do-      _ <- connection.pipelineSync+      _ <- Lq.pipelineSync connection       _ <- drainResults connection-      _ <- connection.sendFlushRequest+      _ <- Lq.sendFlushRequest connection       _ <- drainResults connection-      ok <- connection.exitPipelineMode+      ok <- Lq.exitPipelineMode connection       unless ok do         _ <- drainResults connection-        void connection.exitPipelineMode+        void (Lq.exitPipelineMode connection)      -- The victim.  It must not be cancelled by the stale signal.     execScenario "select 99" connection >>= \case       Nothing -> pure (Just (Lq.FatalError, Just "no-result"))       Just observation ->-        case observation.status of+        case status observation of           Lq.TuplesOk -> pure Nothing-          status -> pure (Just (status, fromMaybe Nothing (lookup Lq.DiagSqlstate observation.errorFields)))+          status -> pure (Just (status, fromMaybe Nothing (lookup Lq.DiagSqlstate (errorFields observation))))
src/library/Pqi/Conformance/Operation/ClientEncoding.hs view
@@ -17,11 +17,11 @@   describe "clientEncoding" do     it "round-trips and governs result re-encoding" \conninfo ->       differential adapter conninfo \connection -> do-        initial <- connection.clientEncoding-        setOk <- connection.setClientEncoding "LATIN1"-        switched <- connection.clientEncoding-        reported <- connection.parameterStatus "client_encoding"+        initial <- Pqi.clientEncoding connection+        setOk <- Pqi.setClientEncoding connection "LATIN1"+        switched <- Pqi.clientEncoding connection+        reported <- Pqi.parameterStatus connection "client_encoding"         latinCell <- execScenario "select chr(233) as e" connection-        restoreOk <- connection.setClientEncoding "UTF8"+        restoreOk <- Pqi.setClientEncoding connection "UTF8"         utfCell <- execScenario "select chr(233) as e" connection         pure (initial, setOk, switched, reported, latinCell, restoreOk, utfCell)
src/library/Pqi/Conformance/Operation/CmdStatus.hs view
@@ -15,8 +15,8 @@   describe "cmdStatus" do     it "reports the command tag for each command" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.exec "create temporary table conformance_cmd_status (id int4, label text)"-        let tagOf sql = connection.exec sql >>= traverse (.cmdStatus)+        _ <- Pqi.exec connection "create temporary table conformance_cmd_status (id int4, label text)"+        let tagOf sql = Pqi.exec connection sql >>= traverse Pqi.cmdStatus         insert <- tagOf "insert into conformance_cmd_status values (1, 'a'), (2, 'b')"         update <- tagOf "update conformance_cmd_status set label = 'c' where id = 1"         delete <- tagOf "delete from conformance_cmd_status where id = 2"
src/library/Pqi/Conformance/Operation/CmdTuples.hs view
@@ -15,8 +15,8 @@   describe "cmdTuples" do     it "reports the affected-row count for each command" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.exec "create temporary table conformance_cmd_tuples (id int4, label text)"-        let countOf sql = connection.exec sql >>= traverse (.cmdTuples)+        _ <- Pqi.exec connection "create temporary table conformance_cmd_tuples (id int4, label text)"+        let countOf sql = Pqi.exec connection sql >>= traverse Pqi.cmdTuples         insert <- countOf "insert into conformance_cmd_tuples values (1, 'a'), (2, 'b')"         update <- countOf "update conformance_cmd_tuples set label = 'c' where id = 1"         delete <- countOf "delete from conformance_cmd_tuples where id = 2"
src/library/Pqi/Conformance/Operation/ConnectPoll.hs view
@@ -16,8 +16,8 @@   describe "connectPoll" do     it "reaches a terminal polling status and a ready connection" \conninfo ->       differentialConnect adapter conninfo \adapter' conninfo' -> do-        connection <- adapter'.connectStart conninfo'-        terminal <- pollUntilDone connection.connectPoll-        connStatus <- connection.status-        connection.finish+        connection <- Pqi.connectStart adapter' conninfo'+        terminal <- pollUntilDone (Pqi.connectPoll connection)+        connStatus <- Pqi.status connection+        Pqi.finish connection         pure (terminal, connStatus)
src/library/Pqi/Conformance/Operation/ConnectStart.hs view
@@ -17,8 +17,8 @@   describe "connectStart" do     it "begins an asynchronous connection that polls to readiness" \conninfo ->       differentialConnect adapter conninfo \adapter' conninfo' -> do-        connection <- adapter'.connectStart conninfo'-        polled <- pollUntilDone connection.connectPoll+        connection <- Pqi.connectStart adapter' conninfo'+        polled <- pollUntilDone (Pqi.connectPoll connection)         observation <- observeConnection connection-        connection.finish+        Pqi.finish connection         pure (polled, observation)
src/library/Pqi/Conformance/Operation/Connectdb.hs view
@@ -27,33 +27,33 @@      it "accepts a URI-format conninfo" \conninfo ->       differentialConnect adapter conninfo \adapter' conninfo' -> do-        connection <- adapter'.connectdb (kvToUri conninfo')-        s <- connection.status-        connection.finish+        connection <- Pqi.connectdb adapter' (kvToUri conninfo')+        s <- Pqi.status connection+        Pqi.finish connection         pure s      it "rejects an unknown database" \conninfo ->       differentialConnect adapter conninfo \adapter' conninfo' -> do-        connection <- adapter'.connectdb (conninfo' <> " dbname=pqi_no_such_db")-        observation <- connection.status-        nullness <- pure connection.isNullConnection-        connection.finish+        connection <- Pqi.connectdb adapter' (conninfo' <> " dbname=pqi_no_such_db")+        observation <- Pqi.status connection+        nullness <- pure (Pqi.isNullConnection connection)+        Pqi.finish connection         pure (observation, nullness)      it "rejects an unknown user" \conninfo ->       differentialConnect adapter conninfo \adapter' conninfo' -> do-        connection <- adapter'.connectdb (conninfo' <> " user=pqi_no_such_user")-        observation <- connection.status-        connection.finish+        connection <- Pqi.connectdb adapter' (conninfo' <> " user=pqi_no_such_user")+        observation <- Pqi.status connection+        Pqi.finish connection         pure observation      it "defaults the user like the reference when user is omitted" \conninfo ->       differentialConnect adapter conninfo \adapter' conninfo' -> do-        connection <- adapter'.connectdb (dropUser conninfo')-        resolvedUser <- connection.user-        observedStatus <- connection.status-        observedError <- connection.errorMessage-        connection.finish+        connection <- Pqi.connectdb adapter' (dropUser conninfo')+        resolvedUser <- Pqi.user connection+        observedStatus <- Pqi.status connection+        observedError <- Pqi.errorMessage connection+        Pqi.finish connection         pure (resolvedUser, observedStatus, observedError)    describe "SCRAM-SHA-256 authentication" do@@ -66,7 +66,7 @@               }            scramScenario :: Pqi.Connection -> IO (Maybe ResultObservation)-          scramScenario connection = connection.exec "select 1 as scram_works" >>= traverse observeResult+          scramScenario connection = Pqi.exec connection "select 1 as scram_works" >>= traverse observeResult        in TcPg.run scramConfig \(host, port) -> do             let conninfo =                   ByteString.Char8.pack@@ -76,8 +76,8 @@                         <> show port                         <> " user=scram password=secret dbname=scram"                     )-            candidate <- bracket (adapter.connectdb conninfo) (.finish) scramScenario-            reference <- bracket (Reference.adapter.connectdb conninfo) (.finish) scramScenario+            candidate <- bracket (Pqi.connectdb adapter conninfo) Pqi.finish scramScenario+            reference <- bracket (Pqi.connectdb Reference.adapter conninfo) Pqi.finish scramScenario             candidate `shouldBe` reference  -- | Drop the @user=…@ token from a @key=value@ conninfo, leaving the user
src/library/Pqi/Conformance/Operation/ConnectionNeedsPassword.hs view
@@ -14,4 +14,4 @@ spec adapter =   describe "connectionNeedsPassword" do     it "reports whether a password was needed" \conninfo ->-      differential adapter conninfo (.connectionNeedsPassword)+      differential adapter conninfo Pqi.connectionNeedsPassword
src/library/Pqi/Conformance/Operation/ConnectionUsedPassword.hs view
@@ -14,4 +14,4 @@ spec adapter =   describe "connectionUsedPassword" do     it "reports whether a password was used" \conninfo ->-      differential adapter conninfo (.connectionUsedPassword)+      differential adapter conninfo Pqi.connectionUsedPassword
src/library/Pqi/Conformance/Operation/ConsumeInput.hs view
@@ -17,11 +17,11 @@   describe "consumeInput" do     it "drives result collection together with isBusy" \conninfo ->       differential adapter conninfo \connection -> do-        sent <- connection.sendQuery "select 42"+        sent <- Pqi.sendQuery connection "select 42"         let settle (0 :: Int) = pure False             settle n = do-              consumed <- connection.consumeInput-              busy <- connection.isBusy+              consumed <- Pqi.consumeInput connection+              busy <- Pqi.isBusy connection               if busy then threadDelay 1000 >> settle (n - 1) else pure consumed         consumed <- settle 10000         results <- drainResults connection
src/library/Pqi/Conformance/Operation/Db.hs view
@@ -13,4 +13,4 @@ spec adapter =   describe "db" do     it "reports the database name from the conninfo" \conninfo ->-      differential adapter conninfo (.db)+      differential adapter conninfo Pqi.db
src/library/Pqi/Conformance/Operation/DescribePortal.hs view
@@ -16,12 +16,12 @@   describe "describePortal" do     it "describes a declared cursor" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.exec "begin"+        _ <- Pqi.exec connection "begin"         _ <--          connection.exec+          Pqi.exec connection             "declare conformance_cursor cursor for select 1 :: int4 as n, 'x' :: text as t"-        connection.describePortal "conformance_cursor" >>= traverse observeResult+        Pqi.describePortal connection "conformance_cursor" >>= traverse observeResult      it "rejects an unknown portal" \conninfo ->       differential adapter conninfo \connection ->-        connection.describePortal "conformance_no_portal" >>= traverse observeResult+        Pqi.describePortal connection "conformance_no_portal" >>= traverse observeResult
src/library/Pqi/Conformance/Operation/DescribePrepared.hs view
@@ -18,14 +18,14 @@   describe "describePrepared" do     it "reports parameter types" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.prepare "conformance_desc" "select $1 :: int4, $2 :: text" Nothing-        connection.describePrepared "conformance_desc" >>= traverse observeResult+        _ <- Pqi.prepare connection "conformance_desc" "select $1 :: int4, $2 :: text" Nothing+        Pqi.describePrepared connection "conformance_desc" >>= traverse observeResult      it "reports explicit parameter types" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.prepare "conformance_typed" "select $1" (Just [int8Oid])-        connection.describePrepared "conformance_typed" >>= traverse observeResult+        _ <- Pqi.prepare connection "conformance_typed" "select $1" (Just [int8Oid])+        Pqi.describePrepared connection "conformance_typed" >>= traverse observeResult      it "rejects an unknown statement" \conninfo ->       differential adapter conninfo \connection ->-        connection.describePrepared "conformance_missing" >>= traverse observeResult+        Pqi.describePrepared connection "conformance_missing" >>= traverse observeResult
src/library/Pqi/Conformance/Operation/DisableNoticeReporting.hs view
@@ -15,13 +15,13 @@   describe "disableNoticeReporting" do     it "stops retaining notices once disabled" \conninfo ->       differential adapter conninfo \connection -> do-        connection.enableNoticeReporting+        Pqi.enableNoticeReporting connection         whileEnabled <- raiseNoticeAndCollect connection-        connection.disableNoticeReporting+        Pqi.disableNoticeReporting connection         whileDisabled <- raiseNoticeAndCollect connection         pure (whileEnabled, whileDisabled)  raiseNoticeAndCollect :: Pqi.Connection -> IO Bool raiseNoticeAndCollect connection = do-  _ <- connection.exec "do $$ begin raise notice 'conformance notice'; end $$"-  isJust <$> connection.getNotice+  _ <- Pqi.exec connection "do $$ begin raise notice 'conformance notice'; end $$"+  isJust <$> Pqi.getNotice connection
src/library/Pqi/Conformance/Operation/EnableNoticeReporting.hs view
@@ -17,11 +17,11 @@     it "makes a raised notice retrievable" \conninfo ->       differential adapter conninfo \connection -> do         beforeEnable <- raiseNoticeAndCollect connection-        connection.enableNoticeReporting+        Pqi.enableNoticeReporting connection         afterEnable <- raiseNoticeAndCollect connection         pure (beforeEnable, afterEnable)  raiseNoticeAndCollect :: Pqi.Connection -> IO Bool raiseNoticeAndCollect connection = do-  _ <- connection.exec "do $$ begin raise notice 'conformance notice'; end $$"-  isJust <$> connection.getNotice+  _ <- Pqi.exec connection "do $$ begin raise notice 'conformance notice'; end $$"+  isJust <$> Pqi.getNotice connection
src/library/Pqi/Conformance/Operation/EnterPipelineMode.hs view
@@ -15,9 +15,9 @@   describe "enterPipelineMode" do     it "enters pipeline mode and is idempotent" \conninfo ->       differential adapter conninfo \connection -> do-        before <- connection.pipelineStatus-        entered <- connection.enterPipelineMode-        enteredAgain <- connection.enterPipelineMode-        while <- connection.pipelineStatus-        _ <- connection.exitPipelineMode+        before <- Pqi.pipelineStatus connection+        entered <- Pqi.enterPipelineMode connection+        enteredAgain <- Pqi.enterPipelineMode connection+        while <- Pqi.pipelineStatus connection+        _ <- Pqi.exitPipelineMode connection         pure (before, entered, enteredAgain, while)
src/library/Pqi/Conformance/Operation/ErrorMessage.hs view
@@ -26,37 +26,37 @@   describe "errorMessage" do     it "is empty on a healthy connection" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.exec "select 1"-        connection.errorMessage+        _ <- Pqi.exec connection "select 1"+        Pqi.errorMessage connection      it "is populated after a failed exec and cleared by a subsequent success" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.exec "do $$ begin raise exception 'conformance error'; end $$"-        afterFail <- connection.errorMessage-        _ <- connection.exec "select 1"-        afterSuccess <- connection.errorMessage+        _ <- Pqi.exec connection "do $$ begin raise exception 'conformance error'; end $$"+        afterFail <- Pqi.errorMessage connection+        _ <- Pqi.exec connection "select 1"+        afterSuccess <- Pqi.errorMessage connection         pure (afterFail, afterSuccess)      it "is populated after a failed getResult and cleared by a subsequent success" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.sendQuery "do $$ begin raise exception 'conformance error'; end $$"+        _ <- Pqi.sendQuery connection "do $$ begin raise exception 'conformance error'; end $$"         _ <- drainResults connection-        afterFail <- connection.errorMessage-        _ <- connection.sendQuery "select 1"+        afterFail <- Pqi.errorMessage connection+        _ <- Pqi.sendQuery connection "select 1"         _ <- drainResults connection-        afterSuccess <- connection.errorMessage+        afterSuccess <- Pqi.errorMessage connection         pure (afterFail, afterSuccess)      it "is populated after a connection failure" \conninfo ->       differentialConnect adapter conninfo \adapter' conninfo' -> do-        conn <- adapter'.connectdb (conninfo' <> " user=pqi_no_such_user")-        msg <- conn.errorMessage-        conn.finish+        conn <- Pqi.connectdb adapter' (conninfo' <> " user=pqi_no_such_user")+        msg <- Pqi.errorMessage conn+        Pqi.finish conn         pure msg      it "is the null-connection sentinel on a null connection" \conninfo ->       differentialConnect adapter conninfo \adapter' _ -> do-        conn <- adapter'.newNullConnection-        msg <- conn.errorMessage-        conn.finish+        conn <- Pqi.newNullConnection adapter'+        msg <- Pqi.errorMessage conn+        Pqi.finish conn         pure msg
src/library/Pqi/Conformance/Operation/EscapeByteaConn.hs view
@@ -16,7 +16,7 @@   describe "escapeByteaConn" do     it "escapes a range of binary inputs" \conninfo ->       differential adapter conninfo \connection ->-        traverse connection.escapeByteaConn byteaCases+        traverse (Pqi.escapeByteaConn connection) byteaCases   where     byteaCases =       [ "",
src/library/Pqi/Conformance/Operation/EscapeIdentifier.hs view
@@ -16,11 +16,11 @@   describe "escapeIdentifier" do     it "escapes a range of identifiers" \conninfo ->       differential adapter conninfo \connection ->-        traverse connection.escapeIdentifier identifierCases+        traverse (Pqi.escapeIdentifier connection) identifierCases      it "produces identifiers that round-trip through a query" \conninfo ->       differential adapter conninfo \connection -> do-        escaped <- connection.escapeIdentifier "Wéird \"column\" name"+        escaped <- Pqi.escapeIdentifier connection "Wéird \"column\" name"         for escaped \identifier ->           execScenario ("select 1 as " <> identifier) connection   where
src/library/Pqi/Conformance/Operation/EscapeStringConn.hs view
@@ -16,15 +16,15 @@   describe "escapeStringConn" do     it "escapes a range of strings" \conninfo ->       differential adapter conninfo \connection ->-        traverse connection.escapeStringConn stringCases+        traverse (Pqi.escapeStringConn connection) stringCases      it "rejects invalid encoding" \conninfo ->       differential adapter conninfo \connection ->-        connection.escapeStringConn "\255\254"+        Pqi.escapeStringConn connection "\255\254"      it "produces literals that round-trip through a query" \conninfo ->       differential adapter conninfo \connection -> do-        escaped <- connection.escapeStringConn "it's \\ tricky\nstuff"+        escaped <- Pqi.escapeStringConn connection "it's \\ tricky\nstuff"         for escaped \literal ->           execScenario ("select '" <> literal <> "' :: text") connection   where
src/library/Pqi/Conformance/Operation/ExecParams.hs view
@@ -50,7 +50,7 @@           Lq.Text     it "DML with parameters" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.exec "create temporary table conformance_exec_params (id int4)"+        _ <- Lq.exec connection "create temporary table conformance_exec_params (id int4)"         insert <-           observed             "insert into conformance_exec_params values ($1), ($2)"
src/library/Pqi/Conformance/Operation/ExecPrepared.hs view
@@ -17,29 +17,29 @@   describe "execPrepared" do     it "executes a prepared statement" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.prepare "conformance_stmt" "select $1 :: text as a, $2 :: int4 as b" Nothing-        connection.execPrepared "conformance_stmt" [Just ("hello", Lq.Text), Just ("7", Lq.Text)] Lq.Text+        _ <- Lq.prepare connection "conformance_stmt" "select $1 :: text as a, $2 :: int4 as b" Nothing+        Lq.execPrepared connection "conformance_stmt" [Just ("hello", Lq.Text), Just ("7", Lq.Text)] Lq.Text           >>= traverse observeResult      it "executes the unnamed prepared statement" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.prepare "" "select $1 :: int4 + 1" Nothing-        connection.execPrepared "" [Just ("41", Lq.Text)] Lq.Text+        _ <- Lq.prepare connection "" "select $1 :: int4 + 1" Nothing+        Lq.execPrepared connection "" [Just ("41", Lq.Text)] Lq.Text           >>= traverse observeResult      it "executes a zero-parameter statement" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.prepare "conformance_no_params" "select 42" Nothing-        connection.execPrepared "conformance_no_params" [] Lq.Text+        _ <- Lq.prepare connection "conformance_no_params" "select 42" Nothing+        Lq.execPrepared connection "conformance_no_params" [] Lq.Text           >>= traverse observeResult      it "binds null and binary parameters with a binary result" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.prepare "conformance_binary" "select $1 :: text, $2 :: bytea" Nothing-        connection.execPrepared "conformance_binary" [Nothing, Just ("\NUL\1\255", Lq.Binary)] Lq.Binary+        _ <- Lq.prepare connection "conformance_binary" "select $1 :: text, $2 :: bytea" Nothing+        Lq.execPrepared connection "conformance_binary" [Nothing, Just ("\NUL\1\255", Lq.Binary)] Lq.Binary           >>= traverse observeResult      it "rejects an unknown statement" \conninfo ->       differential adapter conninfo \connection ->-        connection.execPrepared "conformance_missing" [] Lq.Text+        Lq.execPrepared connection "conformance_missing" [] Lq.Text           >>= traverse observeResult
src/library/Pqi/Conformance/Operation/ExitPipelineMode.hs view
@@ -17,20 +17,20 @@   describe "exitPipelineMode" do     it "returns the connection to its non-pipeline status" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.enterPipelineMode-        exited <- connection.exitPipelineMode-        after <- connection.pipelineStatus+        _ <- Lq.enterPipelineMode connection+        exited <- Lq.exitPipelineMode connection+        after <- Lq.pipelineStatus connection         pure (exited, after)      it "fails with work pending and succeeds once drained" \conninfo ->       differential adapter conninfo \connection -> do-        entered <- connection.enterPipelineMode-        sent <- connection.sendQueryParams "select 1" [] Lq.Text-        prematureExit <- connection.exitPipelineMode-        synced <- connection.pipelineSync+        entered <- Lq.enterPipelineMode connection+        sent <- Lq.sendQueryParams connection "select 1" [] Lq.Text+        prematureExit <- Lq.exitPipelineMode connection+        synced <- Lq.pipelineSync connection         results <- takeCommandResults connection         syncResult <- takeResult connection-        exited <- connection.exitPipelineMode+        exited <- Lq.exitPipelineMode connection         pure (entered, sent, prematureExit, synced, results, syncResult, exited)      -- Reproduces the cleanup sequence that hasql's cleanUpAfterInterruption +@@ -41,13 +41,13 @@     -- sequence that hasql uses.     it "recovers after mid-pipeline cancel (mirrors cleanUpAfterInterruption)" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.enterPipelineMode-        _ <- connection.sendPrepare "s1" "select 1" Nothing-        _ <- connection.sendQueryPrepared "s1" [] Lq.Text-        _ <- connection.sendPrepare "s2" "select pg_sleep($1)" (Just [float8Oid])-        _ <- connection.sendQueryPrepared "s2" [Just ("0.5", Lq.Text)] Lq.Text-        _ <- connection.pipelineSync-        _ <- connection.sendFlushRequest+        _ <- Lq.enterPipelineMode connection+        _ <- Lq.sendPrepare connection "s1" "select 1" Nothing+        _ <- Lq.sendQueryPrepared connection "s1" [] Lq.Text+        _ <- Lq.sendPrepare connection "s2" "select pg_sleep($1)" (Just [float8Oid])+        _ <- Lq.sendQueryPrepared connection "s2" [Just ("0.5", Lq.Text)] Lq.Text+        _ <- Lq.pipelineSync connection+        _ <- Lq.sendFlushRequest connection         -- Consume what toPipelineIO would have read before the timeout:         -- parse1 result + separator, exec1 result + separator, parse2 result + separator.         _ <- takeCommandResults connection@@ -55,17 +55,17 @@         _ <- takeCommandResults connection         -- exec2 (pg_sleep) is still running; cancel it to simulate the         -- timeout-triggered cancel in cleanUpAfterInterruption.-        mHandle <- connection.getCancel-        _ <- for mHandle (.cancel)+        mHandle <- Lq.getCancel connection+        _ <- for mHandle Lq.cancel         -- cleanUpAfterInterruption: drain1, then drain2 (after cancel)         _ <- drainResults connection         _ <- drainResults connection         -- leavePipeline: new Sync, drain, Flush, drain-        _ <- connection.pipelineSync+        _ <- Lq.pipelineSync connection         _ <- drainResults connection-        _ <- connection.sendFlushRequest+        _ <- Lq.sendFlushRequest connection         _ <- drainResults connection-        exited <- connection.exitPipelineMode+        exited <- Lq.exitPipelineMode connection         pure exited      -- Reproduces the failure seen in hasql's "Leaves the connection usable@@ -82,35 +82,35 @@     -- captures.     it "recovers after timeout interrupts mid-pipeline read" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.enterPipelineMode-        _ <- connection.sendPrepare "s1" "select $1::int" Nothing-        _ <- connection.sendQueryPrepared "s1" [Just ("42", Lq.Text)] Lq.Text-        _ <- connection.sendPrepare "s2" "select pg_sleep($1)" (Just [float8Oid])-        _ <- connection.sendQueryPrepared "s2" [Just ("0.1", Lq.Text)] Lq.Text-        _ <- connection.pipelineSync+        _ <- Lq.enterPipelineMode connection+        _ <- Lq.sendPrepare connection "s1" "select $1::int" Nothing+        _ <- Lq.sendQueryPrepared connection "s1" [Just ("42", Lq.Text)] Lq.Text+        _ <- Lq.sendPrepare connection "s2" "select pg_sleep($1)" (Just [float8Oid])+        _ <- Lq.sendQueryPrepared connection "s2" [Just ("0.1", Lq.Text)] Lq.Text+        _ <- Lq.pipelineSync connection         -- Interrupt the read just like hasql's Connection.use + timeout does.         _ <- timeout 50000 (drainResults connection)         -- cleanUpAfterInterruption         _ <- drainResults connection-        mHandle <- connection.getCancel-        _ <- for mHandle (.cancel)+        mHandle <- Lq.getCancel connection+        _ <- for mHandle Lq.cancel         _ <- drainResults connection         -- leavePipeline (including the retry that hasql performs)-        pipelineStatusBefore <- connection.pipelineStatus+        pipelineStatusBefore <- Lq.pipelineStatus connection         exited <-           if pipelineStatusBefore == Lq.PipelineOn             then do-              _ <- connection.pipelineSync+              _ <- Lq.pipelineSync connection               _ <- drainResults connection-              _ <- connection.sendFlushRequest+              _ <- Lq.sendFlushRequest connection               _ <- drainResults connection-              ok <- connection.exitPipelineMode+              ok <- Lq.exitPipelineMode connection               if ok                 then pure True                 else do                   _ <- drainResults connection-                  connection.exitPipelineMode+                  Lq.exitPipelineMode connection             else pure True-        afterStatus <- connection.pipelineStatus+        afterStatus <- Lq.pipelineStatus connection         usable <- execScenario "select 99" connection         pure (exited, afterStatus, usable)
src/library/Pqi/Conformance/Operation/Fformat.hs view
@@ -17,10 +17,10 @@     it "follows the requested result format" \conninfo ->       differential adapter conninfo \connection -> do         let formatsOf fmt =-              connection.execParams "select 1 :: int4, 'x' :: text" [] fmt+              Lq.execParams connection "select 1 :: int4, 'x' :: text" [] fmt                 >>= traverse \r -> do-                  n <- r.nfields-                  traverse r.fformat [0 .. n - 1]+                  n <- Lq.nfields r+                  traverse (Lq.fformat r) [0 .. n - 1]         textFormats <- formatsOf Lq.Text         binaryFormats <- formatsOf Lq.Binary         pure (textFormats, binaryFormats)
src/library/Pqi/Conformance/Operation/Finish.hs view
@@ -15,13 +15,13 @@   describe "finish" do     it "closes an open connection cleanly" \conninfo ->       differentialConnect adapter conninfo \adapter' conninfo' -> do-        connection <- adapter'.connectdb conninfo'-        before <- connection.status-        connection.finish+        connection <- Pqi.connectdb adapter' conninfo'+        before <- Pqi.status connection+        Pqi.finish connection         pure before      it "closes the null sentinel cleanly" \conninfo ->       differentialConnect adapter conninfo \adapter' _ -> do-        connection <- adapter'.newNullConnection-        connection.finish+        connection <- Pqi.newNullConnection adapter'+        Pqi.finish connection         pure ()
src/library/Pqi/Conformance/Operation/Flush.hs view
@@ -16,9 +16,9 @@   describe "flush" do     it "flushes queued output to completion in non-blocking mode" \conninfo ->       differential adapter conninfo \connection -> do-        setOk <- connection.setnonblocking True-        sent <- connection.sendQuery "select 1"-        flushed <- flushUntilDone connection.flush+        setOk <- Pqi.setnonblocking connection True+        sent <- Pqi.sendQuery connection "select 1"+        flushed <- flushUntilDone (Pqi.flush connection)         results <- drainResults connection-        restoreOk <- connection.setnonblocking False+        restoreOk <- Pqi.setnonblocking connection False         pure (setOk, sent, flushed, results, restoreOk)
src/library/Pqi/Conformance/Operation/Fmod.hs view
@@ -16,9 +16,9 @@     it "reports type modifiers and degrades out of range" \conninfo ->       differential adapter conninfo \connection -> do         result <--          connection.exec "select 1.5 :: numeric(10,2), 'pad' :: char(5), 'x' :: varchar(3), true, 1 :: int4"+          Pqi.exec connection "select 1.5 :: numeric(10,2), 'pad' :: char(5), 'x' :: varchar(3), true, 1 :: int4"         for result \r -> do-          n <- r.nfields-          modifiers <- traverse r.fmod [0 .. n - 1]-          outOfRange <- r.fmod 9+          n <- Pqi.nfields r+          modifiers <- traverse (Pqi.fmod r) [0 .. n - 1]+          outOfRange <- Pqi.fmod r 9           pure (modifiers, outOfRange)
src/library/Pqi/Conformance/Operation/Fname.hs view
@@ -15,9 +15,9 @@   describe "fname" do     it "names columns and degrades out of range" \conninfo ->       differential adapter conninfo \connection -> do-        result <- connection.exec "select 1 as foo, 2 as bar"+        result <- Pqi.exec connection "select 1 as foo, 2 as bar"         for result \r -> do-          n <- r.nfields-          names <- traverse r.fname [0 .. n - 1]-          outOfRange <- r.fname 5+          n <- Pqi.nfields r+          names <- traverse (Pqi.fname r) [0 .. n - 1]+          outOfRange <- Pqi.fname r 5           pure (names, outOfRange)
src/library/Pqi/Conformance/Operation/Fnumber.hs view
@@ -16,8 +16,8 @@   describe "fnumber" do     it "resolves names like an identifier" \conninfo ->       differential adapter conninfo \connection -> do-        result <- connection.exec "select 1 as foo, 2 as \"Bar\""+        result <- Pqi.exec connection "select 1 as foo, 2 as \"Bar\""         for result \r ->           traverse-            r.fnumber+            (Pqi.fnumber r)             ["foo", "FOO", "Foo", "Bar", "bar", "\"Bar\"", "\"foo\"", "missing"]
src/library/Pqi/Conformance/Operation/Fsize.hs view
@@ -15,9 +15,9 @@   describe "fsize" do     it "reports type sizes and degrades out of range" \conninfo ->       differential adapter conninfo \connection -> do-        result <- connection.exec "select 1 :: int2, 1 :: int4, 1 :: int8, 'x' :: text, true"+        result <- Pqi.exec connection "select 1 :: int2, 1 :: int4, 1 :: int8, 'x' :: text, true"         for result \r -> do-          n <- r.nfields-          sizes <- traverse r.fsize [0 .. n - 1]-          outOfRange <- r.fsize 9+          n <- Pqi.nfields r+          sizes <- traverse (Pqi.fsize r) [0 .. n - 1]+          outOfRange <- Pqi.fsize r 9           pure (sizes, outOfRange)
src/library/Pqi/Conformance/Operation/Ftable.hs view
@@ -18,7 +18,7 @@   describe "ftable" do     it "reports the source-table OID, or none for a computed column" \conninfo ->       differential adapter conninfo \connection -> do-        result <- connection.exec "select relname, relkind, 1 as computed from pg_catalog.pg_class where false"+        result <- Pqi.exec connection "select relname, relkind, 1 as computed from pg_catalog.pg_class where false"         for result \r -> do-          n <- r.nfields-          traverse r.ftable [0 .. n - 1]+          n <- Pqi.nfields r+          traverse (Pqi.ftable r) [0 .. n - 1]
src/library/Pqi/Conformance/Operation/Ftablecol.hs view
@@ -18,7 +18,7 @@   describe "ftablecol" do     it "reports the source-column number, or zero for a computed column" \conninfo ->       differential adapter conninfo \connection -> do-        result <- connection.exec "select relname, relkind, 1 as computed from pg_catalog.pg_class where false"+        result <- Pqi.exec connection "select relname, relkind, 1 as computed from pg_catalog.pg_class where false"         for result \r -> do-          n <- r.nfields-          traverse r.ftablecol [0 .. n - 1]+          n <- Pqi.nfields r+          traverse (Pqi.ftablecol r) [0 .. n - 1]
src/library/Pqi/Conformance/Operation/Ftype.hs view
@@ -15,9 +15,9 @@   describe "ftype" do     it "reports type OIDs and degrades out of range" \conninfo ->       differential adapter conninfo \connection -> do-        result <- connection.exec "select 1 :: int4, 'x' :: text, true, 1.5 :: float8, 1 :: int2"+        result <- Pqi.exec connection "select 1 :: int4, 'x' :: text, true, 1.5 :: float8, 1 :: int2"         for result \r -> do-          n <- r.nfields-          types <- traverse r.ftype [0 .. n - 1]-          outOfRange <- r.ftype 9+          n <- Pqi.nfields r+          types <- traverse (Pqi.ftype r) [0 .. n - 1]+          outOfRange <- Pqi.ftype r 9           pure (types, outOfRange)
src/library/Pqi/Conformance/Operation/GetCancel.hs view
@@ -15,4 +15,4 @@   describe "getCancel" do     it "produces a handle for an open connection" \conninfo ->       differential adapter conninfo \connection ->-        isJust <$> connection.getCancel+        isJust <$> Pqi.getCancel connection
src/library/Pqi/Conformance/Operation/GetNotice.hs view
@@ -20,8 +20,8 @@   describe "getNotice" do     it "yields the formatted notice while enabled and then drains" \conninfo ->       differential adapter conninfo \connection -> do-        connection.enableNoticeReporting-        _ <- connection.exec "do $$ begin raise notice 'conformance notice'; end $$"-        firstNotice <- connection.getNotice-        afterDrain <- connection.getNotice+        Pqi.enableNoticeReporting connection+        _ <- Pqi.exec connection "do $$ begin raise notice 'conformance notice'; end $$"+        firstNotice <- Pqi.getNotice connection+        afterDrain <- Pqi.getNotice connection         pure (firstNotice, afterDrain)
src/library/Pqi/Conformance/Operation/GetResult.hs view
@@ -16,7 +16,7 @@   describe "getResult" do     it "yields each result then a Nothing terminator" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.sendQuery "select 1 :: int4"+        _ <- Pqi.sendQuery connection "select 1 :: int4"         first <- takeResult connection         terminator <- takeResult connection         afterTerminator <- takeResult connection
src/library/Pqi/Conformance/Operation/Getisnull.hs view
@@ -15,9 +15,9 @@   describe "getisnull" do     it "distinguishes null, empty, and non-empty cells" \conninfo ->       differential adapter conninfo \connection -> do-        result <- connection.exec "select 'x' :: text, '' :: text, null :: int4"+        result <- Pqi.exec connection "select 'x' :: text, '' :: text, null :: int4"         for result \r -> do-          nonEmpty <- r.getisnull 0 0-          empty <- r.getisnull 0 1-          nullCell <- r.getisnull 0 2+          nonEmpty <- Pqi.getisnull r 0 0+          empty <- Pqi.getisnull r 0 1+          nullCell <- Pqi.getisnull r 0 2           pure (nonEmpty, empty, nullCell)
src/library/Pqi/Conformance/Operation/Getlength.hs view
@@ -15,7 +15,7 @@   describe "getlength" do     it "reports byte lengths across cell shapes" \conninfo ->       differential adapter conninfo \connection -> do-        result <- connection.exec "select 'hello' :: text, 'héllo' :: text, '' :: text, null :: int4"+        result <- Pqi.exec connection "select 'hello' :: text, 'héllo' :: text, '' :: text, null :: int4"         for result \r -> do-          n <- r.nfields-          traverse (r.getlength 0) [0 .. n - 1]+          n <- Pqi.nfields r+          traverse (Pqi.getlength r 0) [0 .. n - 1]
src/library/Pqi/Conformance/Operation/Getvalue.hs view
@@ -15,10 +15,10 @@   describe "getvalue" do     it "reads cells, nulls, and degrades out of range" \conninfo ->       differential adapter conninfo \connection -> do-        result <- connection.exec "select 'hello' :: text, null :: int4"+        result <- Pqi.exec connection "select 'hello' :: text, null :: int4"         for result \r -> do-          present <- r.getvalue 0 0-          nullCell <- r.getvalue 0 1-          badRow <- r.getvalue 1 0-          badColumn <- r.getvalue 0 5+          present <- Pqi.getvalue r 0 0+          nullCell <- Pqi.getvalue r 0 1+          badRow <- Pqi.getvalue r 1 0+          badColumn <- Pqi.getvalue r 0 5           pure (present, nullCell, badRow, badColumn)
src/library/Pqi/Conformance/Operation/GetvalueCopy.hs view
@@ -15,9 +15,9 @@   describe "getvalue'" do     it "copies cells that survive freeing the result" \conninfo ->       differential adapter conninfo \connection -> do-        result <- connection.exec "select 'copied' :: text, null :: int4"+        result <- Pqi.exec connection "select 'copied' :: text, null :: int4"         for result \r -> do-          first <- r.getvalue' 0 0-          second <- r.getvalue' 0 1-          r.unsafeFreeResult+          first <- Pqi.getvalue' r 0 0+          second <- Pqi.getvalue' r 0 1+          Pqi.unsafeFreeResult r           pure (first, second)
src/library/Pqi/Conformance/Operation/Host.hs view
@@ -13,4 +13,4 @@ spec adapter =   describe "host" do     it "reports the host from the conninfo" \conninfo ->-      differential adapter conninfo (.host)+      differential adapter conninfo Pqi.host
src/library/Pqi/Conformance/Operation/IsBusy.hs view
@@ -16,11 +16,11 @@   describe "isBusy" do     it "settles to not-busy after the result arrives" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.sendQuery "select 42"-        let settle (0 :: Int) = connection.isBusy+        _ <- Pqi.sendQuery connection "select 42"+        let settle (0 :: Int) = Pqi.isBusy connection             settle n = do-              _ <- connection.consumeInput-              busy <- connection.isBusy+              _ <- Pqi.consumeInput connection+              busy <- Pqi.isBusy connection               if busy then threadDelay 1000 >> settle (n - 1) else pure busy         stillBusy <- settle 10000         _ <- drainResults connection
src/library/Pqi/Conformance/Operation/IsNullConnection.hs view
@@ -15,10 +15,10 @@   describe "isNullConnection" do     it "is True for the null sentinel and False for an open connection" \conninfo ->       differentialConnect adapter conninfo \adapter' conninfo' -> do-        nullConn <- adapter'.newNullConnection-        let nullIsNull = nullConn.isNullConnection-        nullConn.finish-        openConn <- adapter'.connectdb conninfo'-        let openIsNull = openConn.isNullConnection-        openConn.finish+        nullConn <- Pqi.newNullConnection adapter'+        let nullIsNull = Pqi.isNullConnection nullConn+        Pqi.finish nullConn+        openConn <- Pqi.connectdb adapter' conninfo'+        let openIsNull = Pqi.isNullConnection openConn+        Pqi.finish openConn         pure (nullIsNull, openIsNull)
src/library/Pqi/Conformance/Operation/Isnonblocking.hs view
@@ -15,7 +15,7 @@   describe "isnonblocking" do     it "is off initially and reflects a change" \conninfo ->       differential adapter conninfo \connection -> do-        initially <- connection.isnonblocking-        _ <- connection.setnonblocking True-        afterEnable <- connection.isnonblocking+        initially <- Pqi.isnonblocking connection+        _ <- Pqi.setnonblocking connection True+        afterEnable <- Pqi.isnonblocking connection         pure (initially, afterEnable)
src/library/Pqi/Conformance/Operation/LoClose.hs view
@@ -18,11 +18,11 @@     it "closes the descriptor and invalidates further reads" \conninfo ->       differential adapter conninfo \connection ->         inTransaction connection do-          oid <- connection.loCreat+          oid <- Pqi.loCreat connection           outcome <- for oid \o -> do-            fd <- connection.loOpen o ReadMode-            closed <- for fd (connection.loClose)-            readAfterClose <- join <$> for fd \f -> connection.loRead f 10+            fd <- Pqi.loOpen connection o ReadMode+            closed <- for fd (Pqi.loClose connection)+            readAfterClose <- join <$> for fd \f -> Pqi.loRead connection f 10             pure (closed, readAfterClose)-          traverse_ connection.loUnlink oid+          traverse_ (Pqi.loUnlink connection) oid           pure outcome
src/library/Pqi/Conformance/Operation/LoCreat.hs view
@@ -20,6 +20,6 @@     it "creates a large object" \conninfo ->       differential adapter conninfo \connection ->         inTransaction connection do-          oid <- connection.loCreat-          traverse_ connection.loUnlink oid+          oid <- Pqi.loCreat connection+          traverse_ (Pqi.loUnlink connection) oid           pure (isJust oid)
src/library/Pqi/Conformance/Operation/LoCreate.hs view
@@ -22,9 +22,9 @@         inTransaction connection do           -- Best-effort cleanup of leftovers from an earlier crashed run; its           -- outcome legitimately differs between runs, so it is not observed.-          _ <- connection.loUnlink explicitOid-          created <- connection.loCreate explicitOid-          unlinked <- for created connection.loUnlink+          _ <- Pqi.loUnlink connection explicitOid+          created <- Pqi.loCreate connection explicitOid+          unlinked <- for created (Pqi.loUnlink connection)           pure (created, unlinked)   where     explicitOid = 424242
src/library/Pqi/Conformance/Operation/LoExport.hs view
@@ -26,9 +26,9 @@         hClose importHandle         (exportPath, exportHandle) <- openBinaryTempFile "/tmp" "pqi-conformance-export-out"         hClose exportHandle-        imported <- connection.loImport importPath-        exported <- for imported \o -> connection.loExport o exportPath-        traverse_ connection.loUnlink imported+        imported <- Pqi.loImport connection importPath+        exported <- for imported \o -> Pqi.loExport connection o exportPath+        traverse_ (Pqi.loUnlink connection) imported         roundTripped <- ByteString.readFile exportPath         removeFile importPath         removeFile exportPath
src/library/Pqi/Conformance/Operation/LoImport.hs view
@@ -24,7 +24,7 @@         (path, handle) <- openBinaryTempFile "/tmp" "pqi-conformance-import"         ByteString.hPut handle "pqi conformance payload"         hClose handle-        imported <- connection.loImport path-        traverse_ connection.loUnlink imported+        imported <- Pqi.loImport connection path+        traverse_ (Pqi.loUnlink connection) imported         removeFile path         pure (isJust imported)
src/library/Pqi/Conformance/Operation/LoImportWithOid.hs view
@@ -25,9 +25,9 @@         (path, handle) <- openBinaryTempFile "/tmp" "pqi-conformance-import-oid"         ByteString.hPut handle "pqi conformance payload"         hClose handle-        _ <- connection.loUnlink explicitOid-        imported <- connection.loImportWithOid path explicitOid-        unlinked <- for imported connection.loUnlink+        _ <- Pqi.loUnlink connection explicitOid+        imported <- Pqi.loImportWithOid connection path explicitOid+        unlinked <- for imported (Pqi.loUnlink connection)         removeFile path         pure (imported, unlinked)   where
src/library/Pqi/Conformance/Operation/LoOpen.hs view
@@ -18,13 +18,13 @@     it "opens an existing object and rejects a missing one" \conninfo ->       differential adapter conninfo \connection ->         inTransaction connection do-          oid <- connection.loCreat+          oid <- Pqi.loCreat connection           opened <- for oid \o -> do-            fd <- connection.loOpen o ReadWriteMode-            traverse_ connection.loClose fd+            fd <- Pqi.loOpen connection o ReadWriteMode+            traverse_ (Pqi.loClose connection) fd             pure (isJust fd)           loUnlink' oid connection-          missing <- connection.loOpen 4242424 ReadMode+          missing <- Pqi.loOpen connection 4242424 ReadMode           pure (opened, isJust missing)   where-    loUnlink' oid connection = traverse_ connection.loUnlink oid+    loUnlink' oid connection = traverse_ (Pqi.loUnlink connection) oid
src/library/Pqi/Conformance/Operation/LoRead.hs view
@@ -18,14 +18,14 @@     it "reads back what was written" \conninfo ->       differential adapter conninfo \connection ->         inTransaction connection do-          oid <- connection.loCreat+          oid <- Pqi.loCreat connection           outcome <- for oid \o -> do-            fd <- connection.loOpen o ReadWriteMode+            fd <- Pqi.loOpen connection o ReadWriteMode             readBytes <- for fd \f -> do-              _ <- connection.loWrite f "hello, large object"-              _ <- connection.loSeek f AbsoluteSeek 0-              connection.loRead f 5-            traverse_ connection.loClose fd+              _ <- Pqi.loWrite connection f "hello, large object"+              _ <- Pqi.loSeek connection f AbsoluteSeek 0+              Pqi.loRead connection f 5+            traverse_ (Pqi.loClose connection) fd             pure readBytes-          traverse_ connection.loUnlink oid+          traverse_ (Pqi.loUnlink connection) oid           pure outcome
src/library/Pqi/Conformance/Operation/LoSeek.hs view
@@ -18,16 +18,16 @@     it "seeks absolutely, relatively, and from the end" \conninfo ->       differential adapter conninfo \connection ->         inTransaction connection do-          oid <- connection.loCreat+          oid <- Pqi.loCreat connection           outcome <- for oid \o -> do-            fd <- connection.loOpen o ReadWriteMode+            fd <- Pqi.loOpen connection o ReadWriteMode             seeks <- for fd \f -> do-              _ <- connection.loWrite f "hello, large object"-              absolute <- connection.loSeek f AbsoluteSeek 0-              relative <- connection.loSeek f RelativeSeek 2-              fromEnd <- connection.loSeek f SeekFromEnd (-6)+              _ <- Pqi.loWrite connection f "hello, large object"+              absolute <- Pqi.loSeek connection f AbsoluteSeek 0+              relative <- Pqi.loSeek connection f RelativeSeek 2+              fromEnd <- Pqi.loSeek connection f SeekFromEnd (-6)               pure (absolute, relative, fromEnd)-            traverse_ connection.loClose fd+            traverse_ (Pqi.loClose connection) fd             pure seeks-          traverse_ connection.loUnlink oid+          traverse_ (Pqi.loUnlink connection) oid           pure outcome
src/library/Pqi/Conformance/Operation/LoTell.hs view
@@ -18,16 +18,16 @@     it "reports the position after a write and a seek" \conninfo ->       differential adapter conninfo \connection ->         inTransaction connection do-          oid <- connection.loCreat+          oid <- Pqi.loCreat connection           outcome <- for oid \o -> do-            fd <- connection.loOpen o ReadWriteMode+            fd <- Pqi.loOpen connection o ReadWriteMode             positions <- for fd \f -> do-              _ <- connection.loWrite f "hello, large object"-              afterWrite <- connection.loTell f-              _ <- connection.loSeek f AbsoluteSeek 3-              afterSeek <- connection.loTell f+              _ <- Pqi.loWrite connection f "hello, large object"+              afterWrite <- Pqi.loTell connection f+              _ <- Pqi.loSeek connection f AbsoluteSeek 3+              afterSeek <- Pqi.loTell connection f               pure (afterWrite, afterSeek)-            traverse_ connection.loClose fd+            traverse_ (Pqi.loClose connection) fd             pure positions-          traverse_ connection.loUnlink oid+          traverse_ (Pqi.loUnlink connection) oid           pure outcome
src/library/Pqi/Conformance/Operation/LoTruncate.hs view
@@ -18,15 +18,15 @@     it "truncates to a new size" \conninfo ->       differential adapter conninfo \connection ->         inTransaction connection do-          oid <- connection.loCreat+          oid <- Pqi.loCreat connection           outcome <- for oid \o -> do-            fd <- connection.loOpen o ReadWriteMode+            fd <- Pqi.loOpen connection o ReadWriteMode             result <- for fd \f -> do-              _ <- connection.loWrite f "hello, large object"-              truncated <- connection.loTruncate f 5-              newEnd <- connection.loSeek f SeekFromEnd 0+              _ <- Pqi.loWrite connection f "hello, large object"+              truncated <- Pqi.loTruncate connection f 5+              newEnd <- Pqi.loSeek connection f SeekFromEnd 0               pure (truncated, newEnd)-            traverse_ connection.loClose fd+            traverse_ (Pqi.loClose connection) fd             pure result-          traverse_ connection.loUnlink oid+          traverse_ (Pqi.loUnlink connection) oid           pure outcome
src/library/Pqi/Conformance/Operation/LoUnlink.hs view
@@ -17,7 +17,7 @@     it "removes an existing object and rejects a missing one" \conninfo ->       differential adapter conninfo \connection ->         inTransaction connection do-          oid <- connection.loCreat-          removed <- for oid connection.loUnlink-          missing <- connection.loUnlink 4242424+          oid <- Pqi.loCreat connection+          removed <- for oid (Pqi.loUnlink connection)+          missing <- Pqi.loUnlink connection 4242424           pure (removed, missing)
src/library/Pqi/Conformance/Operation/LoWrite.hs view
@@ -17,11 +17,11 @@     it "reports the number of bytes written" \conninfo ->       differential adapter conninfo \connection ->         inTransaction connection do-          oid <- connection.loCreat+          oid <- Pqi.loCreat connection           outcome <- for oid \o -> do-            fd <- connection.loOpen o ReadWriteMode-            written <- for fd \f -> connection.loWrite f "hello, large object"-            traverse_ connection.loClose fd+            fd <- Pqi.loOpen connection o ReadWriteMode+            written <- for fd \f -> Pqi.loWrite connection f "hello, large object"+            traverse_ (Pqi.loClose connection) fd             pure written-          traverse_ connection.loUnlink oid+          traverse_ (Pqi.loUnlink connection) oid           pure outcome
src/library/Pqi/Conformance/Operation/NewNullConnection.hs view
@@ -15,8 +15,8 @@   describe "newNullConnection" do     it "produces a connection that is null and bad" \conninfo ->       differentialConnect adapter conninfo \adapter' _ -> do-        connection <- adapter'.newNullConnection-        nullness <- pure connection.isNullConnection-        badness <- connection.status-        connection.finish+        connection <- Pqi.newNullConnection adapter'+        nullness <- pure (Pqi.isNullConnection connection)+        badness <- Pqi.status connection+        Pqi.finish connection         pure (nullness, badness)
src/library/Pqi/Conformance/Operation/Nfields.hs view
@@ -15,7 +15,7 @@   describe "nfields" do     it "counts columns across result shapes" \conninfo ->       differential adapter conninfo \connection -> do-        let countOf sql = connection.exec sql >>= traverse (.nfields)+        let countOf sql = Pqi.exec connection sql >>= traverse Pqi.nfields         several <- countOf "select 1, 2, 3"         zero <- countOf "select"         command <- countOf "create temporary table conformance_nfields (id int4)"
src/library/Pqi/Conformance/Operation/Notifies.hs view
@@ -5,7 +5,7 @@ -- candidate and the reference are distinct backends — so 'bePid' is omitted -- from the cross-adapter comparison. Each scenario that receives a -- notification instead asserts independently (per adapter) that--- @notification.bePid == backendPID connection@, verifying that the PID field+-- @Pqi.bePid notification == backendPID connection@, verifying that the PID field -- is correctly populated without comparing it across adapters. module Pqi.Conformance.Operation.Notifies   ( spec,@@ -23,36 +23,36 @@   describe "notifies" do     it "is empty with no pending notifications" \conninfo ->       differential adapter conninfo \connection ->-        fmap channelAndPayload <$> connection.notifies+        fmap channelAndPayload <$> Pqi.notifies connection      it "delivers a listen/notify round-trip and then drains" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.exec "listen conformance_channel"-        _ <- connection.exec "notify conformance_channel, 'payload-1'"-        notification <- connection.notifies-        pid <- connection.backendPID-        for_ notification \n -> n.bePid `shouldBe` pid-        drained <- fmap channelAndPayload <$> connection.notifies+        _ <- Pqi.exec connection "listen conformance_channel"+        _ <- Pqi.exec connection "notify conformance_channel, 'payload-1'"+        notification <- Pqi.notifies connection+        pid <- Pqi.backendPID connection+        for_ notification \n -> Pqi.bePid n `shouldBe` pid+        drained <- fmap channelAndPayload <$> Pqi.notifies connection         pure (fmap channelAndPayload notification, drained)      it "queues notifications in order" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.exec "listen conformance_channel"-        _ <- connection.exec "notify conformance_channel, 'first'"-        _ <- connection.exec "notify conformance_channel, 'second'"-        first <- connection.notifies-        second <- connection.notifies-        third <- connection.notifies-        pid <- connection.backendPID-        for_ first \n -> n.bePid `shouldBe` pid-        for_ second \n -> n.bePid `shouldBe` pid+        _ <- Pqi.exec connection "listen conformance_channel"+        _ <- Pqi.exec connection "notify conformance_channel, 'first'"+        _ <- Pqi.exec connection "notify conformance_channel, 'second'"+        first <- Pqi.notifies connection+        second <- Pqi.notifies connection+        third <- Pqi.notifies connection+        pid <- Pqi.backendPID connection+        for_ first \n -> Pqi.bePid n `shouldBe` pid+        for_ second \n -> Pqi.bePid n `shouldBe` pid         pure (fmap channelAndPayload first, fmap channelAndPayload second, fmap channelAndPayload third)      it "stops delivery after unlisten" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.exec "listen conformance_channel"-        _ <- connection.exec "unlisten conformance_channel"-        _ <- connection.exec "notify conformance_channel, 'lost'"-        fmap channelAndPayload <$> connection.notifies+        _ <- Pqi.exec connection "listen conformance_channel"+        _ <- Pqi.exec connection "unlisten conformance_channel"+        _ <- Pqi.exec connection "notify conformance_channel, 'lost'"+        fmap channelAndPayload <$> Pqi.notifies connection   where-    channelAndPayload notification = (notification.relname, notification.extra)+    channelAndPayload notification = (Pqi.relname notification, Pqi.extra notification)
src/library/Pqi/Conformance/Operation/Nparams.hs view
@@ -15,12 +15,12 @@   describe "nparams" do     it "counts the parameters of a prepared statement" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.prepare "conformance_nparams" "select $1 :: int4, $2 :: text" Nothing-        described <- connection.describePrepared "conformance_nparams"-        for described (.nparams)+        _ <- Pqi.prepare connection "conformance_nparams" "select $1 :: int4, $2 :: text" Nothing+        described <- Pqi.describePrepared connection "conformance_nparams"+        for described Pqi.nparams      it "is zero for a parameterless statement" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.prepare "conformance_nparams_zero" "select 42" Nothing-        described <- connection.describePrepared "conformance_nparams_zero"-        for described (.nparams)+        _ <- Pqi.prepare connection "conformance_nparams_zero" "select 42" Nothing+        described <- Pqi.describePrepared connection "conformance_nparams_zero"+        for described Pqi.nparams
src/library/Pqi/Conformance/Operation/Ntuples.hs view
@@ -15,7 +15,7 @@   describe "ntuples" do     it "counts rows across result shapes" \conninfo ->       differential adapter conninfo \connection -> do-        let countOf sql = connection.exec sql >>= traverse (.ntuples)+        let countOf sql = Pqi.exec connection sql >>= traverse Pqi.ntuples         many <- countOf "select i from generate_series (1, 3) as i"         none <- countOf "select 1 where false"         command <- countOf "create temporary table conformance_ntuples (id int4)"
src/library/Pqi/Conformance/Operation/Options.hs view
@@ -14,4 +14,4 @@ spec adapter =   describe "options" do     it "reports the command-line options from the conninfo" \conninfo ->-      differential adapter conninfo (.options)+      differential adapter conninfo Pqi.options
src/library/Pqi/Conformance/Operation/ParameterStatus.hs view
@@ -15,11 +15,11 @@   describe "parameterStatus" do     it "reports parameter statuses, including GUC_REPORT updates" \conninfo ->       differential adapter conninfo \connection -> do-        before <- connection.parameterStatus "application_name"-        _ <- connection.exec "set application_name to 'pqi-conformance'"-        after <- connection.parameterStatus "application_name"-        clientEncoding <- connection.parameterStatus "client_encoding"-        standardConformingStrings <- connection.parameterStatus "standard_conforming_strings"-        integerDatetimes <- connection.parameterStatus "integer_datetimes"-        missing <- connection.parameterStatus "no_such_parameter"+        before <- Pqi.parameterStatus connection "application_name"+        _ <- Pqi.exec connection "set application_name to 'pqi-conformance'"+        after <- Pqi.parameterStatus connection "application_name"+        clientEncoding <- Pqi.parameterStatus connection "client_encoding"+        standardConformingStrings <- Pqi.parameterStatus connection "standard_conforming_strings"+        integerDatetimes <- Pqi.parameterStatus connection "integer_datetimes"+        missing <- Pqi.parameterStatus connection "no_such_parameter"         pure (before, after, clientEncoding, standardConformingStrings, integerDatetimes, missing)
src/library/Pqi/Conformance/Operation/Paramtype.hs view
@@ -16,16 +16,16 @@   describe "paramtype" do     it "reports inferred parameter types" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.prepare "conformance_paramtype" "select $1 :: int4, $2 :: text" Nothing-        described <- connection.describePrepared "conformance_paramtype"+        _ <- Pqi.prepare connection "conformance_paramtype" "select $1 :: int4, $2 :: text" Nothing+        described <- Pqi.describePrepared connection "conformance_paramtype"         for described \r -> do-          n <- r.nparams-          traverse r.paramtype [0 .. n - 1]+          n <- Pqi.nparams r+          traverse (Pqi.paramtype r) [0 .. n - 1]      it "reports explicitly requested parameter types" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.prepare "conformance_paramtype_typed" "select $1" (Just [int8Oid])-        described <- connection.describePrepared "conformance_paramtype_typed"+        _ <- Pqi.prepare connection "conformance_paramtype_typed" "select $1" (Just [int8Oid])+        described <- Pqi.describePrepared connection "conformance_paramtype_typed"         for described \r -> do-          n <- r.nparams-          traverse r.paramtype [0 .. n - 1]+          n <- Pqi.nparams r+          traverse (Pqi.paramtype r) [0 .. n - 1]
src/library/Pqi/Conformance/Operation/Pass.hs view
@@ -14,4 +14,4 @@ spec adapter =   describe "pass" do     it "reports the password from the conninfo" \conninfo ->-      differential adapter conninfo (.pass)+      differential adapter conninfo Pqi.pass
src/library/Pqi/Conformance/Operation/PipelineStatus.hs view
@@ -18,16 +18,16 @@   describe "pipelineStatus" do     it "reports off, on, aborted, and recovery" \conninfo ->       differential adapter conninfo \connection -> do-        off <- connection.pipelineStatus-        _ <- connection.enterPipelineMode-        on <- connection.pipelineStatus-        _ <- traverse (\sql -> connection.sendQueryParams sql [] Lq.Text) ["select 1", "select 1 / 0", "select 3"]-        _ <- connection.pipelineSync+        off <- Lq.pipelineStatus connection+        _ <- Lq.enterPipelineMode connection+        on <- Lq.pipelineStatus connection+        _ <- traverse (\sql -> Lq.sendQueryParams connection sql [] Lq.Text) ["select 1", "select 1 / 0", "select 3"]+        _ <- Lq.pipelineSync connection         _ <- takeCommandResults connection         _ <- takeCommandResults connection-        aborted <- connection.pipelineStatus+        aborted <- Lq.pipelineStatus connection         _ <- takeCommandResults connection         _ <- takeResult connection-        recovered <- connection.pipelineStatus-        _ <- connection.exitPipelineMode+        recovered <- Lq.pipelineStatus connection+        _ <- Lq.exitPipelineMode connection         pure (off, on, aborted, recovered)
src/library/Pqi/Conformance/Operation/PipelineSync.hs view
@@ -19,40 +19,40 @@     Parity.spec adapter     it "collects pipelined queries per sync" \conninfo ->       differential adapter conninfo \connection -> do-        entered <- connection.enterPipelineMode+        entered <- Lq.enterPipelineMode connection         sent <-           traverse-            (\sql -> connection.sendQueryParams sql [] Lq.Text)+            (\sql -> Lq.sendQueryParams connection sql [] Lq.Text)             ["select 1 :: int4", "select 'two' :: text", "select 3 :: int4, 'three' :: text"]-        synced <- connection.pipelineSync+        synced <- Lq.pipelineSync connection         first <- takeCommandResults connection         second <- takeCommandResults connection         third <- takeCommandResults connection         syncResult <- takeResult connection         idle <- takeResult connection-        exited <- connection.exitPipelineMode+        exited <- Lq.exitPipelineMode connection         pure (entered, sent, synced, first, second, third, syncResult, idle, exited)      it "aborts the rest of the pipeline after an error" \conninfo ->       differential adapter conninfo \connection -> do-        entered <- connection.enterPipelineMode+        entered <- Lq.enterPipelineMode connection         sent <-           traverse-            (\sql -> connection.sendQueryParams sql [] Lq.Text)+            (\sql -> Lq.sendQueryParams connection sql [] Lq.Text)             ["select 1", "select 1 / 0", "select 3"]-        synced <- connection.pipelineSync+        synced <- Lq.pipelineSync connection         first <- takeCommandResults connection         failed <- takeCommandResults connection         aborted <- takeCommandResults connection         syncResult <- takeResult connection-        exited <- connection.exitPipelineMode+        exited <- Lq.exitPipelineMode connection         pure (entered, sent, synced, first, failed, aborted, syncResult, exited)      it "returns a sync result when called without prior commands" \conninfo ->       differential adapter conninfo \connection -> do-        entered <- connection.enterPipelineMode-        synced <- connection.pipelineSync+        entered <- Lq.enterPipelineMode connection+        synced <- Lq.pipelineSync connection         syncResult <- takeResult connection         trailing <- takeResult connection-        exited <- connection.exitPipelineMode+        exited <- Lq.exitPipelineMode connection         pure (entered, synced, syncResult, trailing, exited)
src/library/Pqi/Conformance/Operation/PipelineSync/Parity.hs view
@@ -25,13 +25,13 @@       differential adapter conninfo \connection -> do         let query = "SELECT 1, 2"         sequential <- replicateM 100 (observed query [] Lq.Text connection)-        entered <- connection.enterPipelineMode-        sent <- replicateM 100 (connection.sendQueryParams query [] Lq.Text)-        synced <- connection.pipelineSync+        entered <- Lq.enterPipelineMode connection+        sent <- replicateM 100 (Lq.sendQueryParams connection query [] Lq.Text)+        synced <- Lq.pipelineSync connection         pipeline <- replicateM 100 (takeCommandResults connection)         syncResult <- takeResult connection         trailing <- takeResult connection-        exited <- connection.exitPipelineMode+        exited <- Lq.exitPipelineMode connection         let pipelineResults = map fst pipeline         sequential `shouldBe` pipelineResults         pure (entered, sent, synced, pipeline, syncResult, trailing, exited, sequential)@@ -40,13 +40,13 @@       differential adapter conninfo \connection -> do         let query = "SELECT generate_series(0,1000) as a, generate_series(1000,2000) as b"         sequential <- replicateM 100 (observed query [] Lq.Text connection)-        entered <- connection.enterPipelineMode-        sent <- replicateM 100 (connection.sendQueryParams query [] Lq.Text)-        synced <- connection.pipelineSync+        entered <- Lq.enterPipelineMode connection+        sent <- replicateM 100 (Lq.sendQueryParams connection query [] Lq.Text)+        synced <- Lq.pipelineSync connection         pipeline <- replicateM 100 (takeCommandResults connection)         syncResult <- takeResult connection         trailing <- takeResult connection-        exited <- connection.exitPipelineMode+        exited <- Lq.exitPipelineMode connection         let pipelineResults = map fst pipeline         sequential `shouldBe` pipelineResults         pure (entered, sent, synced, pipeline, syncResult, trailing, exited, sequential)
src/library/Pqi/Conformance/Operation/Port.hs view
@@ -13,4 +13,4 @@ spec adapter =   describe "port" do     it "reports the port from the conninfo" \conninfo ->-      differential adapter conninfo (.port)+      differential adapter conninfo Pqi.port
src/library/Pqi/Conformance/Operation/Prepare.hs view
@@ -16,13 +16,13 @@   describe "prepare" do     it "reports its own result" \conninfo ->       differential adapter conninfo \connection ->-        connection.prepare "conformance_prep_result" "select $1 :: int4" Nothing+        Pqi.prepare connection "conformance_prep_result" "select $1 :: int4" Nothing           >>= traverse observeResult      it "rejects a duplicate statement name" \conninfo ->       differential adapter conninfo \connection -> do         first <--          connection.prepare "conformance_dup" "select 1" Nothing >>= traverse observeResult+          Pqi.prepare connection "conformance_dup" "select 1" Nothing >>= traverse observeResult         second <--          connection.prepare "conformance_dup" "select 2" Nothing >>= traverse observeResult+          Pqi.prepare connection "conformance_dup" "select 2" Nothing >>= traverse observeResult         pure (first, second)
src/library/Pqi/Conformance/Operation/ProtocolVersion.hs view
@@ -14,4 +14,4 @@ spec adapter =   describe "protocolVersion" do     it "reports the protocol version" \conninfo ->-      differential adapter conninfo (.protocolVersion)+      differential adapter conninfo Pqi.protocolVersion
src/library/Pqi/Conformance/Operation/PutCopyData.hs view
@@ -16,11 +16,11 @@   describe "putCopyData" do     it "streams rows into a COPY FROM STDIN" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.exec "create temporary table conformance_copy (id int4, label text)"+        _ <- Pqi.exec connection "create temporary table conformance_copy (id int4, label text)"         started <- execScenario "copy conformance_copy from stdin" connection-        firstRow <- connection.putCopyData "1\thello\n"-        secondRow <- connection.putCopyData "2\tworld\n"-        ended <- connection.putCopyEnd Nothing+        firstRow <- Pqi.putCopyData connection "1\thello\n"+        secondRow <- Pqi.putCopyData connection "2\tworld\n"+        ended <- Pqi.putCopyEnd connection Nothing         outcome <- drainResults connection         check <-           execScenario "select count(*), min(label), max(label) from conformance_copy" connection@@ -28,9 +28,9 @@      it "feeds malformed data that the server rejects" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.exec "create temporary table conformance_copy_bad (id int4)"+        _ <- Pqi.exec connection "create temporary table conformance_copy_bad (id int4)"         started <- execScenario "copy conformance_copy_bad from stdin" connection-        row <- connection.putCopyData "not-a-number\n"-        ended <- connection.putCopyEnd Nothing+        row <- Pqi.putCopyData connection "not-a-number\n"+        ended <- Pqi.putCopyEnd connection Nothing         outcome <- drainResults connection         pure (started, row, ended, outcome)
src/library/Pqi/Conformance/Operation/PutCopyEnd.hs view
@@ -16,20 +16,20 @@   describe "putCopyEnd" do     it "commits the copied rows when ended without an error" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.exec "create temporary table conformance_copy_end (id int4)"+        _ <- Pqi.exec connection "create temporary table conformance_copy_end (id int4)"         started <- execScenario "copy conformance_copy_end from stdin" connection-        row <- connection.putCopyData "1\n"-        ended <- connection.putCopyEnd Nothing+        row <- Pqi.putCopyData connection "1\n"+        ended <- Pqi.putCopyEnd connection Nothing         outcome <- drainResults connection         check <- execScenario "select count(*) from conformance_copy_end" connection         pure (started, row, ended, outcome, check)      it "aborts the copy when ended with an error" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.exec "create temporary table conformance_copy_abort (id int4)"+        _ <- Pqi.exec connection "create temporary table conformance_copy_abort (id int4)"         started <- execScenario "copy conformance_copy_abort from stdin" connection-        row <- connection.putCopyData "1\n"-        ended <- connection.putCopyEnd (Just "conformance abort")+        row <- Pqi.putCopyData connection "1\n"+        ended <- Pqi.putCopyEnd connection (Just "conformance abort")         outcome <- drainResults connection         check <- execScenario "select count(*) from conformance_copy_abort" connection         pure (started, row, ended, outcome, check)
src/library/Pqi/Conformance/Operation/Reset.hs view
@@ -16,11 +16,11 @@   describe "reset" do     it "restores a fresh session" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.prepare "conformance_reset" "select 1" Nothing-        _ <- connection.exec "begin"-        inTransaction <- connection.transactionStatus-        connection.reset+        _ <- Pqi.prepare connection "conformance_reset" "select 1" Nothing+        _ <- Pqi.exec connection "begin"+        inTransaction <- Pqi.transactionStatus connection+        Pqi.reset connection         afterReset <- observeConnection connection         -- The prepared statement must be gone in the fresh session.-        describeAfter <- connection.describePrepared "conformance_reset" >>= traverse observeResult+        describeAfter <- Pqi.describePrepared connection "conformance_reset" >>= traverse observeResult         pure (inTransaction, afterReset, describeAfter)
src/library/Pqi/Conformance/Operation/ResetPoll.hs view
@@ -16,8 +16,8 @@   describe "resetPoll" do     it "reaches a terminal polling status and a ready connection" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.exec "begin"-        started <- connection.resetStart-        terminal <- pollUntilDone connection.resetPoll-        afterStatus <- connection.transactionStatus+        _ <- Pqi.exec connection "begin"+        started <- Pqi.resetStart connection+        terminal <- pollUntilDone (Pqi.resetPoll connection)+        afterStatus <- Pqi.transactionStatus connection         pure (started, terminal, afterStatus)
src/library/Pqi/Conformance/Operation/ResetStart.hs view
@@ -17,8 +17,8 @@   describe "resetStart" do     it "begins an asynchronous reset that polls to a fresh session" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.exec "begin"-        started <- connection.resetStart-        polled <- pollUntilDone connection.resetPoll+        _ <- Pqi.exec connection "begin"+        started <- Pqi.resetStart connection+        polled <- pollUntilDone (Pqi.resetPoll connection)         afterReset <- observeConnection connection         pure (started, polled, afterReset)
src/library/Pqi/Conformance/Operation/ResultErrorMessage.hs view
@@ -23,9 +23,9 @@     it "matches the full formatted libpq error string on failure and is empty on success" \conninfo ->       differential adapter conninfo \connection -> do         failed <--          connection.exec "do $$ begin raise exception 'conformance error'; end $$"-            >>= traverse (.resultErrorMessage)+          Pqi.exec connection "do $$ begin raise exception 'conformance error'; end $$"+            >>= traverse Pqi.resultErrorMessage         succeeded <--          connection.exec "select 1"-            >>= traverse (.resultErrorMessage)+          Pqi.exec connection "select 1"+            >>= traverse Pqi.resultErrorMessage         pure (failed, succeeded)
src/library/Pqi/Conformance/Operation/ResultStatus.hs view
@@ -15,7 +15,7 @@   describe "resultStatus" do     it "reports the status for each kind of result" \conninfo ->       differential adapter conninfo \connection -> do-        let statusOf sql = connection.exec sql >>= traverse (.resultStatus)+        let statusOf sql = Pqi.exec connection sql >>= traverse Pqi.resultStatus         tuples <- statusOf "select 1"         command <- statusOf "create temporary table conformance_status (id int4)"         empty <- statusOf ""
src/library/Pqi/Conformance/Operation/SendDescribePortal.hs view
@@ -16,8 +16,8 @@   describe "sendDescribePortal" do     it "describes a declared cursor asynchronously" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.exec "begin"-        _ <- connection.exec "declare conformance_async_cursor cursor for select 1 :: int4 as n"-        sent <- connection.sendDescribePortal "conformance_async_cursor"+        _ <- Pqi.exec connection "begin"+        _ <- Pqi.exec connection "declare conformance_async_cursor cursor for select 1 :: int4 as n"+        sent <- Pqi.sendDescribePortal connection "conformance_async_cursor"         results <- drainResults connection         pure (sent, results)
src/library/Pqi/Conformance/Operation/SendDescribePrepared.hs view
@@ -16,8 +16,8 @@   describe "sendDescribePrepared" do     it "describes a prepared statement asynchronously" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.sendPrepare "conformance_send_desc" "select $1 :: int4 * 2" Nothing+        _ <- Pqi.sendPrepare connection "conformance_send_desc" "select $1 :: int4 * 2" Nothing         _ <- drainResults connection-        sent <- connection.sendDescribePrepared "conformance_send_desc"+        sent <- Pqi.sendDescribePrepared connection "conformance_send_desc"         results <- drainResults connection         pure (sent, results)
src/library/Pqi/Conformance/Operation/SendFlushRequest.hs view
@@ -17,11 +17,11 @@   describe "sendFlushRequest" do     it "delivers results without a sync" \conninfo ->       differential adapter conninfo \connection -> do-        entered <- connection.enterPipelineMode-        sent <- connection.sendQueryParams "select 42" [] Lq.Text-        flushRequested <- connection.sendFlushRequest+        entered <- Lq.enterPipelineMode connection+        sent <- Lq.sendQueryParams connection "select 42" [] Lq.Text+        flushRequested <- Lq.sendFlushRequest connection         results <- takeCommandResults connection-        synced <- connection.pipelineSync+        synced <- Lq.pipelineSync connection         syncResult <- takeResult connection-        exited <- connection.exitPipelineMode+        exited <- Lq.exitPipelineMode connection         pure (entered, sent, flushRequested, results, synced, syncResult, exited)
src/library/Pqi/Conformance/Operation/SendPrepare.hs view
@@ -16,6 +16,6 @@   describe "sendPrepare" do     it "prepares a statement asynchronously" \conninfo ->       differential adapter conninfo \connection -> do-        sent <- connection.sendPrepare "conformance_send_prepare" "select $1 :: int4 * 2" Nothing+        sent <- Pqi.sendPrepare connection "conformance_send_prepare" "select $1 :: int4 * 2" Nothing         results <- drainResults connection         pure (sent, results)
src/library/Pqi/Conformance/Operation/SendQuery.hs view
@@ -17,7 +17,7 @@   describe "sendQuery" do     let sendAndDrain sql conninfo =           differential adapter conninfo \connection -> do-            sent <- connection.sendQuery sql+            sent <- Pqi.sendQuery connection sql             results <- drainResults connection             pure (sent, results)     it "sends a query and collects its result"
src/library/Pqi/Conformance/Operation/SendQueryParams.hs view
@@ -18,7 +18,7 @@     it "sends a parameterized query and collects its result" \conninfo ->       differential adapter conninfo \connection -> do         sent <--          connection.sendQueryParams+          Lq.sendQueryParams connection             "select $1 :: int4 + $2 :: int4, $3 :: text"             [Just (int4Oid, "40", Lq.Text), Just (int4Oid, "2", Lq.Text), Nothing]             Lq.Text
src/library/Pqi/Conformance/Operation/SendQueryPrepared.hs view
@@ -17,8 +17,8 @@   describe "sendQueryPrepared" do     it "executes a prepared statement asynchronously" \conninfo ->       differential adapter conninfo \connection -> do-        _ <- connection.sendPrepare "conformance_send_exec" "select $1 :: int4 * 2" Nothing+        _ <- Lq.sendPrepare connection "conformance_send_exec" "select $1 :: int4 * 2" Nothing         _ <- drainResults connection-        sent <- connection.sendQueryPrepared "conformance_send_exec" [Just ("21", Lq.Text)] Lq.Text+        sent <- Lq.sendQueryPrepared connection "conformance_send_exec" [Just ("21", Lq.Text)] Lq.Text         results <- drainResults connection         pure (sent, results)
src/library/Pqi/Conformance/Operation/ServerVersion.hs view
@@ -14,4 +14,4 @@ spec adapter =   describe "serverVersion" do     it "reports the server version as an integer" \conninfo ->-      differential adapter conninfo (.serverVersion)+      differential adapter conninfo Pqi.serverVersion
src/library/Pqi/Conformance/Operation/SetClientEncoding.hs view
@@ -16,8 +16,8 @@   describe "setClientEncoding" do     it "rejects an unknown encoding and leaves the session usable" \conninfo ->       differential adapter conninfo \connection -> do-        rejected <- connection.setClientEncoding "BOGUS_ENCODING"-        unchanged <- connection.clientEncoding-        stillIdle <- connection.transactionStatus+        rejected <- Pqi.setClientEncoding connection "BOGUS_ENCODING"+        unchanged <- Pqi.clientEncoding connection+        stillIdle <- Pqi.transactionStatus connection         stillWorks <- execScenario "select 1" connection         pure (rejected, unchanged, stillIdle, stillWorks)
src/library/Pqi/Conformance/Operation/SetErrorVerbosity.hs view
@@ -16,7 +16,7 @@   describe "setErrorVerbosity" do     it "returns the previous setting" \conninfo ->       differential adapter conninfo \connection -> do-        beforeTerse <- connection.setErrorVerbosity Lq.ErrorsTerse-        beforeVerbose <- connection.setErrorVerbosity Lq.ErrorsVerbose-        beforeDefault <- connection.setErrorVerbosity Lq.ErrorsDefault+        beforeTerse <- Lq.setErrorVerbosity connection Lq.ErrorsTerse+        beforeVerbose <- Lq.setErrorVerbosity connection Lq.ErrorsVerbose+        beforeDefault <- Lq.setErrorVerbosity connection Lq.ErrorsDefault         pure (beforeTerse, beforeVerbose, beforeDefault)
src/library/Pqi/Conformance/Operation/SetSingleRowMode.hs view
@@ -16,14 +16,14 @@   describe "setSingleRowMode" do     it "splits a multi-row result into single-row results" \conninfo ->       differential adapter conninfo \connection -> do-        sent <- connection.sendQuery "select i from generate_series (1, 3) as i"-        singleRow <- connection.setSingleRowMode+        sent <- Pqi.sendQuery connection "select i from generate_series (1, 3) as i"+        singleRow <- Pqi.setSingleRowMode connection         results <- drainResults connection         pure (sent, singleRow, results)      it "handles an empty result" \conninfo ->       differential adapter conninfo \connection -> do-        sent <- connection.sendQuery "select 1 where false"-        singleRow <- connection.setSingleRowMode+        sent <- Pqi.sendQuery connection "select 1 where false"+        singleRow <- Pqi.setSingleRowMode connection         results <- drainResults connection         pure (sent, singleRow, results)
src/library/Pqi/Conformance/Operation/Setnonblocking.hs view
@@ -15,8 +15,8 @@   describe "setnonblocking" do     it "turns the non-blocking flag on and off" \conninfo ->       differential adapter conninfo \connection -> do-        setOn <- connection.setnonblocking True-        nowOn <- connection.isnonblocking-        setOff <- connection.setnonblocking False-        nowOff <- connection.isnonblocking+        setOn <- Pqi.setnonblocking connection True+        nowOn <- Pqi.isnonblocking connection+        setOff <- Pqi.setnonblocking connection False+        nowOff <- Pqi.isnonblocking connection         pure (setOn, nowOn, setOff, nowOff)
src/library/Pqi/Conformance/Operation/Socket.hs view
@@ -17,4 +17,4 @@   describe "socket" do     it "is present on an open connection" \conninfo ->       differential adapter conninfo \connection ->-        isJust <$> connection.socket+        isJust <$> Pqi.socket connection
src/library/Pqi/Conformance/Operation/Status.hs view
@@ -13,4 +13,4 @@ spec adapter =   describe "status" do     it "reports a ready connection as OK" \conninfo ->-      differential adapter conninfo (.status)+      differential adapter conninfo Pqi.status
src/library/Pqi/Conformance/Operation/TransactionStatus.hs view
@@ -15,11 +15,11 @@   describe "transactionStatus" do     it "tracks status through a transaction" \conninfo ->       differential adapter conninfo \connection -> do-        idle <- connection.transactionStatus-        _ <- connection.exec "begin"-        inTransaction <- connection.transactionStatus-        _ <- connection.exec "select 1 / 0"-        inError <- connection.transactionStatus-        _ <- connection.exec "rollback"-        afterRollback <- connection.transactionStatus+        idle <- Pqi.transactionStatus connection+        _ <- Pqi.exec connection "begin"+        inTransaction <- Pqi.transactionStatus connection+        _ <- Pqi.exec connection "select 1 / 0"+        inError <- Pqi.transactionStatus connection+        _ <- Pqi.exec connection "rollback"+        afterRollback <- Pqi.transactionStatus connection         pure (idle, inTransaction, inError, afterRollback)
src/library/Pqi/Conformance/Operation/UnescapeBytea.hs view
@@ -16,8 +16,8 @@   describe "unescapeBytea" do     for_ cases \input ->       it (show input) \_ -> do-        candidate <- adapter.unescapeBytea input-        reference <- Reference.adapter.unescapeBytea input+        candidate <- Pqi.unescapeBytea adapter input+        reference <- Pqi.unescapeBytea Reference.adapter input         candidate `shouldBe` reference   where     cases =
src/library/Pqi/Conformance/Operation/UnsafeFreeResult.hs view
@@ -21,6 +21,6 @@   describe "unsafeFreeResult" do     it "leaves the connection usable" \conninfo ->       differential adapter conninfo \connection -> do-        result <- connection.exec "select 1"-        traverse_ (.unsafeFreeResult) result+        result <- Pqi.exec connection "select 1"+        traverse_ Pqi.unsafeFreeResult result         execScenario "select 2" connection
src/library/Pqi/Conformance/Operation/User.hs view
@@ -13,4 +13,4 @@ spec adapter =   describe "user" do     it "reports the user name from the conninfo" \conninfo ->-      differential adapter conninfo (.user)+      differential adapter conninfo Pqi.user
src/library/Pqi/Conformance/Scenario.hs view
@@ -42,7 +42,7 @@  -- | Run 'Pqi.exec' and observe its result (if any). execScenario :: ByteString -> Pqi.Connection -> IO (Maybe ResultObservation)-execScenario sql connection = connection.exec sql >>= traverse observeResult+execScenario sql connection = Pqi.exec connection sql >>= traverse observeResult  -- | Run a sequence of statements with 'Pqi.exec', observing every result. execAllScenario :: [ByteString] -> Pqi.Connection -> IO [Maybe ResultObservation]@@ -56,7 +56,7 @@   Pqi.Connection ->   IO (Maybe ResultObservation) observed sql params resultFormat connection =-  connection.execParams sql params resultFormat >>= traverse observeResult+  Pqi.execParams connection sql params resultFormat >>= traverse observeResult  -- | Collect and observe results with 'Pqi.getResult' until it reports -- completion with 'Nothing'.@@ -64,7 +64,7 @@ drainResults connection = go []   where     go acc =-      connection.getResult >>= \case+      Pqi.getResult connection >>= \case         Nothing -> pure (reverse acc)         Just result -> do           observation <- observeResult result@@ -72,7 +72,7 @@  -- | One 'Pqi.getResult' step, observed. takeResult :: Pqi.Connection -> IO (Maybe ResultObservation)-takeResult connection = connection.getResult >>= traverse observeResult+takeResult connection = Pqi.getResult connection >>= traverse observeResult  -- | The results of one pipelined command: its result and the 'Nothing' -- separator that ends it.@@ -91,7 +91,7 @@   where     go 0 acc = pure (reverse acc)     go n acc =-      connection.getCopyData False >>= \case+      Pqi.getCopyData connection False >>= \case         CopyOutRow row -> go (n - 1) (CopyOutRow row : acc)         terminal -> pure (reverse (terminal : acc)) @@ -122,9 +122,9 @@ -- run inside a transaction block. inTransaction :: Pqi.Connection -> IO a -> IO a inTransaction connection action = do-  _ <- connection.exec "begin"+  _ <- Pqi.exec connection "begin"   result <- action-  _ <- connection.exec "commit"+  _ <- Pqi.exec connection "commit"   pure result  boolOid :: Word32