@@ -108,9 +108,8 @@ import Blaze.ByteString.Builder (Builder, fromByteString, toByteString)
108import Blaze.ByteString.Builder.Char8 (fromChar)
108import Blaze.ByteString.Builder.Char8 (fromChar)
109import Control.Applicative ((<$>), pure)
109import Control.Applicative ((<$>), pure)
110import Control.Concurrent.MVar
110import Control.Concurrent.MVar
111−import Control.Exception (Exception, bracket, onException, throw, throwIO, finally)
111+import Control.Exception (Exception, onException, throw, throwIO, finally)
112import Control.Monad (foldM)
112import Control.Monad (foldM)
113−import Control.Monad.Fix (fix)
114import Data.ByteString (ByteString)
113import Data.ByteString (ByteString)
115import Data.Char(ord)
114import Data.Char(ord)
116import Data.Int (Int64)
115import Data.Int (Int64)
@@ -119,6 +118,7 @@ import Data.List (intersperse)
119import Data.Monoid (mappend, mconcat)
118import Data.Monoid (mappend, mconcat)
120import Data.Typeable (Typeable)
119import Data.Typeable (Typeable)
121import Database.PostgreSQL.Simple.BuiltinTypes (oid2builtin, builtin2typname)
120import Database.PostgreSQL.Simple.BuiltinTypes (oid2builtin, builtin2typname)
121+import Database.PostgreSQL.Simple.Compat (mask)
122import Database.PostgreSQL.Simple.Param (Action(..), inQuotes)
122import Database.PostgreSQL.Simple.Param (Action(..), inQuotes)
123import Database.PostgreSQL.Simple.QueryParams (QueryParams(..))
123import Database.PostgreSQL.Simple.QueryParams (QueryParams(..))
124import Database.PostgreSQL.Simple.Result (ResultError(..))
124import Database.PostgreSQL.Simple.Result (ResultError(..))
@@ -194,6 +194,7 @@ formatMany conn q@(Query template) qs = do
194 \([^?]*)$"
194 \([^?]*)$"
195 [caseless]
195 [caseless]
197+escapeStringConn :: Connection -> ByteString -> IO (Maybe ByteString)
197escapeStringConn conn s = withConnection conn $ \c -> do
198escapeStringConn conn s = withConnection conn $ \c -> do
198 PQ.escapeStringConn c s
199 PQ.escapeStringConn c s
@@ -241,7 +242,7 @@ executeMany conn q qs = do
241 finishExecute conn q result
242 finishExecute conn q result
243finishExecute :: Connection -> Query -> PQ.Result -> IO Int64
244finishExecute :: Connection -> Query -> PQ.Result -> IO Int64
244−finishExecute conn q result = do
245+finishExecute _conn q result = do
245 status <- PQ.resultStatus result
246 status <- PQ.resultStatus result
246 case status of
247 case status of
247 PQ.CommandOk -> do
248 PQ.CommandOk -> do
@@ -343,6 +344,7 @@ data FoldOptions
343 transactionMode :: !TransactionMode
344 transactionMode :: !TransactionMode
347+defaultFoldOptions :: FoldOptions
346defaultFoldOptions = FoldOptions {
348defaultFoldOptions = FoldOptions {
347 fetchQuantity = Automatic,
349 fetchQuantity = Automatic,
348 transactionMode = TransactionMode ReadCommitted ReadOnly
350 transactionMode = TransactionMode ReadCommitted ReadOnly
@@ -532,11 +534,12 @@ withTransactionLevel lvl
533-- | Execute an action inside a SQL transaction with a given transaction mode.
535-- | Execute an action inside a SQL transaction with a given transaction mode.
534withTransactionMode :: TransactionMode -> Connection -> IO a -> IO a
536withTransactionMode :: TransactionMode -> Connection -> IO a -> IO a
535−withTransactionMode mode conn act = do
537+withTransactionMode mode conn act =
538+ mask $ \restore -> do
536− beginMode mode conn
539+ beginMode mode conn
537− r <- act `onException` rollback conn
540+ r <- restore act `onException` rollback conn
538− commit conn
541+ commit conn
539− return r
542+ return r
541-- | Rollback a transaction.
544-- | Rollback a transaction.
542rollback :: Connection -> IO ()
545rollback :: Connection -> IO ()
@@ -557,7 +560,8 @@ beginLevel lvl = beginMode defaultTransactionMode { isolationLevel = lvl }
557-- | Begin a transaction with a given transaction mode
560-- | Begin a transaction with a given transaction mode
558beginMode :: TransactionMode -> Connection -> IO ()
561beginMode :: TransactionMode -> Connection -> IO ()
559beginMode mode conn = do
562beginMode mode conn = do
560− execute_ conn $! case mode of
563+ _ <- execute_ conn $!
561 TransactionMode ReadCommitted ReadWrite ->
565 TransactionMode ReadCommitted ReadWrite ->
563 TransactionMode ReadCommitted ReadOnly ->
567 TransactionMode ReadCommitted ReadOnly ->