sqel-0.0.1.0: lib/Sqel/Sql/Type.hs
module Sqel.Sql.Type where
import qualified Exon
import qualified Sqel.Data.PgType as PgTable
import Sqel.Data.PgType (
ColumnType (ColumnComp, ColumnPrim),
PgColumn (PgColumn),
PgColumnName (PgColumnName),
PgColumns (PgColumns),
PgComposite (PgComposite),
PgPrimName (PgPrimName),
PgTable (PgTable),
PgTypeRef (PgTypeRef),
)
import Sqel.Data.PgTypeName (PgTableName)
import Sqel.Data.Sql (Sql, sql)
import Sqel.Data.SqlFragment (CommaSep (CommaSep))
import Sqel.Text.Quote (dquote)
-- TODO why is unique not used?
columnSpec ::
PgColumn ->
Sql
columnSpec = \case
PgColumn (PgColumnName name) (ColumnPrim (PgPrimName tpe) _ (Exon.intercalate " " -> params)) ->
[sql|##{dquote name} ##{tpe} #{params}|]
PgColumn (PgColumnName name) (ColumnComp (PgTypeRef tpe) _ (Exon.intercalate " " -> params)) ->
[sql|##{dquote name} ##{tpe} #{params}|]
typeColumnSpec ::
PgColumn ->
Sql
typeColumnSpec = \case
PgColumn (PgColumnName name) (ColumnPrim (PgPrimName tpe) _ _) ->
[sql|##{dquote name} ##{tpe}|]
PgColumn (PgColumnName name) (ColumnComp (PgTypeRef tpe) _ _) ->
[sql|##{dquote name} ##{tpe}|]
createTable ::
PgTable a ->
Sql
createTable PgTable {name, columns = PgColumns cols} =
[sql|create table ##{name} (##{CommaSep formattedColumns})|]
where
formattedColumns = toList (columnSpec <$> cols)
dropTable ::
PgTableName ->
Sql
dropTable name =
[sql|drop table if exists ##{name}|]
-- TODO make PgTypeRef et al quote automatically by using @ToSegment@
createProdType ::
PgComposite ->
Sql
createProdType (PgComposite name (PgColumns cols)) =
[sql|create type ##{name} as (##{CommaSep formattedColumns})|]
where
formattedColumns = toList (typeColumnSpec <$> cols)