hasql-pool 1.1 → 1.2
raw patch · 12 files changed
+75/−55 lines, 12 filesdep ~hasqlbinary-addedPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: hasql
API changes (from Hackage documentation)
- Hasql.Pool: SessionUsageError :: QueryError -> UsageError
+ Hasql.Pool: SessionUsageError :: SessionError -> UsageError
- Hasql.Pool.Observation: InitializationErrorTerminationReason :: QueryError -> ConnectionTerminationReason
+ Hasql.Pool.Observation: InitializationErrorTerminationReason :: SessionError -> ConnectionTerminationReason
- Hasql.Pool.Observation: SessionFailedConnectionReadyForUseReason :: QueryError -> ConnectionReadyForUseReason
+ Hasql.Pool.Observation: SessionFailedConnectionReadyForUseReason :: SessionError -> ConnectionReadyForUseReason
Files
- CHANGELOG.md +5/−0
- diagrams-output/connection-status-model.png binary
- diagrams-output/observation-status-model.png binary
- hasql-pool.cabal +8/−9
- src/library/exposed/Hasql/Pool.hs +28/−22
- src/library/exposed/Hasql/Pool/Config.hs +2/−2
- src/library/exposed/Hasql/Pool/Config/Defaults.hs +2/−2
- src/library/exposed/Hasql/Pool/Observation.hs +4/−4
- src/library/other/Hasql/Pool/Config/Config.hs +3/−3
- src/library/other/Hasql/Pool/Config/Setting.hs +3/−3
- src/library/other/Hasql/Pool/SessionErrorDestructors.hs +10/−0
- src/test/Main.hs +10/−10
CHANGELOG.md view
@@ -1,3 +1,8 @@+# 1.2++- Migrated to `hasql-1.7`+- Changed references to `QueryError` in observations to `SessionError`+ # 1.1 - `ReadyForUseConnectionStatus` got extended with the `ConnectionReadyForUseReason` details.
+ diagrams-output/connection-status-model.png view
binary file changed (absent → 16434 bytes)
− diagrams-output/observation-status-model.png
binary file changed (16434 → absent bytes)
hasql-pool.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.0 name: hasql-pool-version: 1.1+version: 1.2 category: Hasql, Database, PostgreSQL synopsis: Pool of connections for Hasql homepage: https://github.com/nikita-volkov/hasql-pool@@ -22,7 +22,10 @@ location: git://github.com/nikita-volkov/hasql-pool.git common base-settings+ default-language: Haskell2010 default-extensions:+ ApplicativeDo+ Arrows BangPatterns BlockArguments ConstraintKinds@@ -40,33 +43,28 @@ FunctionalDependencies GADTs GeneralizedNewtypeDeriving- InstanceSigs+ ImportQualifiedPost LambdaCase LiberalTypeSynonyms- MagicHash MultiParamTypeClasses MultiWayIf NoImplicitPrelude NoMonomorphismRestriction NumericUnderscores OverloadedStrings- ParallelListComp PatternGuards QuasiQuotes RankNTypes RecordWildCards+ RoleAnnotations ScopedTypeVariables StandaloneDeriving StrictData- TemplateHaskell TupleSections TypeApplications TypeFamilies TypeOperators- UnboxedTuples - default-language: Haskell2010- library import: base-settings hs-source-dirs:@@ -85,11 +83,12 @@ Hasql.Pool.Config.Config Hasql.Pool.Config.Setting Hasql.Pool.Prelude+ Hasql.Pool.SessionErrorDestructors build-depends: base >=4.11 && <5, bytestring >=0.10 && <0.14,- hasql >=1.6.0.1 && <1.7,+ hasql >=1.7 && <1.8, stm >=2.5 && <3, text >=1.2 && <3, time >=1.9 && <2,
src/library/exposed/Hasql/Pool.hs view
@@ -10,15 +10,16 @@ ) where -import qualified Data.Text.Encoding as Text-import qualified Data.Text.Encoding.Error as Text-import qualified Data.UUID.V4 as Uuid+import Data.Text.Encoding qualified as Text+import Data.Text.Encoding.Error qualified as Text+import Data.UUID.V4 qualified as Uuid import Hasql.Connection (Connection)-import qualified Hasql.Connection as Connection-import qualified Hasql.Pool.Config.Config as Config+import Hasql.Connection qualified as Connection+import Hasql.Pool.Config.Config qualified as Config import Hasql.Pool.Observation import Hasql.Pool.Prelude-import qualified Hasql.Session as Session+import Hasql.Pool.SessionErrorDestructors qualified as ErrorsDestruction+import Hasql.Session qualified as Session -- | A connection tagged with metadata. data Entry = Entry@@ -175,11 +176,12 @@ Session.run poolInitSession connection >>= \case Left err -> do Connection.release connection- case err of- Session.QueryError _ _ (Session.ClientError details) -> do- poolObserver (ConnectionObservation id (TerminatedConnectionStatus (NetworkErrorConnectionTerminationReason (fmap (Text.decodeUtf8With Text.lenientDecode) details))))- _ ->- poolObserver (ConnectionObservation id (TerminatedConnectionStatus (InitializationErrorTerminationReason err)))+ ErrorsDestruction.reset+ ( \details -> do+ poolObserver (ConnectionObservation id (TerminatedConnectionStatus (NetworkErrorConnectionTerminationReason (fmap (Text.decodeUtf8With Text.lenientDecode) details))))+ )+ (poolObserver (ConnectionObservation id (TerminatedConnectionStatus (InitializationErrorTerminationReason err))))+ err return $ Left $ SessionUsageError err Right () -> do poolObserver (ConnectionObservation id (ReadyForUseConnectionStatus EstablishedConnectionReadyForUseReason))@@ -209,16 +211,20 @@ Left exc -> do returnConn throwIO exc- Right (Left err) -> case err of- Session.QueryError _ _ (Session.ClientError details) -> do- Connection.release (entryConnection entry)- atomically $ modifyTVar' poolCapacity succ- poolObserver (ConnectionObservation (entryId entry) (TerminatedConnectionStatus (NetworkErrorConnectionTerminationReason (fmap (Text.decodeUtf8With Text.lenientDecode) details))))- return $ Left $ SessionUsageError err- _ -> do- returnConn- poolObserver (ConnectionObservation (entryId entry) (ReadyForUseConnectionStatus (SessionFailedConnectionReadyForUseReason err)))- return $ Left $ SessionUsageError err+ Right (Left err) ->+ ErrorsDestruction.reset+ ( \details -> do+ Connection.release (entryConnection entry)+ atomically $ modifyTVar' poolCapacity succ+ poolObserver (ConnectionObservation (entryId entry) (TerminatedConnectionStatus (NetworkErrorConnectionTerminationReason (fmap (Text.decodeUtf8With Text.lenientDecode) details))))+ return $ Left $ SessionUsageError err+ )+ ( do+ returnConn+ poolObserver (ConnectionObservation (entryId entry) (ReadyForUseConnectionStatus (SessionFailedConnectionReadyForUseReason err)))+ return $ Left $ SessionUsageError err+ )+ err Right (Right res) -> do returnConn poolObserver (ConnectionObservation (entryId entry) (ReadyForUseConnectionStatus SessionSucceededConnectionReadyForUseReason))@@ -239,7 +245,7 @@ = -- | Attempt to establish a connection failed. ConnectionUsageError Connection.ConnectionError | -- | Session execution failed.- SessionUsageError Session.QueryError+ SessionUsageError Session.SessionError | -- | Timeout acquiring a connection. AcquisitionTimeoutUsageError deriving (Show, Eq)
src/library/exposed/Hasql/Pool/Config.hs view
@@ -14,8 +14,8 @@ ) where -import qualified Hasql.Pool.Config.Config as Config-import qualified Hasql.Pool.Config.Setting as Setting+import Hasql.Pool.Config.Config qualified as Config+import Hasql.Pool.Config.Setting qualified as Setting import Hasql.Pool.Prelude -- | Compile config from a list of settings.
src/library/exposed/Hasql/Pool/Config/Defaults.hs view
@@ -1,9 +1,9 @@ module Hasql.Pool.Config.Defaults where -import qualified Hasql.Connection as Connection+import Hasql.Connection qualified as Connection import Hasql.Pool.Observation (Observation) import Hasql.Pool.Prelude-import qualified Hasql.Session as Session+import Hasql.Session qualified as Session -- | -- 3 connections.
src/library/exposed/Hasql/Pool/Observation.hs view
@@ -5,7 +5,7 @@ module Hasql.Pool.Observation where import Hasql.Pool.Prelude-import qualified Hasql.Session as Session+import Hasql.Session qualified as Session -- | An observation of a change of the state of a pool. data Observation@@ -20,7 +20,7 @@ -- | Status of a connection. ----- <<diagrams-output/observation-status-model.png>>+-- <<diagrams-output/connection-status-model.png>> data ConnectionStatus = -- | Connection is being established. --@@ -40,7 +40,7 @@ = -- | Connection just got established. EstablishedConnectionReadyForUseReason | -- | Session execution ended with a failure that does not require a connection reset.- SessionFailedConnectionReadyForUseReason Session.QueryError+ SessionFailedConnectionReadyForUseReason Session.SessionError | -- | Session execution ended with success. SessionSucceededConnectionReadyForUseReason deriving (Show, Eq)@@ -56,5 +56,5 @@ | -- | User has invoked the 'Hasql.Pool.release' procedure. ReleaseConnectionTerminationReason | -- | Initialization session failure.- InitializationErrorTerminationReason Session.QueryError+ InitializationErrorTerminationReason Session.SessionError deriving (Show, Eq)
src/library/other/Hasql/Pool/Config/Config.hs view
@@ -1,10 +1,10 @@ module Hasql.Pool.Config.Config where -import qualified Hasql.Connection as Connection-import qualified Hasql.Pool.Config.Defaults as Defaults+import Hasql.Connection qualified as Connection+import Hasql.Pool.Config.Defaults qualified as Defaults import Hasql.Pool.Observation (Observation) import Hasql.Pool.Prelude-import qualified Hasql.Session as Session+import Hasql.Session qualified as Session -- | Configufation for Hasql connection pool. data Config = Config
src/library/other/Hasql/Pool/Config/Setting.hs view
@@ -1,11 +1,11 @@ module Hasql.Pool.Config.Setting where -import qualified Hasql.Connection as Connection+import Hasql.Connection qualified as Connection import Hasql.Pool.Config.Config (Config)-import qualified Hasql.Pool.Config.Config as Config+import Hasql.Pool.Config.Config qualified as Config import Hasql.Pool.Observation (Observation) import Hasql.Pool.Prelude-import qualified Hasql.Session as Session+import Hasql.Session qualified as Session apply :: Setting -> Config -> Config apply (Setting run) = run
+ src/library/other/Hasql/Pool/SessionErrorDestructors.hs view
@@ -0,0 +1,10 @@+module Hasql.Pool.SessionErrorDestructors where++import Hasql.Pool.Prelude+import Hasql.Session qualified as Session++reset :: (Maybe ByteString -> x) -> x -> Session.SessionError -> x+reset onReset onNoReset = \case+ Session.QueryError _ _ (Session.ClientError details) -> onReset details+ Session.PipelineError (Session.ClientError details) -> onReset details+ _ -> onNoReset
src/test/Main.hs view
@@ -1,17 +1,17 @@ module Main where import Control.Concurrent.Async (race)-import qualified Data.ByteString.Char8 as B8-import qualified Data.Text as Text-import qualified Hasql.Connection as Connection-import qualified Hasql.Decoders as Decoders-import qualified Hasql.Encoders as Encoders+import Data.ByteString.Char8 qualified as B8+import Data.Text qualified as Text+import Hasql.Connection qualified as Connection+import Hasql.Decoders qualified as Decoders+import Hasql.Encoders qualified as Encoders import Hasql.Pool-import qualified Hasql.Pool.Config as Config-import qualified Hasql.Session as Session-import qualified Hasql.Statement as Statement-import qualified System.Environment-import qualified System.Random.Stateful as Random+import Hasql.Pool.Config qualified as Config+import Hasql.Session qualified as Session+import Hasql.Statement qualified as Statement+import System.Environment qualified+import System.Random.Stateful qualified as Random import Test.Hspec import Prelude