{-# LANGUAGE GeneralizedNewtypeDeriving #-}

{- |
Copyright : Flipstone Technology Partners 2023
License   : MIT
Stability : Stable

@since 1.0.0.0
-}
module Orville.PostgreSQL.PgCatalog.PgAttribute
  ( PgAttribute (..)
  , pgAttributeMaxLength
  , AttributeName
  , attributeNameToString
  , AttributeNumber
  , attributeNumberToInt16
  , attributeNumberFromInt16
  , attributeNumberTextBuilder
  , attributeNumberParser
  , isOrdinaryColumn
  , pgAttributeTable
  , attributeRelationOidField
  , attributeNameField
  , attributeTypeOidField
  , attributeLengthField
  , attributeIsDroppedField
  , attributeNumberTypeField
  )
where

import qualified Data.Attoparsec.Text as AttoText
import Data.Int (Int16, Int32)
import qualified Data.String as String
import qualified Data.Text as T
import qualified Data.Text.Lazy.Builder as LTB
import qualified Data.Text.Lazy.Builder.Int as LTBI
import qualified Database.PostgreSQL.LibPQ as LibPQ

import qualified Orville.PostgreSQL as Orville
import Orville.PostgreSQL.PgCatalog.OidField (oidTypeField)

{- |
  The Haskell representation of data read from the @pg_catalog.pg_attribute@
  table. Rows in this table correspond to table columns, but also to attributes
  of other items from the @pg_class@ table.

  See also 'Orville.PostgreSQL.PgCatalog.PgClass'.

@since 1.0.0.0
-}
data PgAttribute = PgAttribute
  { PgAttribute -> Oid
pgAttributeRelationOid :: LibPQ.Oid
  -- ^ The PostgreSQL @oid@ for the relation that this
  -- attribute belongs to. References @pg_class.oid@.
  , PgAttribute -> AttributeName
pgAttributeName :: AttributeName
  -- ^ The name of the attribute.
  , PgAttribute -> AttributeNumber
pgAttributeNumber :: AttributeNumber
  -- ^ The PostgreSQL number of the attribute.
  , PgAttribute -> Oid
pgAttributeTypeOid :: LibPQ.Oid
  -- ^ The PostgreSQL @oid@ for the type of this attribute. References
  -- @pg_type.oid@.
  , PgAttribute -> Int16
pgAttributeLength :: Int16
  -- ^ The length of this attribute\'s type (a copy of @pg_type.typlen@). Note
  -- that this is _NOT_ the maximum length of a @varchar@ column!
  , PgAttribute -> Int32
pgAttributeTypeModifier :: Int32
  -- ^ Type-specific data supplied at creation time, such as the maximum length
  -- of a @varchar@ column.
  , PgAttribute -> Bool
pgAttributeIsDropped :: Bool
  -- ^ Indicates whether the column has been dropped and is not longer valid.
  , PgAttribute -> Bool
pgAttributeIsNotNull :: Bool
  -- ^ Indicates whether the column has a not-null constraint.
  }

{- |
  Returns the maximum length for an attribute with a variable length type,
  or 'Nothing' if the length of the type is not variable.

@since 1.0.0.0
-}
pgAttributeMaxLength :: PgAttribute -> Maybe Int32
pgAttributeMaxLength :: PgAttribute -> Maybe Int32
pgAttributeMaxLength PgAttribute
attr =
  -- This function is a port of the following function from _pg_char_max_length
  -- function postgresql:
  --
  -- Note that it does not handle DOMAIN (user created) types correctly at the
  -- moment. Handling domain types would require loading the pg_type record and
  -- checking whether to use the typid and typmod from the attribute or the
  -- base type and typemod from the domain type.
  --
  let
    charTypes :: [Oid]
charTypes =
      [CUInt -> Oid
LibPQ.Oid CUInt
1042, CUInt -> Oid
LibPQ.Oid CUInt
1043] -- char, varchar
    bitTypes :: [Oid]
bitTypes =
      [CUInt -> Oid
LibPQ.Oid CUInt
1560, CUInt -> Oid
LibPQ.Oid CUInt
1562] -- bit, varbit
    typeOid :: Oid
typeOid =
      PgAttribute -> Oid
pgAttributeTypeOid PgAttribute
attr

    typeMod :: Int32
typeMod =
      PgAttribute -> Int32
pgAttributeTypeModifier PgAttribute
attr
  in
    if Int32
typeMod Int32 -> Int32 -> Bool
forall a. Eq a => a -> a -> Bool
== -Int32
1
      then Maybe Int32
forall a. Maybe a
Nothing
      else
        if Oid
typeOid Oid -> [Oid] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Oid]
charTypes
          then Int32 -> Maybe Int32
forall a. a -> Maybe a
Just (Int32
typeMod Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
- Int32
4)
          else
            if Oid
typeOid Oid -> [Oid] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Oid]
bitTypes
              then Int32 -> Maybe Int32
forall a. a -> Maybe a
Just Int32
typeMod
              else Maybe Int32
forall a. Maybe a
Nothing

{- |
  Determines whether the attribute represents a system column by inspecting
  the attribute\'s 'AttributeNumber'. Ordinary columns have attribute numbers
  starting at 1.

@since 1.0.0.0
-}
isOrdinaryColumn :: PgAttribute -> Bool
isOrdinaryColumn :: PgAttribute -> Bool
isOrdinaryColumn PgAttribute
attr =
  PgAttribute -> AttributeNumber
pgAttributeNumber PgAttribute
attr AttributeNumber -> AttributeNumber -> Bool
forall a. Ord a => a -> a -> Bool
> Int16 -> AttributeNumber
AttributeNumber Int16
0

{- |
  A Haskell type for the name of the attribute represented by a 'PgAttribute'.

@since 1.0.0.0
-}
newtype AttributeName
  = AttributeName T.Text
  deriving (Int -> AttributeName -> ShowS
[AttributeName] -> ShowS
AttributeName -> String
(Int -> AttributeName -> ShowS)
-> (AttributeName -> String)
-> ([AttributeName] -> ShowS)
-> Show AttributeName
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AttributeName -> ShowS
showsPrec :: Int -> AttributeName -> ShowS
$cshow :: AttributeName -> String
show :: AttributeName -> String
$cshowList :: [AttributeName] -> ShowS
showList :: [AttributeName] -> ShowS
Show, AttributeName -> AttributeName -> Bool
(AttributeName -> AttributeName -> Bool)
-> (AttributeName -> AttributeName -> Bool) -> Eq AttributeName
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AttributeName -> AttributeName -> Bool
== :: AttributeName -> AttributeName -> Bool
$c/= :: AttributeName -> AttributeName -> Bool
/= :: AttributeName -> AttributeName -> Bool
Eq, Eq AttributeName
Eq AttributeName
-> (AttributeName -> AttributeName -> Ordering)
-> (AttributeName -> AttributeName -> Bool)
-> (AttributeName -> AttributeName -> Bool)
-> (AttributeName -> AttributeName -> Bool)
-> (AttributeName -> AttributeName -> Bool)
-> (AttributeName -> AttributeName -> AttributeName)
-> (AttributeName -> AttributeName -> AttributeName)
-> Ord AttributeName
AttributeName -> AttributeName -> Bool
AttributeName -> AttributeName -> Ordering
AttributeName -> AttributeName -> AttributeName
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
$ccompare :: AttributeName -> AttributeName -> Ordering
compare :: AttributeName -> AttributeName -> Ordering
$c< :: AttributeName -> AttributeName -> Bool
< :: AttributeName -> AttributeName -> Bool
$c<= :: AttributeName -> AttributeName -> Bool
<= :: AttributeName -> AttributeName -> Bool
$c> :: AttributeName -> AttributeName -> Bool
> :: AttributeName -> AttributeName -> Bool
$c>= :: AttributeName -> AttributeName -> Bool
>= :: AttributeName -> AttributeName -> Bool
$cmax :: AttributeName -> AttributeName -> AttributeName
max :: AttributeName -> AttributeName -> AttributeName
$cmin :: AttributeName -> AttributeName -> AttributeName
min :: AttributeName -> AttributeName -> AttributeName
Ord, String -> AttributeName
(String -> AttributeName) -> IsString AttributeName
forall a. (String -> a) -> IsString a
$cfromString :: String -> AttributeName
fromString :: String -> AttributeName
String.IsString)

{- |
  Converts an 'AttributeName' to a plain 'String'.

@since 1.0.0.0
-}
attributeNameToString :: AttributeName -> String
attributeNameToString :: AttributeName -> String
attributeNameToString (AttributeName Text
txt) =
  Text -> String
T.unpack Text
txt

{- |
  A Haskell type for the number of the attribute represented by a 'PgAttribute'.

@since 1.0.0.0
-}
newtype AttributeNumber
  = AttributeNumber Int16
  deriving (Int -> AttributeNumber -> ShowS
[AttributeNumber] -> ShowS
AttributeNumber -> String
(Int -> AttributeNumber -> ShowS)
-> (AttributeNumber -> String)
-> ([AttributeNumber] -> ShowS)
-> Show AttributeNumber
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AttributeNumber -> ShowS
showsPrec :: Int -> AttributeNumber -> ShowS
$cshow :: AttributeNumber -> String
show :: AttributeNumber -> String
$cshowList :: [AttributeNumber] -> ShowS
showList :: [AttributeNumber] -> ShowS
Show, AttributeNumber -> AttributeNumber -> Bool
(AttributeNumber -> AttributeNumber -> Bool)
-> (AttributeNumber -> AttributeNumber -> Bool)
-> Eq AttributeNumber
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AttributeNumber -> AttributeNumber -> Bool
== :: AttributeNumber -> AttributeNumber -> Bool
$c/= :: AttributeNumber -> AttributeNumber -> Bool
/= :: AttributeNumber -> AttributeNumber -> Bool
Eq, Eq AttributeNumber
Eq AttributeNumber
-> (AttributeNumber -> AttributeNumber -> Ordering)
-> (AttributeNumber -> AttributeNumber -> Bool)
-> (AttributeNumber -> AttributeNumber -> Bool)
-> (AttributeNumber -> AttributeNumber -> Bool)
-> (AttributeNumber -> AttributeNumber -> Bool)
-> (AttributeNumber -> AttributeNumber -> AttributeNumber)
-> (AttributeNumber -> AttributeNumber -> AttributeNumber)
-> Ord AttributeNumber
AttributeNumber -> AttributeNumber -> Bool
AttributeNumber -> AttributeNumber -> Ordering
AttributeNumber -> AttributeNumber -> AttributeNumber
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
$ccompare :: AttributeNumber -> AttributeNumber -> Ordering
compare :: AttributeNumber -> AttributeNumber -> Ordering
$c< :: AttributeNumber -> AttributeNumber -> Bool
< :: AttributeNumber -> AttributeNumber -> Bool
$c<= :: AttributeNumber -> AttributeNumber -> Bool
<= :: AttributeNumber -> AttributeNumber -> Bool
$c> :: AttributeNumber -> AttributeNumber -> Bool
> :: AttributeNumber -> AttributeNumber -> Bool
$c>= :: AttributeNumber -> AttributeNumber -> Bool
>= :: AttributeNumber -> AttributeNumber -> Bool
$cmax :: AttributeNumber -> AttributeNumber -> AttributeNumber
max :: AttributeNumber -> AttributeNumber -> AttributeNumber
$cmin :: AttributeNumber -> AttributeNumber -> AttributeNumber
min :: AttributeNumber -> AttributeNumber -> AttributeNumber
Ord, Int -> AttributeNumber
AttributeNumber -> Int
AttributeNumber -> [AttributeNumber]
AttributeNumber -> AttributeNumber
AttributeNumber -> AttributeNumber -> [AttributeNumber]
AttributeNumber
-> AttributeNumber -> AttributeNumber -> [AttributeNumber]
(AttributeNumber -> AttributeNumber)
-> (AttributeNumber -> AttributeNumber)
-> (Int -> AttributeNumber)
-> (AttributeNumber -> Int)
-> (AttributeNumber -> [AttributeNumber])
-> (AttributeNumber -> AttributeNumber -> [AttributeNumber])
-> (AttributeNumber -> AttributeNumber -> [AttributeNumber])
-> (AttributeNumber
    -> AttributeNumber -> AttributeNumber -> [AttributeNumber])
-> Enum AttributeNumber
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: AttributeNumber -> AttributeNumber
succ :: AttributeNumber -> AttributeNumber
$cpred :: AttributeNumber -> AttributeNumber
pred :: AttributeNumber -> AttributeNumber
$ctoEnum :: Int -> AttributeNumber
toEnum :: Int -> AttributeNumber
$cfromEnum :: AttributeNumber -> Int
fromEnum :: AttributeNumber -> Int
$cenumFrom :: AttributeNumber -> [AttributeNumber]
enumFrom :: AttributeNumber -> [AttributeNumber]
$cenumFromThen :: AttributeNumber -> AttributeNumber -> [AttributeNumber]
enumFromThen :: AttributeNumber -> AttributeNumber -> [AttributeNumber]
$cenumFromTo :: AttributeNumber -> AttributeNumber -> [AttributeNumber]
enumFromTo :: AttributeNumber -> AttributeNumber -> [AttributeNumber]
$cenumFromThenTo :: AttributeNumber
-> AttributeNumber -> AttributeNumber -> [AttributeNumber]
enumFromThenTo :: AttributeNumber
-> AttributeNumber -> AttributeNumber -> [AttributeNumber]
Enum, Integer -> AttributeNumber
AttributeNumber -> AttributeNumber
AttributeNumber -> AttributeNumber -> AttributeNumber
(AttributeNumber -> AttributeNumber -> AttributeNumber)
-> (AttributeNumber -> AttributeNumber -> AttributeNumber)
-> (AttributeNumber -> AttributeNumber -> AttributeNumber)
-> (AttributeNumber -> AttributeNumber)
-> (AttributeNumber -> AttributeNumber)
-> (AttributeNumber -> AttributeNumber)
-> (Integer -> AttributeNumber)
-> Num AttributeNumber
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
$c+ :: AttributeNumber -> AttributeNumber -> AttributeNumber
+ :: AttributeNumber -> AttributeNumber -> AttributeNumber
$c- :: AttributeNumber -> AttributeNumber -> AttributeNumber
- :: AttributeNumber -> AttributeNumber -> AttributeNumber
$c* :: AttributeNumber -> AttributeNumber -> AttributeNumber
* :: AttributeNumber -> AttributeNumber -> AttributeNumber
$cnegate :: AttributeNumber -> AttributeNumber
negate :: AttributeNumber -> AttributeNumber
$cabs :: AttributeNumber -> AttributeNumber
abs :: AttributeNumber -> AttributeNumber
$csignum :: AttributeNumber -> AttributeNumber
signum :: AttributeNumber -> AttributeNumber
$cfromInteger :: Integer -> AttributeNumber
fromInteger :: Integer -> AttributeNumber
Num, Enum AttributeNumber
Real AttributeNumber
Real AttributeNumber
-> Enum AttributeNumber
-> (AttributeNumber -> AttributeNumber -> AttributeNumber)
-> (AttributeNumber -> AttributeNumber -> AttributeNumber)
-> (AttributeNumber -> AttributeNumber -> AttributeNumber)
-> (AttributeNumber -> AttributeNumber -> AttributeNumber)
-> (AttributeNumber
    -> AttributeNumber -> (AttributeNumber, AttributeNumber))
-> (AttributeNumber
    -> AttributeNumber -> (AttributeNumber, AttributeNumber))
-> (AttributeNumber -> Integer)
-> Integral AttributeNumber
AttributeNumber -> Integer
AttributeNumber
-> AttributeNumber -> (AttributeNumber, AttributeNumber)
AttributeNumber -> AttributeNumber -> AttributeNumber
forall a.
Real a
-> Enum a
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> (a, a))
-> (a -> a -> (a, a))
-> (a -> Integer)
-> Integral a
$cquot :: AttributeNumber -> AttributeNumber -> AttributeNumber
quot :: AttributeNumber -> AttributeNumber -> AttributeNumber
$crem :: AttributeNumber -> AttributeNumber -> AttributeNumber
rem :: AttributeNumber -> AttributeNumber -> AttributeNumber
$cdiv :: AttributeNumber -> AttributeNumber -> AttributeNumber
div :: AttributeNumber -> AttributeNumber -> AttributeNumber
$cmod :: AttributeNumber -> AttributeNumber -> AttributeNumber
mod :: AttributeNumber -> AttributeNumber -> AttributeNumber
$cquotRem :: AttributeNumber
-> AttributeNumber -> (AttributeNumber, AttributeNumber)
quotRem :: AttributeNumber
-> AttributeNumber -> (AttributeNumber, AttributeNumber)
$cdivMod :: AttributeNumber
-> AttributeNumber -> (AttributeNumber, AttributeNumber)
divMod :: AttributeNumber
-> AttributeNumber -> (AttributeNumber, AttributeNumber)
$ctoInteger :: AttributeNumber -> Integer
toInteger :: AttributeNumber -> Integer
Integral, Num AttributeNumber
Ord AttributeNumber
Num AttributeNumber
-> Ord AttributeNumber
-> (AttributeNumber -> Rational)
-> Real AttributeNumber
AttributeNumber -> Rational
forall a. Num a -> Ord a -> (a -> Rational) -> Real a
$ctoRational :: AttributeNumber -> Rational
toRational :: AttributeNumber -> Rational
Real)

{- |
  Converts an 'AttributeNumber' to an integer.
-}
attributeNumberToInt16 :: AttributeNumber -> Int16
attributeNumberToInt16 :: AttributeNumber -> Int16
attributeNumberToInt16 (AttributeNumber Int16
int) = Int16
int

{- |
  Converts an integer to an 'AttributeNumber'.
-}
attributeNumberFromInt16 :: Int16 -> AttributeNumber
attributeNumberFromInt16 :: Int16 -> AttributeNumber
attributeNumberFromInt16 = Int16 -> AttributeNumber
AttributeNumber

{- |
  Attoparsec parser for 'AttributeNumber'.

@since 1.0.0.0
-}
attributeNumberParser :: AttoText.Parser AttributeNumber
attributeNumberParser :: Parser AttributeNumber
attributeNumberParser =
  Parser AttributeNumber -> Parser AttributeNumber
forall a. Num a => Parser a -> Parser a
AttoText.signed Parser AttributeNumber
forall a. Integral a => Parser a
AttoText.decimal

{- |
  Encodes an 'AttributeNumber' to lazy text as a builder.

@since 1.0.0.0
-}
attributeNumberTextBuilder :: AttributeNumber -> LTB.Builder
attributeNumberTextBuilder :: AttributeNumber -> Builder
attributeNumberTextBuilder =
  Int16 -> Builder
forall a. Integral a => a -> Builder
LTBI.decimal (Int16 -> Builder)
-> (AttributeNumber -> Int16) -> AttributeNumber -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AttributeNumber -> Int16
attributeNumberToInt16

{- |
  An Orville 'Orville.TableDefinition' for querying the
  @pg_catalog.pg_attribute@ table.

@since 1.0.0.0
-}
pgAttributeTable :: Orville.TableDefinition Orville.NoKey PgAttribute PgAttribute
pgAttributeTable :: TableDefinition NoKey PgAttribute PgAttribute
pgAttributeTable =
  String
-> TableDefinition NoKey PgAttribute PgAttribute
-> TableDefinition NoKey PgAttribute PgAttribute
forall key writeEntity readEntity.
String
-> TableDefinition key writeEntity readEntity
-> TableDefinition key writeEntity readEntity
Orville.setTableSchema String
"pg_catalog" (TableDefinition NoKey PgAttribute PgAttribute
 -> TableDefinition NoKey PgAttribute PgAttribute)
-> TableDefinition NoKey PgAttribute PgAttribute
-> TableDefinition NoKey PgAttribute PgAttribute
forall a b. (a -> b) -> a -> b
$
    String
-> SqlMarshaller PgAttribute PgAttribute
-> TableDefinition NoKey PgAttribute PgAttribute
forall writeEntity readEntity.
String
-> SqlMarshaller writeEntity readEntity
-> TableDefinition NoKey writeEntity readEntity
Orville.mkTableDefinitionWithoutKey
      String
"pg_attribute"
      SqlMarshaller PgAttribute PgAttribute
pgAttributeMarshaller

pgAttributeMarshaller :: Orville.SqlMarshaller PgAttribute PgAttribute
pgAttributeMarshaller :: SqlMarshaller PgAttribute PgAttribute
pgAttributeMarshaller =
  Oid
-> AttributeName
-> AttributeNumber
-> Oid
-> Int16
-> Int32
-> Bool
-> Bool
-> PgAttribute
PgAttribute
    (Oid
 -> AttributeName
 -> AttributeNumber
 -> Oid
 -> Int16
 -> Int32
 -> Bool
 -> Bool
 -> PgAttribute)
-> SqlMarshaller PgAttribute Oid
-> SqlMarshaller
     PgAttribute
     (AttributeName
      -> AttributeNumber
      -> Oid
      -> Int16
      -> Int32
      -> Bool
      -> Bool
      -> PgAttribute)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (PgAttribute -> Oid)
-> FieldDefinition NotNull Oid -> SqlMarshaller PgAttribute Oid
forall writeEntity fieldValue nullability.
(writeEntity -> fieldValue)
-> FieldDefinition nullability fieldValue
-> SqlMarshaller writeEntity fieldValue
Orville.marshallField PgAttribute -> Oid
pgAttributeRelationOid FieldDefinition NotNull Oid
attributeRelationOidField
    SqlMarshaller
  PgAttribute
  (AttributeName
   -> AttributeNumber
   -> Oid
   -> Int16
   -> Int32
   -> Bool
   -> Bool
   -> PgAttribute)
-> SqlMarshaller PgAttribute AttributeName
-> SqlMarshaller
     PgAttribute
     (AttributeNumber
      -> Oid -> Int16 -> Int32 -> Bool -> Bool -> PgAttribute)
forall a b.
SqlMarshaller PgAttribute (a -> b)
-> SqlMarshaller PgAttribute a -> SqlMarshaller PgAttribute b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (PgAttribute -> AttributeName)
-> FieldDefinition NotNull AttributeName
-> SqlMarshaller PgAttribute AttributeName
forall writeEntity fieldValue nullability.
(writeEntity -> fieldValue)
-> FieldDefinition nullability fieldValue
-> SqlMarshaller writeEntity fieldValue
Orville.marshallField PgAttribute -> AttributeName
pgAttributeName FieldDefinition NotNull AttributeName
attributeNameField
    SqlMarshaller
  PgAttribute
  (AttributeNumber
   -> Oid -> Int16 -> Int32 -> Bool -> Bool -> PgAttribute)
-> SqlMarshaller PgAttribute AttributeNumber
-> SqlMarshaller
     PgAttribute (Oid -> Int16 -> Int32 -> Bool -> Bool -> PgAttribute)
forall a b.
SqlMarshaller PgAttribute (a -> b)
-> SqlMarshaller PgAttribute a -> SqlMarshaller PgAttribute b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (PgAttribute -> AttributeNumber)
-> FieldDefinition NotNull AttributeNumber
-> SqlMarshaller PgAttribute AttributeNumber
forall writeEntity fieldValue nullability.
(writeEntity -> fieldValue)
-> FieldDefinition nullability fieldValue
-> SqlMarshaller writeEntity fieldValue
Orville.marshallField PgAttribute -> AttributeNumber
pgAttributeNumber FieldDefinition NotNull AttributeNumber
attributeNumberField
    SqlMarshaller
  PgAttribute (Oid -> Int16 -> Int32 -> Bool -> Bool -> PgAttribute)
-> SqlMarshaller PgAttribute Oid
-> SqlMarshaller
     PgAttribute (Int16 -> Int32 -> Bool -> Bool -> PgAttribute)
forall a b.
SqlMarshaller PgAttribute (a -> b)
-> SqlMarshaller PgAttribute a -> SqlMarshaller PgAttribute b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (PgAttribute -> Oid)
-> FieldDefinition NotNull Oid -> SqlMarshaller PgAttribute Oid
forall writeEntity fieldValue nullability.
(writeEntity -> fieldValue)
-> FieldDefinition nullability fieldValue
-> SqlMarshaller writeEntity fieldValue
Orville.marshallField PgAttribute -> Oid
pgAttributeTypeOid FieldDefinition NotNull Oid
attributeTypeOidField
    SqlMarshaller
  PgAttribute (Int16 -> Int32 -> Bool -> Bool -> PgAttribute)
-> SqlMarshaller PgAttribute Int16
-> SqlMarshaller PgAttribute (Int32 -> Bool -> Bool -> PgAttribute)
forall a b.
SqlMarshaller PgAttribute (a -> b)
-> SqlMarshaller PgAttribute a -> SqlMarshaller PgAttribute b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (PgAttribute -> Int16)
-> FieldDefinition NotNull Int16 -> SqlMarshaller PgAttribute Int16
forall writeEntity fieldValue nullability.
(writeEntity -> fieldValue)
-> FieldDefinition nullability fieldValue
-> SqlMarshaller writeEntity fieldValue
Orville.marshallField PgAttribute -> Int16
pgAttributeLength FieldDefinition NotNull Int16
attributeLengthField
    SqlMarshaller PgAttribute (Int32 -> Bool -> Bool -> PgAttribute)
-> SqlMarshaller PgAttribute Int32
-> SqlMarshaller PgAttribute (Bool -> Bool -> PgAttribute)
forall a b.
SqlMarshaller PgAttribute (a -> b)
-> SqlMarshaller PgAttribute a -> SqlMarshaller PgAttribute b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (PgAttribute -> Int32)
-> FieldDefinition NotNull Int32 -> SqlMarshaller PgAttribute Int32
forall writeEntity fieldValue nullability.
(writeEntity -> fieldValue)
-> FieldDefinition nullability fieldValue
-> SqlMarshaller writeEntity fieldValue
Orville.marshallField PgAttribute -> Int32
pgAttributeTypeModifier FieldDefinition NotNull Int32
attributeTypeModifierField
    SqlMarshaller PgAttribute (Bool -> Bool -> PgAttribute)
-> SqlMarshaller PgAttribute Bool
-> SqlMarshaller PgAttribute (Bool -> PgAttribute)
forall a b.
SqlMarshaller PgAttribute (a -> b)
-> SqlMarshaller PgAttribute a -> SqlMarshaller PgAttribute b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (PgAttribute -> Bool)
-> FieldDefinition NotNull Bool -> SqlMarshaller PgAttribute Bool
forall writeEntity fieldValue nullability.
(writeEntity -> fieldValue)
-> FieldDefinition nullability fieldValue
-> SqlMarshaller writeEntity fieldValue
Orville.marshallField PgAttribute -> Bool
pgAttributeIsDropped FieldDefinition NotNull Bool
attributeIsDroppedField
    SqlMarshaller PgAttribute (Bool -> PgAttribute)
-> SqlMarshaller PgAttribute Bool
-> SqlMarshaller PgAttribute PgAttribute
forall a b.
SqlMarshaller PgAttribute (a -> b)
-> SqlMarshaller PgAttribute a -> SqlMarshaller PgAttribute b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (PgAttribute -> Bool)
-> FieldDefinition NotNull Bool -> SqlMarshaller PgAttribute Bool
forall writeEntity fieldValue nullability.
(writeEntity -> fieldValue)
-> FieldDefinition nullability fieldValue
-> SqlMarshaller writeEntity fieldValue
Orville.marshallField PgAttribute -> Bool
pgAttributeIsNotNull FieldDefinition NotNull Bool
attributeIsNotNullField

{- |
  The @attrelid@ column of the @pg_catalog.pg_attribute@ table.

@since 1.0.0.0
-}
attributeRelationOidField :: Orville.FieldDefinition Orville.NotNull LibPQ.Oid
attributeRelationOidField :: FieldDefinition NotNull Oid
attributeRelationOidField =
  String -> FieldDefinition NotNull Oid
oidTypeField String
"attrelid"

{- |
  The @attname@ column of the @pg_catalog.pg_attribute@ table.

@since 1.0.0.0
-}
attributeNameField :: Orville.FieldDefinition Orville.NotNull AttributeName
attributeNameField :: FieldDefinition NotNull AttributeName
attributeNameField =
  FieldDefinition NotNull Text
-> FieldDefinition NotNull AttributeName
forall a b nullability.
(Coercible a b, Coercible b a) =>
FieldDefinition nullability a -> FieldDefinition nullability b
Orville.coerceField (FieldDefinition NotNull Text
 -> FieldDefinition NotNull AttributeName)
-> FieldDefinition NotNull Text
-> FieldDefinition NotNull AttributeName
forall a b. (a -> b) -> a -> b
$
    String -> FieldDefinition NotNull Text
Orville.unboundedTextField String
"attname"

{- |
  The @attnum@ column of the @pg_catalog.pg_attribute@ table.

@since 1.0.0.0
-}
attributeNumberField :: Orville.FieldDefinition Orville.NotNull AttributeNumber
attributeNumberField :: FieldDefinition NotNull AttributeNumber
attributeNumberField =
  String -> FieldDefinition NotNull AttributeNumber
attributeNumberTypeField String
"attnum"

{- |
  Builds a 'Orville.FieldDefinition' for a field with type 'AttributeNumber'.

@since 1.0.0.0
-}
attributeNumberTypeField :: String -> Orville.FieldDefinition Orville.NotNull AttributeNumber
attributeNumberTypeField :: String -> FieldDefinition NotNull AttributeNumber
attributeNumberTypeField =
  FieldDefinition NotNull Int16
-> FieldDefinition NotNull AttributeNumber
forall a b nullability.
(Coercible a b, Coercible b a) =>
FieldDefinition nullability a -> FieldDefinition nullability b
Orville.coerceField (FieldDefinition NotNull Int16
 -> FieldDefinition NotNull AttributeNumber)
-> (String -> FieldDefinition NotNull Int16)
-> String
-> FieldDefinition NotNull AttributeNumber
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> FieldDefinition NotNull Int16
Orville.smallIntegerField

{- |
  The @atttypid@ column of the @pg_catalog.pg_attribute@ table.

@since 1.0.0.0
-}
attributeTypeOidField :: Orville.FieldDefinition Orville.NotNull LibPQ.Oid
attributeTypeOidField :: FieldDefinition NotNull Oid
attributeTypeOidField =
  String -> FieldDefinition NotNull Oid
oidTypeField String
"atttypid"

{- |
  The @attlen@ column of the @pg_catalog.pg_attribute@ table.

@since 1.0.0.0
-}
attributeLengthField :: Orville.FieldDefinition Orville.NotNull Int16
attributeLengthField :: FieldDefinition NotNull Int16
attributeLengthField =
  String -> FieldDefinition NotNull Int16
Orville.smallIntegerField String
"attlen"

{- |
  The @atttypmod@ column of the @pg_catalog.pg_attribute@ table.

@since 1.0.0.0
-}
attributeTypeModifierField :: Orville.FieldDefinition Orville.NotNull Int32
attributeTypeModifierField :: FieldDefinition NotNull Int32
attributeTypeModifierField =
  String -> FieldDefinition NotNull Int32
Orville.integerField String
"atttypmod"

{- |
  The @attisdropped@ column of the @pg_catalog.pg_attribute@ table.

@since 1.0.0.0
-}
attributeIsDroppedField :: Orville.FieldDefinition Orville.NotNull Bool
attributeIsDroppedField :: FieldDefinition NotNull Bool
attributeIsDroppedField =
  String -> FieldDefinition NotNull Bool
Orville.booleanField String
"attisdropped"

{- |
  The @attnotnull@ column of the @pg_catalog.pg_attribute@ table.

@since 1.0.0.0
-}
attributeIsNotNullField :: Orville.FieldDefinition Orville.NotNull Bool
attributeIsNotNullField :: FieldDefinition NotNull Bool
attributeIsNotNullField =
  String -> FieldDefinition NotNull Bool
Orville.booleanField String
"attnotnull"