git.iko.soy/typeable/postgresql-simple
on master help sign in
Switch from unsafePerformIO to unsafeDupablePerformIO
commit4194297be27e7ccca610e1459c3959a88d74c30d authorLeon P Smith <leon@melding-monads.com> dateMon 25 Feb 2013, 17:11 (14 years ago) parent3a67b8d
3 files changed+20−10
src/Database/PostgreSQL/Simple/Compat.hs+10 src/Database/PostgreSQL/Simple/FromField.hs+6−6 src/Database/PostgreSQL/Simple/FromRow.hs+4−4
src/Database/PostgreSQL/Simple/Compat.hs+10
@@ -4,11 +4,21 @@
44module Database.PostgreSQL.Simple.Compat
55 ( mask
66 , (<>)
7+ , unsafeDupablePerformIO
78 ) where
89
910import qualified Control.Exception as E
1011import Data.Monoid
1112
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+
1222-- | Like 'E.mask', but backported to base before version 4.3.0.
1323--
1424-- 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
103103import Data.Word (Word64)
104104import Database.PostgreSQL.Simple.Internal
105105import Database.PostgreSQL.Simple.BuiltinTypes
106+import Database.PostgreSQL.Simple.Compat
106107import Database.PostgreSQL.Simple.Ok
107108import Database.PostgreSQL.Simple.Types (Binary(..), Null(..))
108109import Database.PostgreSQL.Simple.TypeInfo
109110import Database.PostgreSQL.Simple.Time
110111import Database.PostgreSQL.Simple.Arrays
111112import qualified Database.PostgreSQL.LibPQ as PQ
112−import System.IO.Unsafe (unsafePerformIO)
113113import qualified Data.ByteString as SB
114114import qualified Data.ByteString.Char8 as B8
115115import qualified Data.ByteString.Lazy as LB
@@ -189,7 +189,7 @@ typeinfo Field{..} = Conversion $ \conn -> do
189189-- definition, but it can be set using an @as@ clause.
190190
191191name :: Field -> Maybe ByteString
192−name Field{..} = unsafePerformIO (PQ.fname result column)
192+name Field{..} = unsafeDupablePerformIO (PQ.fname result column)
193193
194194-- | Returns the name of the object id of the @table@ associated with the
195195-- column, if any. Returns 'Nothing' when there is no such table;
@@ -197,7 +197,7 @@ name Field{..} = unsafePerformIO (PQ.fname result column)
197197-- Analogous to libpq's @PQftable@.
198198
199199tableOid :: Field -> Maybe PQ.Oid
200−tableOid Field{..} = toMaybeOid (unsafePerformIO (PQ.ftable result column))
200+tableOid Field{..} = toMaybeOid (unsafeDupablePerformIO (PQ.ftable result column))
201201 where
202202 toMaybeOid x
203203 = if x == PQ.invalidOid
@@ -209,7 +209,7 @@ tableOid Field{..} = toMaybeOid (unsafePerformIO (PQ.ftable result column))
209209-- to libpq's @PQftablecol@.
210210
211211tableColumn :: Field -> Int
212−tableColumn Field{..} = fromCol (unsafePerformIO (PQ.ftablecol result column))
212+tableColumn Field{..} = fromCol (unsafeDupablePerformIO (PQ.ftablecol result column))
213213 where
214214 fromCol (PQ.Col x) = fromIntegral x
215215
@@ -217,7 +217,7 @@ tableColumn Field{..} = fromCol (unsafePerformIO (PQ.ftablecol result column))
217217-- Analogous to libpq's @PQfformat@.
218218
219219format :: Field -> PQ.Format
220−format Field{..} = unsafePerformIO (PQ.fformat result column)
220+format Field{..} = unsafeDupablePerformIO (PQ.fformat result column)
221221
222222instance (FromField a) => FromField (Maybe a) where
223223 fromField _ Nothing = pure Nothing
@@ -278,7 +278,7 @@ instance FromField LB.ByteString where
278278
279279unescapeBytea :: Field -> SB.ByteString
280280 -> Conversion (Binary SB.ByteString)
281−unescapeBytea f str = case unsafePerformIO (PQ.unescapeBytea str) of
281+unescapeBytea f str = case unsafeDupablePerformIO (PQ.unescapeBytea str) of
282282 Nothing -> returnError ConversionFailed f "unescapeBytea failed"
283283 Just str -> pure (Binary str)
284284
src/Database/PostgreSQL/Simple/FromRow.hs+4−4
@@ -31,11 +31,11 @@ import qualified Data.ByteString.Char8 as B
3131import Database.PostgreSQL.Simple.Types (Only(..))
3232import qualified Database.PostgreSQL.LibPQ as PQ
3333import Database.PostgreSQL.Simple.Internal
34+import Database.PostgreSQL.Simple.Compat
3435import Database.PostgreSQL.Simple.FromField
3536import Database.PostgreSQL.Simple.Ok
3637import Database.PostgreSQL.Simple.Types ((:.)(..))
3738import Database.PostgreSQL.Simple.TypeInfo
38−import System.IO.Unsafe (unsafePerformIO)
3939
4040import Control.Monad.Trans.State.Strict
4141import Control.Monad.Trans.Reader
@@ -67,10 +67,10 @@ class FromRow a where
6767 fromRow :: RowParser a
6868
6969getvalue :: 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)
7171
7272nfields :: PQ.Result -> PQ.Column
73−nfields result = unsafePerformIO (PQ.nfields result)
73+nfields result = unsafeDupablePerformIO (PQ.nfields result)
7474
7575getTypeInfoByCol :: Row -> PQ.Column -> Conversion TypeInfo
7676getTypeInfoByCol Row{..} col =
@@ -102,7 +102,7 @@ fieldWith fieldP = RP $ do
102102 conversionError err
103103 else do
104104 let !result = rowresult
105− !typeOid = unsafePerformIO (PQ.ftype result column)
105+ !typeOid = unsafeDupablePerformIO (PQ.ftype result column)
106106 !field = Field{..}
107107 lift (lift (fieldP field (getvalue result row column)))
108108