2020-12-08 17:22:31 +03:00
|
|
|
module Hasura.RQL.DDL.Schema.Common where
|
|
|
|
|
|
|
|
import Hasura.Prelude
|
2021-03-15 16:02:58 +03:00
|
|
|
|
|
|
|
import qualified Data.HashMap.Strict as HM
|
|
|
|
import qualified Database.PG.Query as Q
|
|
|
|
|
2021-03-16 20:35:35 +03:00
|
|
|
import Data.FileEmbed (makeRelativeToProject)
|
|
|
|
|
2021-03-15 16:02:58 +03:00
|
|
|
import qualified Hasura.SQL.AnyBackend as AB
|
|
|
|
|
|
|
|
import Hasura.Backends.Postgres.SQL.Types
|
2020-12-08 17:22:31 +03:00
|
|
|
import Hasura.RQL.DDL.ComputedField
|
|
|
|
import Hasura.RQL.DDL.EventTrigger
|
|
|
|
import Hasura.RQL.DDL.Permission
|
|
|
|
import Hasura.RQL.DDL.Relationship
|
|
|
|
import Hasura.RQL.DDL.RemoteRelationship
|
|
|
|
import Hasura.RQL.DDL.Schema.Function
|
|
|
|
import Hasura.RQL.Types
|
|
|
|
|
|
|
|
|
|
|
|
purgeDependentObject
|
2021-02-14 09:07:52 +03:00
|
|
|
:: forall b m
|
|
|
|
. (MonadError QErr m, BackendMetadata b)
|
|
|
|
=> SourceName -> SourceObjId b -> m MetadataModifier
|
|
|
|
purgeDependentObject source sourceObjId = case sourceObjId of
|
|
|
|
SOITableObj tn tableObj -> pure $ MetadataModifier $
|
2021-04-22 00:44:37 +03:00
|
|
|
tableMetadataSetter @b source tn %~ case tableObj of
|
2020-12-08 17:22:31 +03:00
|
|
|
TOPerm rn pt -> dropPermissionInMetadata rn pt
|
|
|
|
TORel rn -> dropRelationshipInMetadata rn
|
|
|
|
TOTrigger trn -> dropEventTriggerInMetadata trn
|
|
|
|
TOComputedField ccn -> dropComputedFieldInMetadata ccn
|
|
|
|
TORemoteRel rrn -> dropRemoteRelationshipInMetadata rrn
|
|
|
|
_ -> id
|
2021-04-22 00:44:37 +03:00
|
|
|
SOIFunction qf -> pure $ dropFunctionInMetadata @b source qf
|
2021-02-14 09:07:52 +03:00
|
|
|
_ ->
|
2021-03-15 16:02:58 +03:00
|
|
|
throw500
|
|
|
|
$ "unexpected dependent object: "
|
|
|
|
<> reportSchemaObj (SOSourceObj source $ AB.mkAnyBackend sourceObjId)
|
2020-12-08 17:22:31 +03:00
|
|
|
|
|
|
|
-- | Fetch Postgres metadata of all user tables
|
2021-04-22 00:44:37 +03:00
|
|
|
fetchTableMetadata :: (MonadTx m) => m (DBTablesMetadata ('Postgres 'Vanilla))
|
2020-12-08 17:22:31 +03:00
|
|
|
fetchTableMetadata = do
|
|
|
|
results <- liftTx $ Q.withQE defaultTxErrorHandler
|
2021-03-16 20:35:35 +03:00
|
|
|
$(makeRelativeToProject "src-rsr/pg_table_metadata.sql" >>= Q.sqlFromFile) () True
|
2020-12-08 17:22:31 +03:00
|
|
|
pure $ HM.fromList $ flip map results $
|
|
|
|
\(schema, table, Q.AltJ info) -> (QualifiedObject schema table, info)
|
|
|
|
|
|
|
|
-- | Fetch Postgres metadata for all user functions
|
2021-04-22 00:44:37 +03:00
|
|
|
fetchFunctionMetadata :: (MonadTx m) => m (DBFunctionsMetadata ('Postgres 'Vanilla))
|
2020-12-08 17:22:31 +03:00
|
|
|
fetchFunctionMetadata = do
|
|
|
|
results <- liftTx $ Q.withQE defaultTxErrorHandler
|
2021-03-16 20:35:35 +03:00
|
|
|
$(makeRelativeToProject "src-rsr/pg_function_metadata.sql" >>= Q.sqlFromFile) () True
|
2020-12-08 17:22:31 +03:00
|
|
|
pure $ HM.fromList $ flip map results $
|
|
|
|
\(schema, table, Q.AltJ infos) -> (QualifiedObject schema table, infos)
|
|
|
|
|
|
|
|
-- | Fetch all scalar types from Postgres
|
|
|
|
fetchPgScalars :: MonadTx m => m (HashSet PGScalarType)
|
|
|
|
fetchPgScalars =
|
|
|
|
liftTx $ Q.getAltJ . runIdentity . Q.getRow
|
|
|
|
<$> Q.withQE defaultTxErrorHandler
|
|
|
|
[Q.sql|
|
|
|
|
SELECT coalesce(json_agg(typname), '[]')
|
|
|
|
FROM pg_catalog.pg_type where typtype = 'b'
|
|
|
|
|] () True
|