on dev help sign in
some more progress
commite1f631c47ba34c52f04a7d1b2477fdcdc92895c5 authorEitan Chatav <eitan.chatav@gmail.com> dateWed 11 Jul 2018, 21:41 (8 years ago) parent980af8e
1 file changed+17−5
squeal-postgresql/src/Squeal/PostgreSQL/Binary.hs+17−5
squeal-postgresql/src/Squeal/PostgreSQL/Binary.hs+17−5
@@ -160,7 +160,9 @@ module Squeal.PostgreSQL.Binary
160160 , Only (..)
161161 ) where
162162
163+import BinaryParser
163164import ByteString.StrictBuilder
165+import Control.Monad
164166import Data.Aeson hiding (Null)
165167import Data.Int
166168import Data.Kind
@@ -178,7 +180,7 @@ import Network.IP.Addr
178180import qualified Data.ByteString.Lazy as Lazy
179181import qualified Data.ByteString as Strict hiding (pack, unpack)
180182import qualified Data.Text.Lazy as Lazy
181−import qualified Data.Text as Strict
183+import qualified Data.Text as Strict hiding (empty)
182184import qualified Data.Vector as Vector
183185import qualified GHC.Generics as GHC
184186import qualified PostgreSQL.Binary.Decoding as Decoding
@@ -439,10 +441,20 @@ instance
439441 fromValue p =
440442 let
441443 composite
442− :: proxy ('PGcomposite pgs)
444+ :: forall proxy pgs. SListI pgs
445+ => proxy ('PGcomposite pgs)
443446 -> Strict.ByteString
444− -> NP (K (Maybe Strict.ByteString)) pgs
445− composite = undefined
447+ -> Either Strict.Text (NP (K (Maybe Strict.ByteString)) pgs)
448+ composite _ = Decoding.valueParser $ do
449+ unitOfSize 4
450+ let
451+ each _ = do
452+ unitOfSize 4
453+ len <- sized 4 Decoding.int
454+ if len == -1
455+ then return (K Nothing)
456+ else K . Just <$> bytesOfSize len
457+ htraverse' each (hpure Proxy :: NP Proxy pgs)
446458
447459 -- composite
448460 -- :: SListI zs
@@ -474,7 +486,7 @@ instance
474486 -- htraverse' each fields
475487
476488 in
477− Decoding.fn (fromRow @fields @y . composite p)
489+ Decoding.fn (fromRow @fields @y <=< composite p)
478490
479491-- | A `FromColumnValue` constraint lifts the `FromValue` parser
480492-- to a decoding of a @(Symbol, NullityType)@ to a `Type`,