hasql-transaction-io 0.1.0.0 → 0.2.8.0
raw patch · 5 files changed
Files
- hasql-transaction-io.cabal +20/−16
- library/Hasql/Private/CursorTransactionIO.hs +2/−2
- library/Hasql/Private/Session/MonadThrow.hs +16/−0
- library/Hasql/Private/TransactionIO.hs +33/−18
- library/Hasql/TransactionIO.hs +3/−2
hasql-transaction-io.cabal view
@@ -1,16 +1,19 @@ cabal-version: 2.4 name: hasql-transaction-io-version: 0.1.0.0-synopsis: Perform IO actions during transactions for Hasql+version: 0.2.8.0+license: MIT+license-file: LICENSE+copyright: (c) 2022, 2024 Andre Marianiello+maintainer: andremarianiello@users.noreply.github.com+author: Andre Marianiello homepage: https://github.com/andremarianiello/hasql-transaction-io bug-reports: https://github.com/andremarianiello/hasql-transaction-io/issues -license: MIT-license-file: LICENSE-author: Andre Marianiello-maintainer: andremarianiello@users.noreply.github.com-copyright: (c) 2022, Andre Marianiello+synopsis: Perform IO actions during transactions for Hasql+description:+ Perform IO actions during transactions for Hasql. If you need transactions in hasql but do not need to perform IO in the middle of the transaction, use haslq-transaction. This packages differs from hasql-transaction in that it sacrifices invisible retries for the ability to perform arbitrary IO in the middle of a transaction. This is beneficial when your transaction is long-lived (e.g. when using cursors) and you wish to perform IO with requested data. See <https://hackage.haskell.org/package/hasql-streams-core hasql-streams-core> for an example use case.+ category: Database, PostgreSQL, Hasql source-repository head@@ -25,13 +28,16 @@ Hasql.TransactionIO Hasql.TransactionIO.Sessions + hs-source-dirs: library other-modules: Hasql.Private.CursorTransactionIO+ Hasql.Private.Session.MonadThrow Hasql.Private.Session.UnliftIO Hasql.Private.Statements Hasql.Private.TransactionIO Hasql.Private.Types + default-language: Haskell2010 default-extensions: DeriveFunctor FlexibleContexts@@ -42,15 +48,13 @@ other-extensions: OverloadedStrings build-depends:- , base >=4.14 && <4.17- , bytestring >=0.10+ , base >=4.14 && <5+ , bytestring >=0.10 && <0.13 , bytestring-tree-builder ^>=0.2- , hasql ^>=1.5- , mtl ^>=2.2- , resourcet ^>=1.2+ , exceptions ^>=0.10+ , hasql >=1.7 && <1.9+ , mtl ^>=2.3+ , resourcet ^>=1.3 , safe-exceptions ^>=0.1- , transformers ^>=0.5+ , transformers ^>=0.6 , unliftio-core ^>=0.2-- hs-source-dirs: library- default-language: Haskell2010
library/Hasql/Private/CursorTransactionIO.hs view
@@ -55,10 +55,10 @@ statement :: params -> Statement params result -> CursorTransactionIO s result statement params stmt = CursorTransactionIO . lift . lift $ TransactionIO.statement params stmt -ignoreFailedTransactionError :: MonadError QueryError m => m () -> m ()+ignoreFailedTransactionError :: MonadError SessionError m => m () -> m () ignoreFailedTransactionError sess = catchError sess $ \qe -> case qe of- QueryError _ _ (ResultError (ServerError "25P02" _ _ _)) -> pure ()+ QueryError _ _ (ResultError (ServerError "25P02" _ _ _ _)) -> pure () _ -> throwError qe -- | Run a `Statement` using a cursor
+ library/Hasql/Private/Session/MonadThrow.hs view
@@ -0,0 +1,16 @@+module Hasql.Private.Session.MonadThrow where++-- base+import Control.Exception++-- transformers+import Control.Monad.IO.Class++-- exceptions+import Control.Monad.Catch (MonadThrow (..))++--hasql+import Hasql.Session++instance MonadThrow Session where+ throwM = liftIO . throwIO
library/Hasql/Private/TransactionIO.hs view
@@ -3,41 +3,45 @@ module Hasql.Private.TransactionIO where -- base-import Control.Applicative+import Control.Applicative -- bytestring-import Data.ByteString (ByteString)+import Data.ByteString (ByteString) -- bytestring-tree-builder-import ByteString.TreeBuilder+import ByteString.TreeBuilder -- transformers-import Control.Monad.Trans.Reader-import Control.Monad.Trans.Class+import Control.Monad.Trans.Class+import Control.Monad.Trans.Reader -- mtl-import Control.Monad.Error.Class+import Control.Monad.Error.Class -- unliftio-core-import Control.Monad.IO.Unlift+import Control.Monad.IO.Unlift +-- safe-exceptions+import Control.Exception.Safe+ -- resourcet-import Data.Acquire-import Control.Monad.Trans.Resource+import Control.Monad.Trans.Resource+import Data.Acquire -- hasql-import Hasql.Statement-import Hasql.Session-import qualified Hasql.Session as Session+import Hasql.Session+import qualified Hasql.Session as Session+import Hasql.Statement -- hasql-streaming-import Hasql.Private.Session.UnliftIO-import Hasql.Private.Types-import qualified Hasql.Private.Statements as Statements+import Hasql.Private.Session.MonadThrow+import Hasql.Private.Session.UnliftIO+import qualified Hasql.Private.Statements as Statements+import Hasql.Private.Types -- | A mixture of Hasql statements and arbitrary IO that is all performed during a single transaction newtype TransactionIO a = TransactionIO (ReaderT Transaction Session a)- deriving (Functor, Applicative, Monad, MonadIO, MonadError QueryError, MonadUnliftIO)+ deriving (Functor, Applicative, Monad, MonadIO, MonadError SessionError, MonadUnliftIO, MonadThrow) data Transaction = Transaction @@ -69,8 +73,8 @@ endTransaction :: Bool -> Transaction -> ReleaseType -> Session () endTransaction prepare tx = \case- ReleaseEarly -> commitTransaction prepare tx- ReleaseNormal -> commitTransaction prepare tx+ ReleaseEarly -> commitTransaction prepare tx+ ReleaseNormal -> commitTransaction prepare tx ReleaseException -> rollbackTransaction prepare tx commitTransaction :: Bool -> Transaction -> Session ()@@ -80,3 +84,14 @@ rollbackTransaction :: Bool -> Transaction -> Session () rollbackTransaction prepare Transaction = do Session.statement () (Statements.rollbackTransaction prepare)++++data CondemnTransactionException = CondemnTransactionException+ deriving (Show)++instance Exception CondemnTransactionException++-- | Throw an internal exception that causes the transaction to be rolled back. If you wish to rollback a transaction with a more useful exception use `throwIO`+condemn :: TransactionIO a+condemn = throwIO CondemnTransactionException
library/Hasql/TransactionIO.hs view
@@ -1,8 +1,9 @@ module Hasql.TransactionIO ( TransactionIO,- statement,+ condemn, sql,+ statement, ) where -- hasql-transaction-io-import Hasql.Private.TransactionIO+import Hasql.Private.TransactionIO