packages feed

hpqtypes-extras-1.17.0.0: src/Database/PostgreSQL/PQTypes/Migrate.hs

module Database.PostgreSQL.PQTypes.Migrate
  ( createDomain
  , createTable
  , createTableConstraints
  , createTableTriggers
  ) where

import Control.Monad
import Data.Foldable qualified as F

import Database.PostgreSQL.PQTypes
import Database.PostgreSQL.PQTypes.Checks.Util
import Database.PostgreSQL.PQTypes.Model
import Database.PostgreSQL.PQTypes.SQL.Builder

createDomain :: MonadDB m => Domain -> m ()
createDomain dom@Domain {..} = do
  -- create the domain
  runQuery_ $ sqlCreateDomain dom
  -- add constraint checks to the domain
  F.forM_ domChecks $ runQuery_ . sqlAlterDomain domName . sqlAddValidCheckMaybeDowntime

createTable :: MonadDB m => Bool -> Table -> m ()
createTable withConstraints table@Table {..} = do
  -- Create empty table and add the columns.
  runQuery_ $ sqlCreateTable tblName
  runQuery_ $ sqlAlterTable tblName $ map sqlAddColumn tblColumns
  -- Add the primary key if applicable.
  forM_ tblPrimaryKey $ \pk -> runQuery_ $ sqlAlterTable tblName [sqlAddPK tblName pk]
  -- Add indexes.
  forM_ tblIndexes $ runQuery_ . sqlCreateIndexMaybeDowntime tblName
  -- Add all the other constraints if applicable.
  when withConstraints $ createTableConstraints table
  -- Create triggers.
  createTableTriggers table
  -- Register the table along with its version.
  runQuery_ . sqlInsert "table_versions" $ do
    sqlSet "name" (tblNameText table)
    sqlSet "version" tblVersion

createTableConstraints :: MonadDB m => Table -> m ()
createTableConstraints Table {..} = unless (null addConstraints) $ do
  runQuery_ $ sqlAlterTable tblName addConstraints
  where
    addConstraints =
      map sqlAddValidCheckMaybeDowntime tblChecks
        ++ map (sqlAddValidFKMaybeDowntime tblName) tblForeignKeys

createTableTriggers :: MonadDB m => Table -> m ()
createTableTriggers = mapM_ createTrigger . tblTriggers