git.iko.soy/typeable/postgresql-simple
on master help sign in
Merge pull request #13 from joeyadams/master
fdf85c4Leon P Smith
postgresql-simple.cabal+5
@@ -31,6 +31,9 @@ Library
31-- Other-modules:
31-- Other-modules:
32 Database.PostgreSQL.Simple.Internal
32 Database.PostgreSQL.Simple.Internal
33
33
34+ Other-modules:
35+ Database.PostgreSQL.Simple.Compat
36+
34 Build-depends:
37 Build-depends:
35 attoparsec >= 0.8.5.3,
38 attoparsec >= 0.8.5.3,
36 base < 5,
39 base < 5,
@@ -46,6 +49,8 @@ Library
46 text >= 0.11.1,
49 text >= 0.11.1,
47 time
50 time
48
51
52+ ghc-options: -Wall -fno-warn-name-shadowing
53+
49source-repository head
54source-repository head
50 type: git
55 type: git
51 location: http://github.com/lpsmith/postgresql-simple
56 location: http://github.com/lpsmith/postgresql-simple
src/Database/PostgreSQL/Simple.hs+13−9
@@ -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]
196
196
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
199
200
@@ -241,7 +242,7 @@ executeMany conn q qs = do
241 finishExecute conn q result
242 finishExecute conn q result
242
243
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
344 }
345 }
345
346
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
532
534
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
540
543
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 $!
564+ case mode of
561 TransactionMode ReadCommitted ReadWrite ->
565 TransactionMode ReadCommitted ReadWrite ->
562 "BEGIN"
566 "BEGIN"
563 TransactionMode ReadCommitted ReadOnly ->
567 TransactionMode ReadCommitted 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/Internal.hs+1
@@ -195,6 +195,7 @@ exec conn sql =
195 Just res -> do
195 Just res -> do
196 return res
196 return res
197
197
198+disconnectedError :: SqlError
198disconnectedError = SqlError {
199disconnectedError = SqlError {
199 sqlNativeError = -1,
200 sqlNativeError = -1,
200 sqlErrorMsg = "connection disconnected",
201 sqlErrorMsg = "connection disconnected",
src/Database/PostgreSQL/Simple/LargeObjects.hs−1
@@ -36,7 +36,6 @@ import qualified Data.ByteString as B
36import Database.PostgreSQL.LibPQ (Oid(..),LoFd(..))
36import Database.PostgreSQL.LibPQ (Oid(..),LoFd(..))
37import qualified Database.PostgreSQL.LibPQ as PQ
37import qualified Database.PostgreSQL.LibPQ as PQ
38import Database.PostgreSQL.Simple.Internal
38import Database.PostgreSQL.Simple.Internal
39−import Foreign.C.Types (CInt)
40import System.IO (IOMode(..),SeekMode(..))
39import System.IO (IOMode(..),SeekMode(..))
41
40
42liftPQ :: B.ByteString -> Connection -> (PQ.Connection -> IO (Maybe a)) -> IO a
41liftPQ :: 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
src/Database/PostgreSQL/Simple/QueryResults.hs+2−2
@@ -24,14 +24,13 @@ module Database.PostgreSQL.Simple.QueryResults
24 ) where
24 ) where
25
25
26import Control.Applicative (Applicative(..), (<$>))
26import Control.Applicative (Applicative(..), (<$>))
27−import Control.Exception (SomeException(..), throw)
27+import Control.Exception (SomeException(..))
28import Data.ByteString (ByteString)
28import Data.ByteString (ByteString)
29import qualified Data.ByteString.Char8 as B
29import qualified Data.ByteString.Char8 as B
30import Data.Either()
30import Data.Either()
31import Database.PostgreSQL.Simple.Internal
31import Database.PostgreSQL.Simple.Internal
32import Database.PostgreSQL.Simple.Result (ResultError(..), Result(..))
32import Database.PostgreSQL.Simple.Result (ResultError(..), Result(..))
33import Database.PostgreSQL.Simple.Types (Only(..))
33import Database.PostgreSQL.Simple.Types (Only(..))
34−import qualified Database.PostgreSQL.LibPQ as LibPQ (Result)
35
34
36-- | A collection type that can be converted from a list of strings.
35-- | A collection type that can be converted from a list of strings.
37--
36--
@@ -212,6 +211,7 @@ instance (Result a, Result b, Result c, Result d, Result e, Result f,
212 return (a,b,c,d,e,f,g,h,i,j)
211 return (a,b,c,d,e,f,g,h,i,j)
213 convertResults fs vs = convertError fs vs 10
212 convertResults fs vs = convertError fs vs 10
214
213
214+(<$!>) :: Functor f => (a -> b) -> f a -> f b
215f <$!> (!x) = f <$> x
215f <$!> (!x) = f <$> x
216infixl 4 <$!>
216infixl 4 <$!>
217
217
src/Database/PostgreSQL/Simple/Result.hs+4−5
@@ -32,7 +32,7 @@ module Database.PostgreSQL.Simple.Result
32#include "MachDeps.h"
32#include "MachDeps.h"
33
33
34import Control.Applicative (Applicative, (<$>), (<*>), (<*), pure)
34import Control.Applicative (Applicative, (<$>), (<*>), (<*), pure)
35−import Control.Exception (SomeException(..), Exception, throw)
35+import Control.Exception (SomeException(..), Exception)
36import Data.Attoparsec.Char8 hiding (Result)
36import Data.Attoparsec.Char8 hiding (Result)
37import Data.Bits ((.&.), (.|.), shiftL)
37import Data.Bits ((.&.), (.|.), shiftL)
38import Data.ByteString (ByteString)
38import Data.ByteString (ByteString)
@@ -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.Types (Binary(..), Null(..))
51import Database.PostgreSQL.Simple.Types (Binary(..), Null(..))
53import qualified Database.PostgreSQL.LibPQ as PQ
52import qualified Database.PostgreSQL.LibPQ as PQ
@@ -58,7 +57,6 @@ import qualified Data.ByteString.Char8 as B8
58import qualified Data.ByteString.Lazy as LB
57import qualified Data.ByteString.Lazy as LB
59import qualified Data.Text as ST
58import qualified Data.Text as ST
60import qualified Data.Text.Encoding as ST
59import qualified Data.Text.Encoding as ST
61−import qualified Data.Text.Encoding.Error (UnicodeException)
62import qualified Data.Text.Lazy as LT
60import qualified Data.Text.Lazy as LT
63
61
64-- | Exception thrown if conversion from a SQL value to a Haskell
62-- | Exception thrown if conversion from a SQL value to a Haskell
@@ -140,6 +138,7 @@ instance Result (Ratio Integer) where
140 convert = atto ok rational
138 convert = atto ok rational
141 where ok = mkCompats [Float4,Float8,Int2,Int4,Numeric]
139 where ok = mkCompats [Float4,Float8,Int2,Int4,Numeric]
142
140
141+unBinary :: Binary t -> t
143unBinary (Binary x) = x
142unBinary (Binary x) = x
144
143
145instance Result SB.ByteString where
144instance Result SB.ByteString where
@@ -228,7 +227,7 @@ mkCompat = Compat . shiftL 1 . fromEnum
228compat :: Compat -> Compat -> Bool
227compat :: Compat -> Compat -> Bool
229compat (Compat a) (Compat b) = a .&. b /= 0
228compat (Compat a) (Compat b) = a .&. b /= 0
230
229
231−okText, okText', ok16, ok32, ok64 :: Compat
230+okText, okText', okBinary, ok16, ok32, ok64, okInt :: Compat
232okText = mkCompats [Name,Text,Char,Bpchar,Varchar]
231okText = mkCompats [Name,Text,Char,Bpchar,Varchar]
233okText' = mkCompats [Name,Text,Char,Bpchar,Varchar,Unknown]
232okText' = mkCompats [Name,Text,Char,Bpchar,Varchar,Unknown]
234okBinary = mkCompats [Bytea]
233okBinary = mkCompats [Bytea]