@@ -108,7 +108,7 @@ 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)
113import Control.Monad.Fix (fix)
113import Control.Monad.Fix (fix)
114import Data.ByteString (ByteString)
114import Data.ByteString (ByteString)
@@ -119,6 +119,7 @@ import Data.List (intersperse)
119import Data.Monoid (mappend, mconcat)
119import Data.Monoid (mappend, mconcat)
120import Data.Typeable (Typeable)
120import Data.Typeable (Typeable)
121import Database.PostgreSQL.Simple.BuiltinTypes (oid2builtin, builtin2typname)
121import Database.PostgreSQL.Simple.BuiltinTypes (oid2builtin, builtin2typname)
122+import Database.PostgreSQL.Simple.Compat (mask)
122import Database.PostgreSQL.Simple.Param (Action(..), inQuotes)
123import Database.PostgreSQL.Simple.Param (Action(..), inQuotes)
123import Database.PostgreSQL.Simple.QueryParams (QueryParams(..))
124import Database.PostgreSQL.Simple.QueryParams (QueryParams(..))
124import Database.PostgreSQL.Simple.Result (ResultError(..))
125import Database.PostgreSQL.Simple.Result (ResultError(..))
@@ -532,11 +533,12 @@ withTransactionLevel lvl
533-- | Execute an action inside a SQL transaction with a given transaction mode.
534-- | Execute an action inside a SQL transaction with a given transaction mode.
534withTransactionMode :: TransactionMode -> Connection -> IO a -> IO a
535withTransactionMode :: TransactionMode -> Connection -> IO a -> IO a
535−withTransactionMode mode conn act = do
536+withTransactionMode mode conn act =
537+ mask $ \restore -> do
536− beginMode mode conn
538+ beginMode mode conn
537− r <- act `onException` rollback conn
539+ r <- restore act `onException` rollback conn
538− commit conn
540+ commit conn
539− return r
541+ return r
541-- | Rollback a transaction.
543-- | Rollback a transaction.
542rollback :: Connection -> IO ()
544rollback :: Connection -> IO ()