hasql 1.10.2.2 → 1.10.2.3
raw patch · 5 files changed
+77/−2 lines, 5 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- hasql.cabal +1/−1
- src/library-tests/Sharing/ByUnit/Session/ScriptSpec.hs +41/−0
- src/library/Hasql/Comms/Recv.hs +24/−0
- src/library/Hasql/Comms/Roundtrip.hs +10/−0
- src/library/Hasql/Engine/Contexts/Session.hs +1/−1
hasql.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.0 name: hasql-version: 1.10.2.2+version: 1.10.2.3 category: Hasql, Database, PostgreSQL synopsis: Fast PostgreSQL driver with a flexible mapping API description:
src/library-tests/Sharing/ByUnit/Session/ScriptSpec.hs view
@@ -16,3 +16,44 @@ case result of Left (Errors.ScriptSessionError _ _) -> pure () _ -> expectationFailure $ "Expected ScriptSessionError with ExecutionScriptError, got: " <> show result++ it "handles multi-statement DDL scripts with comments" \config -> do+ Scripts.onPreparableConnection config \connection -> do+ tableName <- Scripts.generateSymname+ let sql =+ (mconcat . map (<> "\n"))+ [ "create table \"" <> tableName <> "_genre\" (",+ " \"id\" int4 not null generated always as identity primary key,",+ " \"name\" text not null unique",+ ");",+ "",+ "create table \"" <> tableName <> "_artist\" (",+ " \"id\" int4 not null generated always as identity primary key,",+ " \"name\" text not null",+ ");",+ "",+ "create table \"" <> tableName <> "_album\" (",+ " \"id\" int4 not null generated always as identity primary key,",+ " -- Album name.",+ " \"name\" text not null,",+ " -- The date the album was first released.",+ " \"released\" date null",+ ");",+ "",+ "create table \"" <> tableName <> "_album_genre\" (",+ " \"album\" int4 not null references \"" <> tableName <> "_album\",",+ " \"genre\" int4 not null references \"" <> tableName <> "_genre\"",+ ");",+ "",+ "create table \"" <> tableName <> "_album_artist\" (",+ " \"album\" int4 not null references \"" <> tableName <> "_album\",",+ " \"artist\" int4 not null references \"" <> tableName <> "_artist\",",+ " -- Whether it is the primary artist",+ " \"primary\" bool not null,",+ " primary key (\"album\", \"artist\")",+ ");"+ ]+ result <- Connection.use connection (Session.script sql)+ case result of+ Right () -> pure ()+ Left err -> expectationFailure $ "Expected success, got: " <> show err
src/library/Hasql/Comms/Recv.hs view
@@ -1,6 +1,7 @@ module Hasql.Comms.Recv ( Recv, singleResult,+ allResults, toHandler, Error (..), )@@ -50,6 +51,29 @@ result <- ResultDecoder.toHandler handler result pure (first (ResultError context 0) result) pure result++-- | Consume all results from a multi-statement query (e.g., scripts).+-- Each result is decoded using the provided handler.+-- This is useful for scripts that may contain multiple statements,+-- where each statement produces a result that needs to be validated.+-- All results are consumed even if an error occurs, to leave the connection+-- in a clean state.+allResults :: context -> ResultDecoder.ResultDecoder a -> Recv context ()+allResults context handler = Recv \connection -> do+ let loop resultIndex maybeError = do+ result <- Pq.getResult connection+ case result of+ Nothing -> pure maybeError+ Just result -> do+ decodedResult <- ResultDecoder.toHandler handler result+ case decodedResult of+ Left err ->+ -- Continue consuming results even after error to clean up connection+ loop (resultIndex + 1) (Just (ResultError context resultIndex err))+ Right _ ->+ loop (resultIndex + 1) maybeError+ errorOrUnit <- loop 0 Nothing+ pure (maybe (Right ()) Left errorOrUnit) -- * Errors
src/library/Hasql/Comms/Roundtrip.hs view
@@ -8,6 +8,7 @@ queryPrepared, queryParams, query,+ script, -- * Errors Error (..),@@ -112,6 +113,15 @@ Roundtrip (Send.query context sql) (Recv.singleResult context ResultDecoder.ok)++-- | Execute a script (multi-statement SQL).+-- Unlike 'query', this consumes all results from the execution,+-- which is necessary for scripts containing multiple statements.+script :: context -> ByteString -> Roundtrip context ()+script context sql =+ Roundtrip+ (Send.query context sql)+ (Recv.allResults context ResultDecoder.ok) data Error context = ClientError context (Maybe ByteString)
src/library/Hasql/Engine/Contexts/Session.hs view
@@ -42,7 +42,7 @@ script sql = Session \connectionState -> do let connection = ConnectionState.connection connectionState- result <- Comms.Roundtrip.toSerialIO (Comms.Roundtrip.query (Just sql) sql) connection+ result <- Comms.Roundtrip.toSerialIO (Comms.Roundtrip.script (Just sql) sql) connection case result of Left err -> case err of Comms.Roundtrip.ClientError _ details -> do