packages feed

hamsql-0.7.0.0: src/Database/YamSql/Internal/Schema.hs

-- This file is part of HamSql
--
-- Copyright 2014-2016 by it's authors.
-- Some rights reserved. See COPYING, AUTHORS.
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}

{-# LANGUAGE GADTs #-}
{-# LANGUAGE StandaloneDeriving #-}

module Database.YamSql.Internal.Schema
  ( Schema(..)
  , SqlContextObj(..)
  , SqlContextSqoArgtypes(..)
  , SqlContextSqo(..)
  , SqlContextSqoObj(..)
  , sqlIdNameOnly
  , module Database.YamSql.Internal.Check
  , module Database.YamSql.Internal.Domain
  , module Database.YamSql.Internal.Function
  , module Database.YamSql.Internal.Role
  , module Database.YamSql.Internal.Sequence
  , module Database.YamSql.Internal.Table
  , module Database.YamSql.Internal.Type
  ) where

import Database.YamSql.Internal.Basic

import Database.YamSql.Internal.Check
import Database.YamSql.Internal.Domain
import Database.YamSql.Internal.Function
import Database.YamSql.Internal.Role
import Database.YamSql.Internal.Sequence
import Database.YamSql.Internal.Table
import Database.YamSql.Internal.Type

-- Schema --
data Schema = Schema
  { schemaName :: SqlName
  , schemaDescription :: Text
  , schemaDependencies :: Maybe [SqlName]
  , schemaFunctions :: Maybe [Function]
  , schemaFunctionTemplates :: Maybe [FunctionTpl]
  , schemaTables :: Maybe [Table]
  , schemaTableTemplates :: Maybe [TableTpl]
  , schemaRoles :: Maybe [Role]
  , schemaSequences :: Maybe [Sequence]
  , schemaPrivUsage :: Maybe [SqlName]
  , schemaPrivSelectAll :: Maybe [SqlName]
  , schemaPrivInsertAll :: Maybe [SqlName]
  , schemaPrivUpdateAll :: Maybe [SqlName]
  , schemaPrivDeleteAll :: Maybe [SqlName]
  , schemaPrivSequenceAll :: Maybe [SqlName]
  , schemaPrivExecuteAll :: Maybe [SqlName]
  , schemaPrivAllAll :: Maybe [SqlName]
  , schemaDomains :: Maybe [Domain]
  , schemaTypes :: Maybe [Type]
  , schemaExecPostInstall :: Maybe Text
  , schemaExecPostInstallAndUpgrade :: Maybe Text
  } deriving (Generic, Show, Data)

instance FromJSON Schema where
  parseJSON = parseYamSql

instance ToJSON Schema where
  toJSON = toYamSqlJson

instance ToSqlIdPart Schema where
    sqlIdPart = schemaName
    sqlIdPartType = const "SCHEMA"

data SqlContextObj a where
   SqlContextObj  :: ToSqlIdPart a => {
    sqlObjectObject :: a
   } -> SqlContextObj a

deriving instance Show (SqlContextObj a)

instance ToSqlId (SqlContextObj a) where
    sqlId (SqlContextObj x) = SqlId $ SqlIdContentObj (sqlIdPartType x) (sqlIdPart x)

data SqlContextSqo a where  SqlContextSqo:: ToSqlIdPart a => {
    sqlSqoSchema:: Schema,
    sqlSqoObject :: a
   } -> SqlContextSqo a

deriving instance Show (SqlContextSqo a)

instance ToSqlId (SqlContextSqo a) where
    sqlId (SqlContextSqo s x) = SqlId $ SqlIdContentSqo
        (sqlIdPartType x)
        (sqlIdPart s <.> sqlIdPart x)

data SqlContextSqoArgtypes a where SqlContextSqoArgtypes :: (ToSqlIdPart a, ToSqlIdPartArgs a) => {
    sqlSqoArgtypesSchema:: Schema,
    sqlSqoArgtypesObject :: a
   } -> SqlContextSqoArgtypes a

deriving instance Show (SqlContextSqoArgtypes a)

instance ToSqlId (SqlContextSqoArgtypes a) where
    sqlId (SqlContextSqoArgtypes s x) = SqlId $ SqlIdContentSqoArgtypes
        (sqlIdPartType x)
        (sqlIdPart s <.> sqlIdPart x)
        (sqlIdPartArgs x)

data SqlContextSqoObj a0 a1 where SqlContextSqoObj :: (ToSqlIdPart a0, ToSqlIdPart a1) =>  {
    sqlSqoObjectSchema :: Schema,
    sqlSqoObject1 :: a0,
    sqlSqoObject2 :: a1
} -> SqlContextSqoObj a0 a1

deriving instance Show (SqlContextSqoObj a0 a1)

instance ToSqlId (SqlContextSqoObj a0 a1) where
    sqlId (SqlContextSqoObj s x1 x2) = SqlId $ SqlIdContentSqoObj
        (sqlIdPartType x1 <> "-" <> sqlIdPartType x2)
        (sqlIdPart s <.> sqlIdPart x1)
        (sqlIdPart x2)

sqlIdNameOnly :: SqlContextSqoArgtypes a -> SqlName
sqlIdNameOnly (SqlContextSqoArgtypes s x) = (sqlIdPart s <.> sqlIdPart x)