git.iko.soy/typeable/postgresql-simple
on master help sign in
Merge branch 'master' of github.com:lpsmith/postgresql-simple into 0.1
e93b346Leon P Smith
postgresql-simple.cabal+5
@@ -32,6 +32,9 @@ Library
32-- Other-modules:
32-- Other-modules:
33 Database.PostgreSQL.Simple.Internal
33 Database.PostgreSQL.Simple.Internal
34
34
35+ Other-modules:
36+ Database.PostgreSQL.Simple.Compat
37+
35 Build-depends:
38 Build-depends:
36 attoparsec >= 0.8.5.3,
39 attoparsec >= 0.8.5.3,
37 base < 5,
40 base < 5,
@@ -51,6 +54,8 @@ Library
51
54
52 extensions: DoAndIfThenElse, OverloadedStrings, BangPatterns, ViewPatterns
55 extensions: DoAndIfThenElse, OverloadedStrings, BangPatterns, ViewPatterns
53
56
57+ ghc-options: -Wall -fno-warn-name-shadowing
58+
54source-repository head
59source-repository head
55 type: git
60 type: git
56 location: http://github.com/lpsmith/postgresql-simple
61 location: http://github.com/lpsmith/postgresql-simple
src/Database/PostgreSQL/Simple.hs+11−8
@@ -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
204
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
208
208
@@ -250,7 +250,7 @@ executeMany conn q qs = do
250 finishExecute conn q result
250 finishExecute conn q result
251
251
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
353 }
353 }
354
354
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
569
570
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
577
579
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 $!
600+ case mode of
598 TransactionMode DefaultIsolationLevel ReadWrite ->
601 TransactionMode DefaultIsolationLevel ReadWrite ->
599 "BEGIN"
602 "BEGIN"
600 TransactionMode DefaultIsolationLevel ReadOnly ->
603 TransactionMode DefaultIsolationLevel ReadOnly ->
src/Database/PostgreSQL/Simple/Compat.hsnew file+25
@@ -0,0 +1,25 @@
1+{-# LANGUAGE CPP #-}
2+-- | This is a module of its own, because it uses the CPP extension, which
3+-- doesn't play well with the regex string literal in Simple.hs .
4+module Database.PostgreSQL.Simple.Compat
5+ ( mask
6+ ) where
7+
8+import qualified Control.Exception as E
9+
10+-- | Like 'E.mask', but backported to base before version 4.3.0.
11+--
12+-- Note that the restore callback is monomorphic, unlike in 'E.mask'. This
13+-- could be fixed by changing the type signature, but it would require us to
14+-- enable the RankNTypes extension (since 'E.mask' has a rank-3 type). The
15+-- 'withTransactionMode' function calls the restore callback only once, so we
16+-- don't need that polymorphism.
17+mask :: ((IO a -> IO a) -> IO b) -> IO b
18+#if MIN_VERSION_base(4,3,0)
19+mask io = E.mask $ \restore -> io restore
20+#else
21+mask io = do
22+ b <- E.blocked
23+ E.block $ io $ \m -> if b then m else E.unblock m
24+#endif
25+{-# INLINE mask #-}
src/Database/PostgreSQL/Simple/FromField.hs+3−4
@@ -44,10 +44,9 @@ import Data.Time.Calendar (Day, fromGregorian)
44import Data.Time.Clock (UTCTime)
44import Data.Time.Clock (UTCTime)
45import Data.Time.Format (parseTime)
45import Data.Time.Format (parseTime)
46import Data.Time.LocalTime (TimeOfDay, makeTimeOfDayValid)
46import Data.Time.LocalTime (TimeOfDay, makeTimeOfDayValid)
47−import Data.Typeable (TypeRep, Typeable, typeOf)
47+import Data.Typeable (Typeable, typeOf)
48import Data.Word (Word64)
48import Data.Word (Word64)
49import Database.PostgreSQL.Simple.Internal
49import Database.PostgreSQL.Simple.Internal
50−import Database.PostgreSQL.Simple.Field (Field(..), RawResult(..))
51import Database.PostgreSQL.Simple.BuiltinTypes
50import Database.PostgreSQL.Simple.BuiltinTypes
52import Database.PostgreSQL.Simple.Ok
51import Database.PostgreSQL.Simple.Ok
53import Database.PostgreSQL.Simple.Types (Binary(..), Null(..))
52import Database.PostgreSQL.Simple.Types (Binary(..), Null(..))
@@ -59,7 +58,6 @@ import qualified Data.ByteString.Char8 as B8
59import qualified Data.ByteString.Lazy as LB
58import qualified Data.ByteString.Lazy as LB
60import qualified Data.Text as ST
59import qualified Data.Text as ST
61import qualified Data.Text.Encoding as ST
60import qualified Data.Text.Encoding as ST
62−import qualified Data.Text.Encoding.Error (UnicodeException)
63import qualified Data.Text.Lazy as LT
61import qualified Data.Text.Lazy as LT
64
62
65-- | Exception thrown if conversion from a SQL value to a Haskell
63-- | Exception thrown if conversion from a SQL value to a Haskell
@@ -139,6 +137,7 @@ instance FromField (Ratio Integer) where
139 fromField = atto ok rational
137 fromField = atto ok rational
140 where ok = mkCompats [Float4,Float8,Int2,Int4,Numeric]
138 where ok = mkCompats [Float4,Float8,Int2,Int4,Numeric]
141
139
140+unBinary :: Binary t -> t
142unBinary (Binary x) = x
141unBinary (Binary x) = x
143
142
144instance FromField SB.ByteString where
143instance FromField SB.ByteString where
@@ -224,7 +223,7 @@ mkCompat = Compat . shiftL 1 . fromEnum
224compat :: Compat -> Compat -> Bool
223compat :: Compat -> Compat -> Bool
225compat (Compat a) (Compat b) = a .&. b /= 0
224compat (Compat a) (Compat b) = a .&. b /= 0
226
225
227−okText, okText', ok16, ok32, ok64 :: Compat
226+okText, okText', okBinary, ok16, ok32, ok64, okInt :: Compat
228okText = mkCompats [Name,Text,Char,Bpchar,Varchar]
227okText = mkCompats [Name,Text,Char,Bpchar,Varchar]
229okText' = mkCompats [Name,Text,Char,Bpchar,Varchar,Unknown]
228okText' = mkCompats [Name,Text,Char,Bpchar,Varchar,Unknown]
230okBinary = mkCompats [Bytea]
229okBinary = mkCompats [Bytea]
src/Database/PostgreSQL/Simple/Internal.hs+1
@@ -198,6 +198,7 @@ exec conn sql =
198 Just res -> do
198 Just res -> do
199 return res
199 return res
200
200
201+disconnectedError :: SqlError
201disconnectedError = SqlError {
202disconnectedError = SqlError {
202 sqlNativeError = -1,
203 sqlNativeError = -1,
203 sqlErrorMsg = "connection disconnected",
204 sqlErrorMsg = "connection disconnected",
src/Database/PostgreSQL/Simple/LargeObjects.hs−1
@@ -34,7 +34,6 @@ import qualified Data.ByteString as B
34import Database.PostgreSQL.LibPQ (Oid(..),LoFd(..))
34import Database.PostgreSQL.LibPQ (Oid(..),LoFd(..))
35import qualified Database.PostgreSQL.LibPQ as PQ
35import qualified Database.PostgreSQL.LibPQ as PQ
36import Database.PostgreSQL.Simple.Internal
36import Database.PostgreSQL.Simple.Internal
37−import Foreign.C.Types (CInt)
38import System.IO (IOMode(..),SeekMode(..))
37import System.IO (IOMode(..),SeekMode(..))
39
38
40liftPQ :: B.ByteString -> Connection -> (PQ.Connection -> IO (Maybe a)) -> IO a
39liftPQ :: B.ByteString -> Connection -> (PQ.Connection -> IO (Maybe a)) -> IO a
src/Database/PostgreSQL/Simple/Notification.hs+1
@@ -29,6 +29,7 @@ data Notification = Notification
29 , notificationData :: B.ByteString
29 , notificationData :: B.ByteString
30 }
30 }
31
31
32+errfd :: String
32errfd = "Database.PostgreSQL.Simple.Notification.getNotification: \
33errfd = "Database.PostgreSQL.Simple.Notification.getNotification: \
33 \failed to fetch file descriptor"
34 \failed to fetch file descriptor"
34
35