@@ -30,17 +30,13 @@ module Squeal.PostgreSQL.Transaction
30 , defaultMode
30 , defaultMode
31 , longRunningMode
31 , longRunningMode
32 , IsolationLevel (..)
32 , IsolationLevel (..)
33− , renderIsolationLevel
34 , AccessMode (..)
33 , AccessMode (..)
36 , DeferrableMode (..)
34 , DeferrableMode (..)
37− , renderDeferrableMode
40import Control.Exception.Lifted
37import Control.Exception.Lifted
41import Control.Monad.Base
38import Control.Monad.Base
42import Control.Monad.Trans.Control
39import Control.Monad.Trans.Control
43−import Data.ByteString
44import Generics.SOP
40import Generics.SOP
46import qualified Database.PostgreSQL.LibPQ as LibPQ
42import qualified Database.PostgreSQL.LibPQ as LibPQ
@@ -72,7 +68,7 @@ transactionally_ = transactionally defaultMode
72-- | @BEGIN@ a transaction.
68-- | @BEGIN@ a transaction.
73begin :: MonadPQ schemas tx => TransactionMode -> tx (K Result ('[] :: RowType))
69begin :: MonadPQ schemas tx => TransactionMode -> tx (K Result ('[] :: RowType))
74begin mode = manipulate . UnsafeManipulation $
70begin mode = manipulate . UnsafeManipulation $
75− "BEGIN" <+> renderTransactionMode mode <> ";"
71+ "BEGIN" <+> renderSQL mode <> ";"
77-- | @COMMIT@ a schema invariant transaction.
73-- | @COMMIT@ a schema invariant transaction.
78commit :: MonadPQ schemas tx => tx (K Result ('[] :: RowType))
74commit :: MonadPQ schemas tx => tx (K Result ('[] :: RowType))
@@ -90,7 +86,7 @@ transactionallySchema
90 -> PQ schemas0 schemas1 io x
86 -> PQ schemas0 schemas1 io x
91transactionallySchema mode u = PQ $ \ conn -> mask $ \ restore -> do
87transactionallySchema mode u = PQ $ \ conn -> mask $ \ restore -> do
92 _ <- liftBase . LibPQ.exec (unK conn) $
88 _ <- liftBase . LibPQ.exec (unK conn) $
93− "BEGIN" <+> renderTransactionMode mode <> ";"
89+ "BEGIN" <+> renderSQL mode <> ";"
94 x <- restore (unPQ u conn)
90 x <- restore (unPQ u conn)
95 `onException` (liftBase (LibPQ.exec (unK conn) "ROLLBACK"))
91 `onException` (liftBase (LibPQ.exec (unK conn) "ROLLBACK"))
96 _ <- liftBase $ LibPQ.exec (unK conn) "COMMIT"
92 _ <- liftBase $ LibPQ.exec (unK conn) "COMMIT"
@@ -123,12 +119,12 @@ longRunningMode :: TransactionMode
123longRunningMode = TransactionMode Serializable ReadOnly Deferrable
119longRunningMode = TransactionMode Serializable ReadOnly Deferrable
125-- | Render a `TransactionMode`.
121-- | Render a `TransactionMode`.
126−renderTransactionMode :: TransactionMode -> ByteString
122+instance RenderSQL TransactionMode where
127−renderTransactionMode mode =
123+ renderSQL mode =
128− "ISOLATION LEVEL"
124+ "ISOLATION LEVEL"
129− <+> renderIsolationLevel (isolationLevel mode)
125+ <+> renderSQL (isolationLevel mode)
130− <+> renderAccessMode (accessMode mode)
126+ <+> renderSQL (accessMode mode)
131− <+> renderDeferrableMode (deferrableMode mode)
127+ <+> renderSQL (deferrableMode mode)
133-- | The SQL standard defines four levels of transaction isolation.
129-- | The SQL standard defines four levels of transaction isolation.
134-- The most strict is `Serializable`, which is defined by the standard in a paragraph
130-- The most strict is `Serializable`, which is defined by the standard in a paragraph
@@ -179,12 +175,12 @@ data IsolationLevel
179 deriving (Show, Eq)
175 deriving (Show, Eq)
181-- | Render an `IsolationLevel`.
177-- | Render an `IsolationLevel`.
182−renderIsolationLevel :: IsolationLevel -> ByteString
178+instance RenderSQL IsolationLevel where
183−renderIsolationLevel = \case
179+ renderSQL = \case
184− Serializable -> "SERIALIZABLE"
180+ Serializable -> "SERIALIZABLE"
185− ReadCommitted -> "READ COMMITTED"
181+ ReadCommitted -> "READ COMMITTED"
186− ReadUncommitted -> "READ UNCOMMITTED"
182+ ReadUncommitted -> "READ UNCOMMITTED"
187− RepeatableRead -> "REPEATABLE READ"
183+ RepeatableRead -> "REPEATABLE READ"
189-- | The transaction access mode determines whether the transaction is `ReadWrite` or `ReadOnly`.
185-- | The transaction access mode determines whether the transaction is `ReadWrite` or `ReadOnly`.
190-- `ReadWrite` is the default. When a transaction is `ReadOnly`,
186-- `ReadWrite` is the default. When a transaction is `ReadOnly`,
@@ -201,10 +197,10 @@ data AccessMode
201 deriving (Show, Eq)
197 deriving (Show, Eq)
203-- | Render an `AccessMode`.
199-- | Render an `AccessMode`.
204−renderAccessMode :: AccessMode -> ByteString
200+instance RenderSQL AccessMode where
205−renderAccessMode = \case
201+ renderSQL = \case
206− ReadWrite -> "READ WRITE"
202+ ReadWrite -> "READ WRITE"
207− ReadOnly -> "READ ONLY"
203+ ReadOnly -> "READ ONLY"
209-- | The `Deferrable` transaction property has no effect
205-- | The `Deferrable` transaction property has no effect
210-- unless the transaction is also `Serializable` and `ReadOnly`.
206-- unless the transaction is also `Serializable` and `ReadOnly`.
@@ -220,7 +216,7 @@ data DeferrableMode
220 deriving (Show, Eq)
216 deriving (Show, Eq)
222-- | Render a `DeferrableMode`.
218-- | Render a `DeferrableMode`.
223−renderDeferrableMode :: DeferrableMode -> ByteString
219+instance RenderSQL DeferrableMode where
224−renderDeferrableMode = \case
220+ renderSQL = \case
225− Deferrable -> "DEFERRABLE"
221+ Deferrable -> "DEFERRABLE"
226− NotDeferrable -> "NOT DEFERRABLE"
222+ NotDeferrable -> "NOT DEFERRABLE"