{-# LANGUAGE TypeApplications #-}
module Database.PostgreSQL.PQTypes.Composite (
Composite(..)
, unComposite
, CompositeRow
, CompositeFromSQL(..)
, CompositeToSQL(..)
) where
import Data.Kind (Type)
import Foreign.Ptr
import qualified Control.Exception as E
import Database.PostgreSQL.PQTypes.Format
import Database.PostgreSQL.PQTypes.FromRow
import Database.PostgreSQL.PQTypes.FromSQL
import Database.PostgreSQL.PQTypes.Internal.C.Interface
import Database.PostgreSQL.PQTypes.Internal.C.Types
import Database.PostgreSQL.PQTypes.Internal.Utils
import Database.PostgreSQL.PQTypes.ToRow
import Database.PostgreSQL.PQTypes.ToSQL
newtype Composite a = Composite a
deriving (Composite a -> Composite a -> Bool
(Composite a -> Composite a -> Bool)
-> (Composite a -> Composite a -> Bool) -> Eq (Composite a)
forall a. Eq a => Composite a -> Composite a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Composite a -> Composite a -> Bool
$c/= :: forall a. Eq a => Composite a -> Composite a -> Bool
== :: Composite a -> Composite a -> Bool
$c== :: forall a. Eq a => Composite a -> Composite a -> Bool
Eq, a -> Composite b -> Composite a
(a -> b) -> Composite a -> Composite b
(forall a b. (a -> b) -> Composite a -> Composite b)
-> (forall a b. a -> Composite b -> Composite a)
-> Functor Composite
forall a b. a -> Composite b -> Composite a
forall a b. (a -> b) -> Composite a -> Composite b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> Composite b -> Composite a
$c<$ :: forall a b. a -> Composite b -> Composite a
fmap :: (a -> b) -> Composite a -> Composite b
$cfmap :: forall a b. (a -> b) -> Composite a -> Composite b
Functor, Eq (Composite a)
Eq (Composite a)
-> (Composite a -> Composite a -> Ordering)
-> (Composite a -> Composite a -> Bool)
-> (Composite a -> Composite a -> Bool)
-> (Composite a -> Composite a -> Bool)
-> (Composite a -> Composite a -> Bool)
-> (Composite a -> Composite a -> Composite a)
-> (Composite a -> Composite a -> Composite a)
-> Ord (Composite a)
Composite a -> Composite a -> Bool
Composite a -> Composite a -> Ordering
Composite a -> Composite a -> Composite a
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. Ord a => Eq (Composite a)
forall a. Ord a => Composite a -> Composite a -> Bool
forall a. Ord a => Composite a -> Composite a -> Ordering
forall a. Ord a => Composite a -> Composite a -> Composite a
min :: Composite a -> Composite a -> Composite a
$cmin :: forall a. Ord a => Composite a -> Composite a -> Composite a
max :: Composite a -> Composite a -> Composite a
$cmax :: forall a. Ord a => Composite a -> Composite a -> Composite a
>= :: Composite a -> Composite a -> Bool
$c>= :: forall a. Ord a => Composite a -> Composite a -> Bool
> :: Composite a -> Composite a -> Bool
$c> :: forall a. Ord a => Composite a -> Composite a -> Bool
<= :: Composite a -> Composite a -> Bool
$c<= :: forall a. Ord a => Composite a -> Composite a -> Bool
< :: Composite a -> Composite a -> Bool
$c< :: forall a. Ord a => Composite a -> Composite a -> Bool
compare :: Composite a -> Composite a -> Ordering
$ccompare :: forall a. Ord a => Composite a -> Composite a -> Ordering
$cp1Ord :: forall a. Ord a => Eq (Composite a)
Ord, Int -> Composite a -> ShowS
[Composite a] -> ShowS
Composite a -> String
(Int -> Composite a -> ShowS)
-> (Composite a -> String)
-> ([Composite a] -> ShowS)
-> Show (Composite a)
forall a. Show a => Int -> Composite a -> ShowS
forall a. Show a => [Composite a] -> ShowS
forall a. Show a => Composite a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Composite a] -> ShowS
$cshowList :: forall a. Show a => [Composite a] -> ShowS
show :: Composite a -> String
$cshow :: forall a. Show a => Composite a -> String
showsPrec :: Int -> Composite a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> Composite a -> ShowS
Show)
unComposite :: Composite a -> a
unComposite :: Composite a -> a
unComposite (Composite a
a) = a
a
type family CompositeRow t :: Type
class (PQFormat t, FromRow (CompositeRow t)) => CompositeFromSQL t where
toComposite :: CompositeRow t -> t
class (PQFormat t, ToRow (CompositeRow t)) => CompositeToSQL t where
fromComposite :: t -> CompositeRow t
instance PQFormat t => PQFormat (Composite t) where
pqFormat :: ByteString
pqFormat = PQFormat t => ByteString
forall t. PQFormat t => ByteString
pqFormat @t
instance CompositeFromSQL t => FromSQL (Composite t) where
type PQBase (Composite t) = Ptr PGresult
fromSQL :: Maybe (PQBase (Composite t)) -> IO (Composite t)
fromSQL Maybe (PQBase (Composite t))
Nothing = IO (Composite t)
forall a. IO a
unexpectedNULL
fromSQL (Just PQBase (Composite t)
res) = t -> Composite t
forall a. a -> Composite a
Composite
(t -> Composite t) -> IO t -> IO (Composite t)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO t -> IO () -> IO t
forall a b. IO a -> IO b -> IO a
E.finally (CompositeRow t -> t
forall t. CompositeFromSQL t => CompositeRow t -> t
toComposite (CompositeRow t -> t) -> IO (CompositeRow t) -> IO t
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr PGresult -> CInt -> CInt -> IO (CompositeRow t)
forall row. FromRow row => Ptr PGresult -> CInt -> CInt -> IO row
fromRow' Ptr PGresult
PQBase (Composite t)
res CInt
0 CInt
0) (Ptr PGresult -> IO ()
c_PQclear Ptr PGresult
PQBase (Composite t)
res)
instance CompositeToSQL t => ToSQL (Composite t) where
type PQDest (Composite t) = PGparam
toSQL :: Composite t
-> ParamAllocator -> (Ptr (PQDest (Composite t)) -> IO r) -> IO r
toSQL (Composite t
comp) pa :: ParamAllocator
pa@(ParamAllocator forall r. (Ptr PGparam -> IO r) -> IO r
allocParam) Ptr (PQDest (Composite t)) -> IO r
conv =
(Ptr PGparam -> IO r) -> IO r
forall r. (Ptr PGparam -> IO r) -> IO r
allocParam ((Ptr PGparam -> IO r) -> IO r) -> (Ptr PGparam -> IO r) -> IO r
forall a b. (a -> b) -> a -> b
$ \Ptr PGparam
param -> do
CompositeRow t -> ParamAllocator -> Ptr PGparam -> IO ()
forall row.
ToRow row =>
row -> ParamAllocator -> Ptr PGparam -> IO ()
toRow' (t -> CompositeRow t
forall t. CompositeToSQL t => t -> CompositeRow t
fromComposite t
comp) ParamAllocator
pa Ptr PGparam
param
Ptr (PQDest (Composite t)) -> IO r
conv Ptr PGparam
Ptr (PQDest (Composite t))
param