{-# LANGUAGE OverloadedStrings #-}
module Database.Bolt.Transaction
( transact
) where
import Control.Monad ( void )
import Control.Monad.Trans ( MonadIO(..) )
import Control.Monad.Except ( MonadError(..) )
import Database.Bolt.Connection ( BoltActionT
, query'
)
transact :: MonadIO m => BoltActionT m a -> BoltActionT m a
transact actions = do
txBegin
let processErrors = flip catchError $ \e -> txRollback >> throwError e
result <- processErrors actions
txCommit
pure result
txBegin :: MonadIO m => BoltActionT m ()
txBegin = void $ query' "BEGIN"
txCommit :: MonadIO m => BoltActionT m ()
txCommit = void $ query' "COMMIT"
txRollback :: MonadIO m => BoltActionT m ()
txRollback = void $ query' "ROLLBACK"