@@ -112,7 +112,6 @@ import Control.Concurrent.MVar
112import Control.Exception
112import Control.Exception
113 ( Exception, bracket, onException, throw, throwIO, finally )
113 ( Exception, bracket, onException, throw, throwIO, finally )
114import Control.Monad (foldM)
114import Control.Monad (foldM)
115−import Control.Monad.Fix (fix)
116import Data.ByteString (ByteString)
115import Data.ByteString (ByteString)
117import Data.Char(ord)
116import Data.Char(ord)
118import Data.Int (Int64)
117import Data.Int (Int64)
@@ -203,6 +202,7 @@ formatMany conn q@(Query template) qs = do
203 \([^?]*)$"
202 \([^?]*)$"
204 [caseless]
203 [caseless]
205+escapeStringConn :: Connection -> ByteString -> IO (Maybe ByteString)
206escapeStringConn conn s = withConnection conn $ \c -> do
206escapeStringConn conn s = withConnection conn $ \c -> do
207 PQ.escapeStringConn c s
207 PQ.escapeStringConn c s
@@ -250,7 +250,7 @@ executeMany conn q qs = do
250 finishExecute conn q result
250 finishExecute conn q result
252finishExecute :: Connection -> Query -> PQ.Result -> IO Int64
252finishExecute :: Connection -> Query -> PQ.Result -> IO Int64
253−finishExecute conn q result = do
253+finishExecute _conn q result = do
254 status <- PQ.resultStatus result
254 status <- PQ.resultStatus result
255 case status of
255 case status of
256 PQ.CommandOk -> do
256 PQ.CommandOk -> do
@@ -352,6 +352,7 @@ data FoldOptions
352 transactionMode :: !TransactionMode
352 transactionMode :: !TransactionMode
355+defaultFoldOptions :: FoldOptions
355defaultFoldOptions = FoldOptions {
356defaultFoldOptions = FoldOptions {
356 fetchQuantity = Automatic,
357 fetchQuantity = Automatic,
357 transactionMode = TransactionMode ReadCommitted ReadOnly
358 transactionMode = TransactionMode ReadCommitted ReadOnly
@@ -569,11 +570,12 @@ withTransactionLevel lvl
570-- | Execute an action inside a SQL transaction with a given transaction mode.
571-- | Execute an action inside a SQL transaction with a given transaction mode.
571withTransactionMode :: TransactionMode -> Connection -> IO a -> IO a
572withTransactionMode :: TransactionMode -> Connection -> IO a -> IO a
572−withTransactionMode mode conn act = do
573+withTransactionMode mode conn act =
574+ mask $ \restore -> do
573− beginMode mode conn
575+ beginMode mode conn
574− r <- act `onException` rollback conn
576+ r <- restore act `onException` rollback conn
575− commit conn
577+ commit conn
576− return r
578+ return r
578-- | Rollback a transaction.
580-- | Rollback a transaction.
579rollback :: Connection -> IO ()
581rollback :: Connection -> IO ()
@@ -594,7 +596,8 @@ beginLevel lvl = beginMode defaultTransactionMode { isolationLevel = lvl }
594-- | Begin a transaction with a given transaction mode
596-- | Begin a transaction with a given transaction mode
595beginMode :: TransactionMode -> Connection -> IO ()
597beginMode :: TransactionMode -> Connection -> IO ()
596beginMode mode conn = do
598beginMode mode conn = do
597− execute_ conn $! case mode of
599+ _ <- execute_ conn $!
598 TransactionMode DefaultIsolationLevel ReadWrite ->
601 TransactionMode DefaultIsolationLevel ReadWrite ->
600 TransactionMode DefaultIsolationLevel ReadOnly ->
603 TransactionMode DefaultIsolationLevel ReadOnly ->