packages feed

orville-postgresql-1.1.0.0: src/Orville/PostgreSQL/PgCatalog/PgTrigger.hs

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

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

@since 1.1.0.0
-}
module Orville.PostgreSQL.PgCatalog.PgTrigger
  ( PgTrigger (..)
  , TriggerName
  , triggerNameToString
  , pgTriggerTable
  , triggerRelationOidField
  ) where

import qualified Data.String as String
import qualified Data.Text as T

import qualified Database.PostgreSQL.LibPQ as LibPQ
import qualified Orville.PostgreSQL as Orville
import Orville.PostgreSQL.PgCatalog.OidField (oidField, oidTypeField)

{- | The Haskell representation of data read from the @pg_catalog.pg_trigger@
  table. Rows in this table correspond to triggers created on tables and views.
@since 1.1.0.0
-}
data PgTrigger = PgTrigger
  { pgTriggerOid :: LibPQ.Oid
  -- ^ The PostgreSQL @oid@ for the relation.
  , pgTriggerRelationOid :: LibPQ.Oid
  -- ^ The PostgreSQL @oid@ of the relation that the trigger is onto.
  -- References @pg_class.oid@.
  , pgTriggerName :: TriggerName
  -- ^ The name of the trigger.
  , pgTriggerIsInternal :: Bool
  -- ^ The whether the trigger is internal accounting to PostgreSQL.
  }

{- | A Haskell type for the name of the trigger represented by a 'PgTrigger'.

@since 1.1.0.0
-}
newtype TriggerName
  = TriggerName T.Text
  deriving
    ( -- | @since 1.1.0.0
      Show
    , -- | @since 1.1.0.0
      Eq
    , -- | @since 1.1.0.0
      Ord
    , -- | @since 1.1.0.0
      String.IsString
    )

{- | Convert a 'TriggerName' to a plain 'String'.

@since 1.1.0.0
-}
triggerNameToString :: TriggerName -> String
triggerNameToString (TriggerName name) =
  T.unpack name

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

@since 1.1.0.0
-}
pgTriggerTable :: Orville.TableDefinition Orville.NoKey PgTrigger PgTrigger
pgTriggerTable =
  Orville.setTableSchema "pg_catalog" $
    Orville.mkTableDefinitionWithoutKey
      "pg_trigger"
      pgTriggerMarshaller

pgTriggerMarshaller :: Orville.SqlMarshaller PgTrigger PgTrigger
pgTriggerMarshaller =
  PgTrigger
    <$> Orville.marshallField pgTriggerOid oidField
    <*> Orville.marshallField pgTriggerRelationOid triggerRelationOidField
    <*> Orville.marshallField pgTriggerName triggerNameField
    <*> Orville.marshallField pgTriggerIsInternal triggerIsInternalField

{- | The @tgrelid@ column of the @pg_trigger@ table.

@since 1.1.0.0
-}
triggerRelationOidField :: Orville.FieldDefinition Orville.NotNull LibPQ.Oid
triggerRelationOidField =
  oidTypeField "tgrelid"

{- | The @tgname@ column of the @pg_catalog.pg_trigger@ table.

@since 1.1.0.0
-}
triggerNameField :: Orville.FieldDefinition Orville.NotNull TriggerName
triggerNameField =
  Orville.coerceField $
    Orville.unboundedTextField "tgname"

{- | The @tgisinternal@ column of the @pg_catalog.pg_trigger@ table.

@since 1.1.0.0
-}
triggerIsInternalField :: Orville.FieldDefinition Orville.NotNull Bool
triggerIsInternalField =
  Orville.booleanField "tgisinternal"