@@ -217,6 +217,7 @@ module Squeal.PostgreSQL.Binary
217217 , Only (..)
218218 -- * Oid
219219 , HasOid (..)
220+ , HasOidParam (..)
220221 , HasAliasedOid (..)
221222 ) where
222223
@@ -231,6 +232,7 @@ import Data.Time
231232import Data.UUID.Types
232233import Data.Vector (Vector)
233234import Data.Word
235+import Foreign.C.Types (CUInt(CUInt))
234236import Generics.SOP
235237import Generics.SOP.Record
236238import GHC.TypeLits
@@ -244,6 +246,7 @@ import qualified Data.Text.Lazy as Lazy (Text)
244246import qualified Data.Text as Strict (Text)
245247import qualified Data.Text as Strict.Text
246248import qualified Data.Vector as Vector
249+import qualified Database.PostgreSQL.LibPQ as LibPQ
247250import qualified GHC.Generics as GHC
248251import qualified PostgreSQL.Binary.Decoding as Decoding
249252import qualified PostgreSQL.Binary.Encoding as Encoding
@@ -398,29 +401,113 @@ instance
398401--
399402-- >>> :set -XTypeApplications
400403-- >>> oidOf @'PGbool
401−-- Oid {getOid = 16}
402−class HasOid (ty :: PGType) where oidOf :: Oid
403−instance HasOid 'PGbool where oidOf = Oid 16
404−instance HasOid 'PGint2 where oidOf = Oid 21
405−instance HasOid 'PGint4 where oidOf = Oid 23
406−instance HasOid 'PGint8 where oidOf = Oid 20
407−instance HasOid 'PGnumeric where oidOf = Oid 1700
408−instance HasOid 'PGfloat4 where oidOf = Oid 700
409−instance HasOid 'PGfloat8 where oidOf = Oid 701
410−instance HasOid ('PGchar n) where oidOf = Oid 18
411−instance HasOid ('PGvarchar n) where oidOf = Oid 1043
412−instance HasOid 'PGtext where oidOf = Oid 25
413−instance HasOid 'PGbytea where oidOf = Oid 17
414−instance HasOid 'PGtimestamp where oidOf = Oid 1114
415−instance HasOid 'PGtimestamptz where oidOf = Oid 1184
416−instance HasOid 'PGdate where oidOf = Oid 1082
417−instance HasOid 'PGtime where oidOf = Oid 1083
418−instance HasOid 'PGtimetz where oidOf = Oid 1266
419−instance HasOid 'PGinterval where oidOf = Oid 1186
420−instance HasOid 'PGuuid where oidOf = Oid 2950
421−instance HasOid 'PGinet where oidOf = Oid 869
422−instance HasOid 'PGjson where oidOf = Oid 114
423−instance HasOid 'PGjsonb where oidOf = Oid 3802
404+-- Oid 16
405+class HasOid (ty :: PGType) where oidOf :: LibPQ.Oid
406+instance HasOid 'PGbool where oidOf = LibPQ.Oid 16
407+instance HasOid ('PGfixarray ns (null 'PGbool)) where oidOf = LibPQ.Oid 1000
408+instance HasOid ('PGvararray (null 'PGbool)) where oidOf = LibPQ.Oid 1000
409+instance HasOid 'PGint2 where oidOf = LibPQ.Oid 21
410+instance HasOid ('PGfixarray ns (null 'PGint2)) where oidOf = LibPQ.Oid 1005
411+instance HasOid ('PGvararray (null 'PGint2)) where oidOf = LibPQ.Oid 1005
412+instance HasOid 'PGint4 where oidOf = LibPQ.Oid 23
413+instance HasOid ('PGfixarray ns (null 'PGint4)) where oidOf = LibPQ.Oid 1007
414+instance HasOid ('PGvararray (null 'PGint4)) where oidOf = LibPQ.Oid 1007
415+instance HasOid 'PGint8 where oidOf = LibPQ.Oid 20
416+instance HasOid ('PGfixarray ns (null 'PGint8)) where oidOf = LibPQ.Oid 1016
417+instance HasOid ('PGvararray (null 'PGint8)) where oidOf = LibPQ.Oid 1016
418+instance HasOid 'PGnumeric where oidOf = LibPQ.Oid 1700
419+instance HasOid ('PGfixarray ns (null 'PGnumeric)) where oidOf = LibPQ.Oid 1231
420+instance HasOid ('PGvararray (null 'PGnumeric)) where oidOf = LibPQ.Oid 1231
421+instance HasOid 'PGfloat4 where oidOf = LibPQ.Oid 700
422+instance HasOid ('PGfixarray ns (null 'PGfloat4)) where oidOf = LibPQ.Oid 1021
423+instance HasOid ('PGvararray (null 'PGfloat4)) where oidOf = LibPQ.Oid 1021
424+instance HasOid 'PGfloat8 where oidOf = LibPQ.Oid 701
425+instance HasOid ('PGfixarray ns (null 'PGfloat8)) where oidOf = LibPQ.Oid 1022
426+instance HasOid ('PGvararray (null 'PGfloat8)) where oidOf = LibPQ.Oid 1022
427+instance HasOid 'PGmoney where oidOf = LibPQ.Oid 790
428+instance HasOid ('PGfixarray ns (null 'PGmoney)) where oidOf = LibPQ.Oid 791
429+instance HasOid ('PGvararray (null 'PGmoney)) where oidOf = LibPQ.Oid 791
430+instance HasOid ('PGchar n) where oidOf = LibPQ.Oid 18
431+instance HasOid ('PGfixarray ns (null ('PGchar n))) where oidOf = LibPQ.Oid 1002
432+instance HasOid ('PGvararray (null ('PGchar n))) where oidOf = LibPQ.Oid 1002
433+instance HasOid ('PGvarchar n) where oidOf = LibPQ.Oid 1043
434+instance HasOid ('PGfixarray ns (null ('PGvarchar n))) where oidOf = LibPQ.Oid 1015
435+instance HasOid ('PGvararray (null ('PGvarchar n))) where oidOf = LibPQ.Oid 1015
436+instance HasOid 'PGtext where oidOf = LibPQ.Oid 25
437+instance HasOid ('PGfixarray ns (null 'PGtext)) where oidOf = LibPQ.Oid 1009
438+instance HasOid ('PGvararray (null 'PGtext)) where oidOf = LibPQ.Oid 1009
439+instance HasOid 'PGbytea where oidOf = LibPQ.Oid 17
440+instance HasOid ('PGfixarray ns (null 'PGbytea)) where oidOf = LibPQ.Oid 1001
441+instance HasOid ('PGvararray (null 'PGbytea)) where oidOf = LibPQ.Oid 1001
442+instance HasOid 'PGtimestamp where oidOf = LibPQ.Oid 1114
443+instance HasOid ('PGfixarray ns (null 'PGtimestamp)) where oidOf = LibPQ.Oid 1115
444+instance HasOid ('PGvararray (null 'PGtimestamp)) where oidOf = LibPQ.Oid 1115
445+instance HasOid 'PGtimestamptz where oidOf = LibPQ.Oid 1184
446+instance HasOid ('PGfixarray ns (null 'PGtimestamptz)) where oidOf = LibPQ.Oid 1185
447+instance HasOid ('PGvararray (null 'PGtimestamptz)) where oidOf = LibPQ.Oid 1185
448+instance HasOid 'PGdate where oidOf = LibPQ.Oid 1082
449+instance HasOid ('PGfixarray ns (null 'PGdate)) where oidOf = LibPQ.Oid 1182
450+instance HasOid ('PGvararray (null 'PGdate)) where oidOf = LibPQ.Oid 1182
451+instance HasOid 'PGtime where oidOf = LibPQ.Oid 1083
452+instance HasOid ('PGfixarray ns (null 'PGtime)) where oidOf = LibPQ.Oid 1183
453+instance HasOid ('PGvararray (null 'PGtime)) where oidOf = LibPQ.Oid 1183
454+instance HasOid 'PGtimetz where oidOf = LibPQ.Oid 1266
455+instance HasOid ('PGfixarray ns (null 'PGtimetz)) where oidOf = LibPQ.Oid 1270
456+instance HasOid ('PGvararray (null 'PGtimetz)) where oidOf = LibPQ.Oid 1270
457+instance HasOid 'PGinterval where oidOf = LibPQ.Oid 1186
458+instance HasOid ('PGfixarray ns (null 'PGinterval)) where oidOf = LibPQ.Oid 1187
459+instance HasOid ('PGvararray (null 'PGinterval)) where oidOf = LibPQ.Oid 1187
460+instance HasOid 'PGuuid where oidOf = LibPQ.Oid 2950
461+instance HasOid ('PGfixarray ns (null 'PGuuid)) where oidOf = LibPQ.Oid 2951
462+instance HasOid ('PGvararray (null 'PGuuid)) where oidOf = LibPQ.Oid 2951
463+instance HasOid 'PGinet where oidOf = LibPQ.Oid 869
464+instance HasOid ('PGfixarray ns (null 'PGinet)) where oidOf = LibPQ.Oid 1041
465+instance HasOid ('PGvararray (null 'PGinet)) where oidOf = LibPQ.Oid 1041
466+instance HasOid 'PGjson where oidOf = LibPQ.Oid 114
467+instance HasOid ('PGfixarray ns (null 'PGjson)) where oidOf = LibPQ.Oid 199
468+instance HasOid ('PGvararray (null 'PGjson)) where oidOf = LibPQ.Oid 199
469+instance HasOid 'PGjsonb where oidOf = LibPQ.Oid 3802
470+instance HasOid ('PGfixarray ns (null 'PGjsonb)) where oidOf = LibPQ.Oid 3807
471+instance HasOid ('PGvararray (null 'PGjsonb)) where oidOf = LibPQ.Oid 3807
472+instance HasOid 'PGtsvector where oidOf = LibPQ.Oid 3614
473+instance HasOid ('PGfixarray ns (null 'PGtsvector)) where oidOf = LibPQ.Oid 3643
474+instance HasOid ('PGvararray (null 'PGtsvector)) where oidOf = LibPQ.Oid 3643
475+instance HasOid 'PGtsquery where oidOf = LibPQ.Oid 3615
476+instance HasOid ('PGfixarray ns (null 'PGtsquery)) where oidOf = LibPQ.Oid 3645
477+instance HasOid ('PGvararray (null 'PGtsquery)) where oidOf = LibPQ.Oid 3645
478+instance HasOid 'PGoid where oidOf = LibPQ.Oid 26
479+instance HasOid ('PGfixarray ns (null 'PGoid)) where oidOf = LibPQ.Oid 1028
480+instance HasOid ('PGvararray (null 'PGoid)) where oidOf = LibPQ.Oid 1028
481+instance HasOid ('PGrange 'PGint4) where oidOf = LibPQ.Oid 3904
482+instance HasOid ('PGfixarray ns (null ('PGrange 'PGint4))) where oidOf = LibPQ.Oid 3905
483+instance HasOid ('PGvararray (null ('PGrange 'PGint4))) where oidOf = LibPQ.Oid 3905
484+instance HasOid ('PGrange 'PGint8) where oidOf = LibPQ.Oid 3926
485+instance HasOid ('PGfixarray ns (null ('PGrange 'PGint8))) where oidOf = LibPQ.Oid 3927
486+instance HasOid ('PGvararray (null ('PGrange 'PGint8))) where oidOf = LibPQ.Oid 3927
487+instance HasOid ('PGrange 'PGnumeric) where oidOf = LibPQ.Oid 3906
488+instance HasOid ('PGfixarray ns (null ('PGrange 'PGnumeric))) where oidOf = LibPQ.Oid 3907
489+instance HasOid ('PGvararray (null ('PGrange 'PGnumeric))) where oidOf = LibPQ.Oid 3907
490+instance HasOid ('PGrange 'PGtimestamp) where oidOf = LibPQ.Oid 3908
491+instance HasOid ('PGfixarray ns (null ('PGrange 'PGtimestamp))) where oidOf = LibPQ.Oid 3909
492+instance HasOid ('PGvararray (null ('PGrange 'PGtimestamp))) where oidOf = LibPQ.Oid 3909
493+instance HasOid ('PGrange 'PGtimestamptz) where oidOf = LibPQ.Oid 3910
494+instance HasOid ('PGfixarray ns (null ('PGrange 'PGtimestamptz))) where oidOf = LibPQ.Oid 3911
495+instance HasOid ('PGvararray (null ('PGrange 'PGtimestamptz))) where oidOf = LibPQ.Oid 3911
496+instance HasOid ('PGrange 'PGdate) where oidOf = LibPQ.Oid 3912
497+instance HasOid ('PGfixarray ns (null ('PGrange 'PGdate))) where oidOf = LibPQ.Oid 3913
498+instance HasOid ('PGvararray (null ('PGrange 'PGdate))) where oidOf = LibPQ.Oid 3913
499+instance {-# OVERLAPPABLE #-} HasOid ('PGrange ty) where oidOf = LibPQ.invalidOid
500+instance {-# OVERLAPPABLE #-} HasOid ('PGfixarray ns (null ('PGrange ty))) where oidOf = LibPQ.invalidOid
501+instance {-# OVERLAPPABLE #-} HasOid ('PGvararray (null ('PGrange ty))) where oidOf = LibPQ.invalidOid
502+instance {-# OVERLAPPABLE #-} HasOid ('PGcomposite row) where oidOf = LibPQ.invalidOid
503+instance {-# OVERLAPPABLE #-} HasOid ('PGfixarray ns (null ('PGcomposite row))) where oidOf = LibPQ.invalidOid
504+instance {-# OVERLAPPABLE #-} HasOid ('PGvararray (null ('PGcomposite row))) where oidOf = LibPQ.invalidOid
505+instance {-# OVERLAPPABLE #-} HasOid ('PGenum labels) where oidOf = LibPQ.invalidOid
506+instance {-# OVERLAPPABLE #-} HasOid ('PGfixarray ns (null ('PGenum labels))) where oidOf = LibPQ.invalidOid
507+instance {-# OVERLAPPABLE #-} HasOid ('PGvararray (null ('PGenum labels))) where oidOf = LibPQ.invalidOid
508+
509+class HasOidParam (ty :: NullityType) where oidOfParam :: Oid
510+instance HasOid ty => HasOidParam (null ty) where oidOfParam = oidOf @ty
424511
425512-- | Lifts a `HasOid` constraint to a field.
426513class HasAliasedOid (field :: (Symbol, NullityType)) where
@@ -756,3 +843,6 @@ replicateMN
756843 => m x -> m (NP I xs)
757844replicateMN mx = hsequence' $
758845 hcpure (Proxy :: Proxy ((~) x)) (Comp (I <$> mx))
846+
847+getOid :: LibPQ.Oid -> Word32
848+getOid (LibPQ.Oid (CUInt oid)) = oid