packages feed

beam-postgres-0.6.2.0: Database/Beam/Postgres/TempTable.hs

{-# LANGUAGE ConstraintKinds #-}

{-# OPTIONS_GHC -fno-warn-orphans #-}

module Database.Beam.Postgres.TempTable
  ( -- * Temporary tables

    -- ** @CREATE TEMPORARY TABLE@
    runCreateTempTable

    -- ** Options
  , TempTableCreateMode(..)
  , TempTableOptions(..)
  , defaultTempTableOptions

    -- ** Schema constraint
  , HasDefaultPostgresTempTableSchema

  ) where

import           Database.Beam.Migrate.TempTable
  ( BeamHasTempTables(..)
  , HasDefaultTempTableSchema
  , TempTableCreateMode(..)
  , TempTableOptions(..)
  , defaultTempTableOptions
  , runCreateTempTable
  )
import           Database.Beam.Postgres.Types (Postgres)
import           Database.Beam.Postgres.Syntax
  ( PgCommandSyntax(..), PgCommandType(..)
  , fromPgColumnSchema
  , emit, pgQuotedIdentifier, pgSepBy, pgParens
  )

--------------------------------------------------------------------------------

-- | Tables for which @CREATE TEMPORARY TABLE@ statements can be emitted
-- automatically.
type HasDefaultPostgresTempTableSchema tbl = HasDefaultTempTableSchema Postgres tbl

instance BeamHasTempTables Postgres where
  createTempTableCmd nm colDefs pkCols ifNotExists =
    PgCommandSyntax PgCommandTypeDdl $
      emit "CREATE TEMPORARY TABLE "
        <> (if ifNotExists then emit "IF NOT EXISTS " else mempty)
        <> pgQuotedIdentifier nm
        <> pgParens (pgSepBy (emit ", ") (colDefPieces ++ pkPiece))
    where
      colDefPieces =
        map (\(n, s) -> pgQuotedIdentifier n <> emit " " <> fromPgColumnSchema s)
            colDefs

      pkPiece
        | null pkCols = []
        | otherwise =
            [ emit "PRIMARY KEY "
                <> pgParens (pgSepBy (emit ", ") (map pgQuotedIdentifier pkCols)) ]

  dropTempTableIfExistsCmd nm =
    PgCommandSyntax PgCommandTypeDdl $
      emit "DROP TABLE IF EXISTS " <> pgQuotedIdentifier nm