git.iko.soy/typeable/postgresql-simple
on master help sign in
Merge pull request #85 from basvandijk/uuid

Add FromField and ToField instances for UUID

commit977d2d854c330945597b2e9bd0143d04d9629ac8 authorLeon P Smith <leon@melding-monads.com> dateSun 27 Oct 2013, 16:24 (13 years ago) parentc756ec565a2222
3 files changed+20
postgresql-simple.cabal+1 src/Database/PostgreSQL/Simple/FromField.hs+14 src/Database/PostgreSQL/Simple/ToField.hs+5
postgresql-simple.cabal+1
@@ -64,6 +64,7 @@ Library
6464 text >= 0.11.1,
6565 time,
6666 transformers,
67+ uuid >= 1.3.1,
6768 vector
6869
6970 extensions: DoAndIfThenElse, OverloadedStrings, BangPatterns, ViewPatterns
src/Database/PostgreSQL/Simple/FromField.hs+14
@@ -122,6 +122,8 @@ import qualified Data.ByteString.Lazy as LB
122122import qualified Data.Text as ST
123123import qualified Data.Text.Encoding as ST
124124import qualified Data.Text.Lazy as LT
125+import Data.UUID (UUID)
126+import qualified Data.UUID as UUID
125127
126128-- | Exception thrown if conversion from a SQL value to a Haskell
127129-- value fails.
@@ -444,6 +446,18 @@ fromArray typeInfo f = sequence . (parseIt <$>) <$> array delim
444446 where f' | Arrays.Array _ <- item = f
445447 | otherwise = fElem
446448
449+-- | uuid
450+instance FromField UUID where
451+ fromField f mbs =
452+ if typeOid f /= $(inlineTypoid TI.uuid)
453+ then returnError Incompatible f ""
454+ else case mbs of
455+ Nothing -> returnError UnexpectedNull f ""
456+ Just bs ->
457+ case UUID.fromASCIIBytes bs of
458+ Nothing -> returnError ConversionFailed f "Invalid UUID"
459+ Just uuid -> pure uuid
460+
447461-- | json
448462instance FromField JSON.Value where
449463 fromField f mbs =
src/Database/PostgreSQL/Simple/ToField.hs+5
@@ -40,6 +40,8 @@ import qualified Data.ByteString.Lazy as LB
4040import qualified Data.Text as ST
4141import qualified Data.Text.Encoding as ST
4242import qualified Data.Text.Lazy as LT
43+import Data.UUID (UUID)
44+import qualified Data.UUID as UUID
4345import Data.Vector (Vector)
4446import qualified Data.Vector as V
4547import qualified Database.PostgreSQL.LibPQ as PQ
@@ -232,6 +234,9 @@ instance (ToField a) => ToField (Vector a) where
232234 -- Because the ARRAY[...] input syntax is being used, it is possible
233235 -- that the use of type-specific separator characters is unnecessary.
234236
237+instance ToField UUID where
238+ toField = Plain . inQuotes . fromByteString . UUID.toASCIIBytes
239+
235240instance ToField JSON.Value where
236241 toField = toField . JSON.encode
237242