git.iko.soy/typeable/postgresql-simple
on master help sign in
Switch from unsafePerformIO to unsafeDupablePerformIO
4194297Leon P Smith
src/Database/PostgreSQL/Simple/Compat.hs+10
@@ -4,11 +4,21 @@
4module Database.PostgreSQL.Simple.Compat
4module Database.PostgreSQL.Simple.Compat
5 ( mask
5 ( mask
6 , (<>)
6 , (<>)
7+ , unsafeDupablePerformIO
7 ) where
8 ) where
8
9
9import qualified Control.Exception as E
10import qualified Control.Exception as E
10import Data.Monoid
11import Data.Monoid
11
12
13+#if __GLASGOW_HASKELL__ >= 702
14+import System.IO.Unsafe (unsafeDupablePerformIO)
15+#elif __GLASGOW_HASKELL__ >= 611
16+import GHC.IO (unsafeDupablePerformIO)
17+#else
18+import GHC.IOBase (unsafeDupablePerformIO)
19+#endif
20+
21+
12-- | Like 'E.mask', but backported to base before version 4.3.0.
22-- | Like 'E.mask', but backported to base before version 4.3.0.
13--
23--
14-- Note that the restore callback is monomorphic, unlike in 'E.mask'. This
24-- Note that the restore callback is monomorphic, unlike in 'E.mask'. This
src/Database/PostgreSQL/Simple/FromField.hs+6−6
@@ -103,13 +103,13 @@ import qualified Data.Vector as V
103import Data.Word (Word64)
103import Data.Word (Word64)
104import Database.PostgreSQL.Simple.Internal
104import Database.PostgreSQL.Simple.Internal
105import Database.PostgreSQL.Simple.BuiltinTypes
105import Database.PostgreSQL.Simple.BuiltinTypes
106+import Database.PostgreSQL.Simple.Compat
106import Database.PostgreSQL.Simple.Ok
107import Database.PostgreSQL.Simple.Ok
107import Database.PostgreSQL.Simple.Types (Binary(..), Null(..))
108import Database.PostgreSQL.Simple.Types (Binary(..), Null(..))
108import Database.PostgreSQL.Simple.TypeInfo
109import Database.PostgreSQL.Simple.TypeInfo
109import Database.PostgreSQL.Simple.Time
110import Database.PostgreSQL.Simple.Time
110import Database.PostgreSQL.Simple.Arrays
111import Database.PostgreSQL.Simple.Arrays
111import qualified Database.PostgreSQL.LibPQ as PQ
112import qualified Database.PostgreSQL.LibPQ as PQ
112−import System.IO.Unsafe (unsafePerformIO)
113import qualified Data.ByteString as SB
113import qualified Data.ByteString as SB
114import qualified Data.ByteString.Char8 as B8
114import qualified Data.ByteString.Char8 as B8
115import qualified Data.ByteString.Lazy as LB
115import qualified Data.ByteString.Lazy as LB
@@ -189,7 +189,7 @@ typeinfo Field{..} = Conversion $ \conn -> do
189-- definition, but it can be set using an @as@ clause.
189-- definition, but it can be set using an @as@ clause.
190
190
191name :: Field -> Maybe ByteString
191name :: Field -> Maybe ByteString
192−name Field{..} = unsafePerformIO (PQ.fname result column)
192+name Field{..} = unsafeDupablePerformIO (PQ.fname result column)
193
193
194-- | Returns the name of the object id of the @table@ associated with the
194-- | Returns the name of the object id of the @table@ associated with the
195-- column, if any. Returns 'Nothing' when there is no such table;
195-- column, if any. Returns 'Nothing' when there is no such table;
@@ -197,7 +197,7 @@ name Field{..} = unsafePerformIO (PQ.fname result column)
197-- Analogous to libpq's @PQftable@.
197-- Analogous to libpq's @PQftable@.
198
198
199tableOid :: Field -> Maybe PQ.Oid
199tableOid :: Field -> Maybe PQ.Oid
200−tableOid Field{..} = toMaybeOid (unsafePerformIO (PQ.ftable result column))
200+tableOid Field{..} = toMaybeOid (unsafeDupablePerformIO (PQ.ftable result column))
201 where
201 where
202 toMaybeOid x
202 toMaybeOid x
203 = if x == PQ.invalidOid
203 = if x == PQ.invalidOid
@@ -209,7 +209,7 @@ tableOid Field{..} = toMaybeOid (unsafePerformIO (PQ.ftable result column))
209-- to libpq's @PQftablecol@.
209-- to libpq's @PQftablecol@.
210
210
211tableColumn :: Field -> Int
211tableColumn :: Field -> Int
212−tableColumn Field{..} = fromCol (unsafePerformIO (PQ.ftablecol result column))
212+tableColumn Field{..} = fromCol (unsafeDupablePerformIO (PQ.ftablecol result column))
213 where
213 where
214 fromCol (PQ.Col x) = fromIntegral x
214 fromCol (PQ.Col x) = fromIntegral x
215
215
@@ -217,7 +217,7 @@ tableColumn Field{..} = fromCol (unsafePerformIO (PQ.ftablecol result column))
217-- Analogous to libpq's @PQfformat@.
217-- Analogous to libpq's @PQfformat@.
218
218
219format :: Field -> PQ.Format
219format :: Field -> PQ.Format
220−format Field{..} = unsafePerformIO (PQ.fformat result column)
220+format Field{..} = unsafeDupablePerformIO (PQ.fformat result column)
221
221
222instance (FromField a) => FromField (Maybe a) where
222instance (FromField a) => FromField (Maybe a) where
223 fromField _ Nothing = pure Nothing
223 fromField _ Nothing = pure Nothing
@@ -278,7 +278,7 @@ instance FromField LB.ByteString where
278
278
279unescapeBytea :: Field -> SB.ByteString
279unescapeBytea :: Field -> SB.ByteString
280 -> Conversion (Binary SB.ByteString)
280 -> Conversion (Binary SB.ByteString)
281−unescapeBytea f str = case unsafePerformIO (PQ.unescapeBytea str) of
281+unescapeBytea f str = case unsafeDupablePerformIO (PQ.unescapeBytea str) of
282 Nothing -> returnError ConversionFailed f "unescapeBytea failed"
282 Nothing -> returnError ConversionFailed f "unescapeBytea failed"
283 Just str -> pure (Binary str)
283 Just str -> pure (Binary str)
284
284
src/Database/PostgreSQL/Simple/FromRow.hs+4−4
@@ -31,11 +31,11 @@ import qualified Data.ByteString.Char8 as B
31import Database.PostgreSQL.Simple.Types (Only(..))
31import Database.PostgreSQL.Simple.Types (Only(..))
32import qualified Database.PostgreSQL.LibPQ as PQ
32import qualified Database.PostgreSQL.LibPQ as PQ
33import Database.PostgreSQL.Simple.Internal
33import Database.PostgreSQL.Simple.Internal
34+import Database.PostgreSQL.Simple.Compat
34import Database.PostgreSQL.Simple.FromField
35import Database.PostgreSQL.Simple.FromField
35import Database.PostgreSQL.Simple.Ok
36import Database.PostgreSQL.Simple.Ok
36import Database.PostgreSQL.Simple.Types ((:.)(..))
37import Database.PostgreSQL.Simple.Types ((:.)(..))
37import Database.PostgreSQL.Simple.TypeInfo
38import Database.PostgreSQL.Simple.TypeInfo
38−import System.IO.Unsafe (unsafePerformIO)
39
39
40import Control.Monad.Trans.State.Strict
40import Control.Monad.Trans.State.Strict
41import Control.Monad.Trans.Reader
41import Control.Monad.Trans.Reader
@@ -67,10 +67,10 @@ class FromRow a where
67 fromRow :: RowParser a
67 fromRow :: RowParser a
68
68
69getvalue :: PQ.Result -> PQ.Row -> PQ.Column -> Maybe ByteString
69getvalue :: PQ.Result -> PQ.Row -> PQ.Column -> Maybe ByteString
70−getvalue result row col = unsafePerformIO (PQ.getvalue result row col)
70+getvalue result row col = unsafeDupablePerformIO (PQ.getvalue result row col)
71
71
72nfields :: PQ.Result -> PQ.Column
72nfields :: PQ.Result -> PQ.Column
73−nfields result = unsafePerformIO (PQ.nfields result)
73+nfields result = unsafeDupablePerformIO (PQ.nfields result)
74
74
75getTypeInfoByCol :: Row -> PQ.Column -> Conversion TypeInfo
75getTypeInfoByCol :: Row -> PQ.Column -> Conversion TypeInfo
76getTypeInfoByCol Row{..} col =
76getTypeInfoByCol Row{..} col =
@@ -102,7 +102,7 @@ fieldWith fieldP = RP $ do
102 conversionError err
102 conversionError err
103 else do
103 else do
104 let !result = rowresult
104 let !result = rowresult
105− !typeOid = unsafePerformIO (PQ.ftype result column)
105+ !typeOid = unsafeDupablePerformIO (PQ.ftype result column)
106 !field = Field{..}
106 !field = Field{..}
107 lift (lift (fieldP field (getvalue result row column)))
107 lift (lift (fieldP field (getvalue result row column)))
108
108