Add tuple decoding into multiple records
This commit is contained in:
parent
6d3b1e660a
commit
d6703f9646
@ -53,12 +53,34 @@ class FromRow a where
|
|||||||
fromRow result columnTable row =
|
fromRow result columnTable row =
|
||||||
runExceptT $ to <$> fromRow' @0 FRProxy (FromRowCtx result columnTable) row
|
runExceptT $ to <$> fromRow' @0 FRProxy (FromRowCtx result columnTable) row
|
||||||
|
|
||||||
|
instance
|
||||||
|
( Generic a
|
||||||
|
, GetColumnTable' (Rep a)
|
||||||
|
, FromRow' 0 (Rep a)
|
||||||
|
, Generic b
|
||||||
|
, GetColumnTable' (Rep b)
|
||||||
|
, FromRow' (NumberOfMembers (Rep a)) (Rep b)
|
||||||
|
) => FromRow (a, b) where
|
||||||
|
getColumnTable Proxy result = runExceptT $ do
|
||||||
|
ctA <- newColumnTable <$> getColumnTable' @(Rep a) Proxy result
|
||||||
|
ctB <- newColumnTable <$> getColumnTable' @(Rep b) Proxy result
|
||||||
|
pure $ ctA `concatColumnTables` ctB
|
||||||
|
|
||||||
|
fromRow result ct row = runExceptT $ do
|
||||||
|
x <- to <$> fromRow' @0 FRProxy (FromRowCtx result ct) row
|
||||||
|
y <- to <$> fromRow' @(NumberOfMembers (Rep a)) FRProxy (FromRowCtx result ct) row
|
||||||
|
pure (x, y)
|
||||||
|
|
||||||
newtype ColumnTable = ColumnTable (Vector (Column, Oid))
|
newtype ColumnTable = ColumnTable (Vector (Column, Oid))
|
||||||
deriving (Eq, Show)
|
deriving (Eq, Show)
|
||||||
|
|
||||||
newColumnTable :: [(Column, Oid)] -> ColumnTable
|
newColumnTable :: [(Column, Oid)] -> ColumnTable
|
||||||
newColumnTable = ColumnTable . Vector.fromList
|
newColumnTable = ColumnTable . Vector.fromList
|
||||||
|
|
||||||
|
concatColumnTables :: ColumnTable -> ColumnTable -> ColumnTable
|
||||||
|
concatColumnTables (ColumnTable a) (ColumnTable b) =
|
||||||
|
ColumnTable $ a <> b
|
||||||
|
|
||||||
indexColumnTable :: ColumnTable -> Int -> (Column, Oid)
|
indexColumnTable :: ColumnTable -> Int -> (Column, Oid)
|
||||||
indexColumnTable (ColumnTable v) i = v `Vector.unsafeIndex` i
|
indexColumnTable (ColumnTable v) i = v `Vector.unsafeIndex` i
|
||||||
|
|
||||||
|
@ -122,6 +122,13 @@ spec = do
|
|||||||
row <- Opium.fromRow result columnTable 0
|
row <- Opium.fromRow result columnTable 0
|
||||||
row `shouldBe` Right (ManyFields "abc" 42 1.0 "test" True)
|
row `shouldBe` Right (ManyFields "abc" 42 1.0 "test" True)
|
||||||
|
|
||||||
|
it "Decodes multiple records into a tuple" $ \conn -> do
|
||||||
|
Just result <- LibPQ.execParams conn "SELECT 'albus' AS name, 123 AS age, 42 AS only" [] LibPQ.Binary
|
||||||
|
Right columnTable <- Opium.getColumnTable @(Person, Only Int) Proxy result
|
||||||
|
|
||||||
|
row <- Opium.fromRow @(Person, Only Int) result columnTable 0
|
||||||
|
row `shouldBe` Right (Person "albus" 123, Only 42)
|
||||||
|
|
||||||
describe "fetch" $ do
|
describe "fetch" $ do
|
||||||
it "Passes numbered parameters and retrieves a list of rows" $ \conn -> do
|
it "Passes numbered parameters and retrieves a list of rows" $ \conn -> do
|
||||||
rows <- Opium.fetch "SELECT ($1 + $2) AS only" (17 :: Int, 25 :: Int) conn
|
rows <- Opium.fetch "SELECT ($1 + $2) AS only" (17 :: Int, 25 :: Int) conn
|
||||||
|
Loading…
x
Reference in New Issue
Block a user