@@ -30,17 +30,13 @@ module Squeal.PostgreSQL.Transaction
3030 , defaultMode
3131 , longRunningMode
3232 , IsolationLevel (..)
33− , renderIsolationLevel
3433 , AccessMode (..)
35− , renderAccessMode
3634 , DeferrableMode (..)
37− , renderDeferrableMode
3835 ) where
3936
4037import Control.Exception.Lifted
4138import Control.Monad.Base
4239import Control.Monad.Trans.Control
43−import Data.ByteString
4440import Generics.SOP
4541
4642import qualified Database.PostgreSQL.LibPQ as LibPQ
@@ -72,7 +68,7 @@ transactionally_ = transactionally defaultMode
7268-- | @BEGIN@ a transaction.
7369begin :: MonadPQ schemas tx => TransactionMode -> tx (K Result ('[] :: RowType))
7470begin mode = manipulate . UnsafeManipulation $
75− "BEGIN" <+> renderTransactionMode mode <> ";"
71+ "BEGIN" <+> renderSQL mode <> ";"
7672
7773-- | @COMMIT@ a schema invariant transaction.
7874commit :: MonadPQ schemas tx => tx (K Result ('[] :: RowType))
@@ -90,7 +86,7 @@ transactionallySchema
9086 -> PQ schemas0 schemas1 io x
9187transactionallySchema mode u = PQ $ \ conn -> mask $ \ restore -> do
9288 _ <- liftBase . LibPQ.exec (unK conn) $
93− "BEGIN" <+> renderTransactionMode mode <> ";"
89+ "BEGIN" <+> renderSQL mode <> ";"
9490 x <- restore (unPQ u conn)
9591 `onException` (liftBase (LibPQ.exec (unK conn) "ROLLBACK"))
9692 _ <- liftBase $ LibPQ.exec (unK conn) "COMMIT"
@@ -123,12 +119,12 @@ longRunningMode :: TransactionMode
123119longRunningMode = TransactionMode Serializable ReadOnly Deferrable
124120
125121-- | Render a `TransactionMode`.
126−renderTransactionMode :: TransactionMode -> ByteString
127−renderTransactionMode mode =
128− "ISOLATION LEVEL"
129− <+> renderIsolationLevel (isolationLevel mode)
130− <+> renderAccessMode (accessMode mode)
131− <+> renderDeferrableMode (deferrableMode mode)
122+instance RenderSQL TransactionMode where
123+ renderSQL mode =
124+ "ISOLATION LEVEL"
125+ <+> renderSQL (isolationLevel mode)
126+ <+> renderSQL (accessMode mode)
127+ <+> renderSQL (deferrableMode mode)
132128
133129-- | The SQL standard defines four levels of transaction isolation.
134130-- The most strict is `Serializable`, which is defined by the standard in a paragraph
@@ -179,12 +175,12 @@ data IsolationLevel
179175 deriving (Show, Eq)
180176
181177-- | Render an `IsolationLevel`.
182−renderIsolationLevel :: IsolationLevel -> ByteString
183−renderIsolationLevel = \case
184− Serializable -> "SERIALIZABLE"
185− ReadCommitted -> "READ COMMITTED"
186− ReadUncommitted -> "READ UNCOMMITTED"
187− RepeatableRead -> "REPEATABLE READ"
178+instance RenderSQL IsolationLevel where
179+ renderSQL = \case
180+ Serializable -> "SERIALIZABLE"
181+ ReadCommitted -> "READ COMMITTED"
182+ ReadUncommitted -> "READ UNCOMMITTED"
183+ RepeatableRead -> "REPEATABLE READ"
188184
189185-- | The transaction access mode determines whether the transaction is `ReadWrite` or `ReadOnly`.
190186-- `ReadWrite` is the default. When a transaction is `ReadOnly`,
@@ -201,10 +197,10 @@ data AccessMode
201197 deriving (Show, Eq)
202198
203199-- | Render an `AccessMode`.
204−renderAccessMode :: AccessMode -> ByteString
205−renderAccessMode = \case
206− ReadWrite -> "READ WRITE"
207− ReadOnly -> "READ ONLY"
200+instance RenderSQL AccessMode where
201+ renderSQL = \case
202+ ReadWrite -> "READ WRITE"
203+ ReadOnly -> "READ ONLY"
208204
209205-- | The `Deferrable` transaction property has no effect
210206-- unless the transaction is also `Serializable` and `ReadOnly`.
@@ -220,7 +216,7 @@ data DeferrableMode
220216 deriving (Show, Eq)
221217
222218-- | Render a `DeferrableMode`.
223−renderDeferrableMode :: DeferrableMode -> ByteString
224−renderDeferrableMode = \case
225− Deferrable -> "DEFERRABLE"
226− NotDeferrable -> "NOT DEFERRABLE"
219+instance RenderSQL DeferrableMode where
220+ renderSQL = \case
221+ Deferrable -> "DEFERRABLE"
222+ NotDeferrable -> "NOT DEFERRABLE"