@@ -0,0 +1,85 @@
8+ , MultiParamTypeClasses
11+module Squeal.PostgreSQL.Transaction
17+ , TransactionMode (..)
20+import Control.Exception.Lifted
21+import Control.Monad.Trans.Control
22+import Data.ByteString
25+import Squeal.PostgreSQL.Manipulation
26+import Squeal.PostgreSQL.Prettyprint
27+import Squeal.PostgreSQL.PQ
30+ :: (MonadBaseControl IO tx, MonadPQ schema tx)
33+transactionally mode tx = mask $ \restore -> do
35+ result <- restore tx `onException` rollback
40+ :: (MonadBaseControl IO tx, MonadPQ schema tx)
42+transactionally_ = transactionally (TransactionMode ReadCommitted ReadWrite)
44+begin :: MonadPQ schema tx => TransactionMode -> tx (Result '[])
45+begin mode = manipulate . UnsafeManipulation $
46+ "BEGIN" <+> renderTransactionMode mode <> ";"
48+commit :: MonadPQ schema tx => tx (Result '[])
49+commit = manipulate $ UnsafeManipulation "COMMIT;"
51+rollback :: MonadPQ schema tx => tx (Result '[])
52+rollback = manipulate $ UnsafeManipulation "ROLLBACK;"
54+data TransactionMode = TransactionMode
55+ { isolationLevel :: IsolationLevel
56+ , readWriteMode :: ReadWriteMode
57+ } deriving (Show, Eq)
59+renderTransactionMode :: TransactionMode -> ByteString
60+renderTransactionMode mode =
62+ <+> renderIsolationLevel (isolationLevel mode)
63+ <+> renderReadWriteMode (readWriteMode mode)
71+renderIsolationLevel :: IsolationLevel -> ByteString
72+renderIsolationLevel = \case
73+ Serializable -> "SERIALIZABLE"
74+ ReadCommitted -> "READ COMMITTED"
75+ RepeatableRead -> "REPEATABLE READ"
82+renderReadWriteMode :: ReadWriteMode -> ByteString
83+renderReadWriteMode = \case
84+ ReadWrite -> "READ WRITE"
85+ ReadOnly -> "READ ONLY"