@@ -108,9 +108,8 @@ import Blaze.ByteString.Builder (Builder, fromByteString, toByteString)
108108import Blaze.ByteString.Builder.Char8 (fromChar)
109109import Control.Applicative ((<$>), pure)
110110import Control.Concurrent.MVar
111−import Control.Exception (Exception, bracket, onException, throw, throwIO, finally)
111+import Control.Exception (Exception, onException, throw, throwIO, finally)
112112import Control.Monad (foldM)
113−import Control.Monad.Fix (fix)
114113import Data.ByteString (ByteString)
115114import Data.Char(ord)
116115import Data.Int (Int64)
@@ -119,6 +118,7 @@ import Data.List (intersperse)
119118import Data.Monoid (mappend, mconcat)
120119import Data.Typeable (Typeable)
121120import Database.PostgreSQL.Simple.BuiltinTypes (oid2builtin, builtin2typname)
121+import Database.PostgreSQL.Simple.Compat (mask)
122122import Database.PostgreSQL.Simple.Param (Action(..), inQuotes)
123123import Database.PostgreSQL.Simple.QueryParams (QueryParams(..))
124124import Database.PostgreSQL.Simple.Result (ResultError(..))
@@ -194,6 +194,7 @@ formatMany conn q@(Query template) qs = do
194194 \([^?]*)$"
195195 [caseless]
196196
197+escapeStringConn :: Connection -> ByteString -> IO (Maybe ByteString)
197198escapeStringConn conn s = withConnection conn $ \c -> do
198199 PQ.escapeStringConn c s
199200
@@ -241,7 +242,7 @@ executeMany conn q qs = do
241242 finishExecute conn q result
242243
243244finishExecute :: Connection -> Query -> PQ.Result -> IO Int64
244−finishExecute conn q result = do
245+finishExecute _conn q result = do
245246 status <- PQ.resultStatus result
246247 case status of
247248 PQ.CommandOk -> do
@@ -343,6 +344,7 @@ data FoldOptions
343344 transactionMode :: !TransactionMode
344345 }
345346
347+defaultFoldOptions :: FoldOptions
346348defaultFoldOptions = FoldOptions {
347349 fetchQuantity = Automatic,
348350 transactionMode = TransactionMode ReadCommitted ReadOnly
@@ -532,11 +534,12 @@ withTransactionLevel lvl
532534
533535-- | Execute an action inside a SQL transaction with a given transaction mode.
534536withTransactionMode :: TransactionMode -> Connection -> IO a -> IO a
535−withTransactionMode mode conn act = do
536− beginMode mode conn
537− r <- act `onException` rollback conn
538− commit conn
539− return r
537+withTransactionMode mode conn act =
538+ mask $ \restore -> do
539+ beginMode mode conn
540+ r <- restore act `onException` rollback conn
541+ commit conn
542+ return r
540543
541544-- | Rollback a transaction.
542545rollback :: Connection -> IO ()
@@ -557,7 +560,8 @@ beginLevel lvl = beginMode defaultTransactionMode { isolationLevel = lvl }
557560-- | Begin a transaction with a given transaction mode
558561beginMode :: TransactionMode -> Connection -> IO ()
559562beginMode mode conn = do
560− execute_ conn $! case mode of
563+ _ <- execute_ conn $!
564+ case mode of
561565 TransactionMode ReadCommitted ReadWrite ->
562566 "BEGIN"
563567 TransactionMode ReadCommitted ReadOnly ->