module Hasql.Transaction.Private.Transaction
where
import Hasql.Transaction.Private.Prelude
import Hasql.Transaction.Private.Model
import qualified Hasql.Statement as A
import qualified Hasql.Session as B
import qualified Hasql.Transaction.Private.Statements as C
import qualified Hasql.Transaction.Private.Sessions as D
newtype Transaction a =
Transaction (StateT Bool B.Session a)
deriving (Functor, Applicative, Monad)
instance Semigroup a => Semigroup (Transaction a) where
(<>) = liftA2 (<>)
instance Monoid a => Monoid (Transaction a) where
mempty = pure mempty
mappend = liftA2 mappend
{-# INLINE run #-}
run :: Transaction a -> IsolationLevel -> Mode -> B.Session a
run (Transaction session) isolation mode =
D.inRetryingTransaction isolation mode (runStateT session True)
{-# INLINE sql #-}
sql :: ByteString -> Transaction ()
sql =
Transaction . lift . B.sql
{-# INLINE statement #-}
statement :: a -> A.Statement a b -> Transaction b
statement params statement =
Transaction . lift $ B.statement params statement
{-# INLINE condemn #-}
condemn :: Transaction ()
condemn =
Transaction $ put False