@@ -28,7 +28,8 @@ module Squeal.PostgreSQL.Transaction
30 , rollback
30 , rollback
31− , rollbackOrCommit
31+ , transactionallySchema
32+ , transactionallySchema_
32 -- * Transaction Mode
33 -- * Transaction Mode
33 , TransactionMode (..)
34 , TransactionMode (..)
34 , defaultMode
35 , defaultMode
@@ -45,11 +46,13 @@ import Control.Exception.Lifted
45import Control.Monad.Base
46import Control.Monad.Base
46import Control.Monad.Trans.Control
47import Control.Monad.Trans.Control
47import Data.ByteString
48import Data.ByteString
48import Data.Monoid
50import Data.Monoid
49import Generics.SOP
51import Generics.SOP
51import qualified Database.PostgreSQL.LibPQ as LibPQ
53import qualified Database.PostgreSQL.LibPQ as LibPQ
55+import Squeal.PostgreSQL.Definition
53import Squeal.PostgreSQL.Manipulation
56import Squeal.PostgreSQL.Manipulation
54import Squeal.PostgreSQL.Prettyprint
57import Squeal.PostgreSQL.Prettyprint
55import Squeal.PostgreSQL.PQ
58import Squeal.PostgreSQL.PQ
@@ -87,17 +90,26 @@ commit = manipulate $ UnsafeManipulation "COMMIT;"
87rollback :: MonadPQ schema tx => tx (K Result NilRelation)
90rollback :: MonadPQ schema tx => tx (K Result NilRelation)
88rollback = manipulate $ UnsafeManipulation "ROLLBACK;"
91rollback = manipulate $ UnsafeManipulation "ROLLBACK;"
90−-- | @ROLLBACK@ a transaction upon `Exception`, otherwise @COMMIT@.
93+-- | Run a schema changing computation `transactionallySchema`.
91−rollbackOrCommit
94+transactionallySchema
92− :: MonadBaseControl IO io
95+ :: MonadBaseControl IO io
93− => PQ schema0 schema1 io x
97+ -> PQ schema0 schema1 io x
94 -> PQ schema0 schema1 io x
98 -> PQ schema0 schema1 io x
95−rollbackOrCommit u = PQ $ \ conn -> mask $ \ restore -> do
99+transactionallySchema mode u = PQ $ \ conn -> mask $ \ restore -> do
100+ liftBase (LibPQ.exec (unK conn) ("BEGIN" <+> renderTransactionMode mode <> ";"))
96 x <- restore (unPQ u conn)
101 x <- restore (unPQ u conn)
97 `onException` (liftBase (LibPQ.exec (unK conn) "ROLLBACK"))
102 `onException` (liftBase (LibPQ.exec (unK conn) "ROLLBACK"))
98 _ <- liftBase (LibPQ.exec (unK conn) "COMMIT")
103 _ <- liftBase (LibPQ.exec (unK conn) "COMMIT")
106+-- | Run a schema changing computation `transactionallySchema_` in `DefaultMode`.
107+transactionallySchema_
108+ :: MonadBaseControl IO io
109+ => PQ schema0 schema1 io x
110+ -> PQ schema0 schema1 io x
111+transactionallySchema_ = transactionallySchema defaultMode
101-- | The available transaction characteristics are the transaction `IsolationLevel`,
113-- | The available transaction characteristics are the transaction `IsolationLevel`,
102-- the transaction access mode (`ReadWrite` or `ReadOnly`), and the `DeferrableMode`.
114-- the transaction access mode (`ReadWrite` or `ReadOnly`), and the `DeferrableMode`.
103data TransactionMode = TransactionMode
115data TransactionMode = TransactionMode