2019-08-14 02:34:37 +03:00
|
|
|
-- | Functions for loading and modifying the catalog. See the module documentation for
|
|
|
|
-- "Hasura.RQL.DDL.Schema" for more details.
|
|
|
|
module Hasura.RQL.DDL.Schema.Catalog
|
|
|
|
( fetchCatalogData
|
|
|
|
, saveTableToCatalog
|
|
|
|
, updateTableIsEnumInCatalog
|
2019-09-19 07:47:36 +03:00
|
|
|
, updateTableConfig
|
2019-08-14 02:34:37 +03:00
|
|
|
, deleteTableFromCatalog
|
2019-10-03 10:45:52 +03:00
|
|
|
, getTableConfig
|
2019-08-14 02:34:37 +03:00
|
|
|
) where
|
|
|
|
|
|
|
|
import Hasura.Prelude
|
|
|
|
|
2019-11-27 01:49:42 +03:00
|
|
|
import qualified Data.Text as T
|
2019-09-19 07:47:36 +03:00
|
|
|
import qualified Database.PG.Query as Q
|
|
|
|
|
2019-11-27 01:49:42 +03:00
|
|
|
-- import Data.Time.Clock
|
|
|
|
|
2019-09-19 07:47:36 +03:00
|
|
|
import Data.Aeson
|
2019-08-14 02:34:37 +03:00
|
|
|
|
|
|
|
import Hasura.Db
|
|
|
|
import Hasura.RQL.Types.Catalog
|
2019-10-11 08:13:57 +03:00
|
|
|
import Hasura.RQL.Types.Common
|
2019-11-27 01:49:42 +03:00
|
|
|
import Hasura.RQL.Types.Error
|
2019-09-19 07:47:36 +03:00
|
|
|
import Hasura.RQL.Types.SchemaCache
|
2019-08-14 02:34:37 +03:00
|
|
|
import Hasura.SQL.Types
|
|
|
|
|
|
|
|
fetchCatalogData :: (MonadTx m) => m CatalogMetadata
|
2019-11-27 01:49:42 +03:00
|
|
|
fetchCatalogData = do
|
|
|
|
-- startTime <- liftTx $ liftIO getCurrentTime
|
|
|
|
metadataBytes <- (liftTx $ runIdentity . Q.getRow <$> Q.withQE defaultTxErrorHandler $(Q.sqlFromFile "src-rsr/catalog_metadata.sql") () True)
|
|
|
|
-- afterFetchTime <- liftTx $ liftIO getCurrentTime
|
|
|
|
-- liftTx $ liftIO $ putStrLn $
|
|
|
|
-- "----> [fetch/query] " <> show (afterFetchTime `diffUTCTime` startTime)
|
|
|
|
let !decodedValue = force (eitherDecodeStrict' metadataBytes)
|
|
|
|
-- afterDecodeTime <- liftTx $ liftIO getCurrentTime
|
|
|
|
-- liftTx $ liftIO $ putStrLn $
|
|
|
|
-- "----> [fetch/decode] " <> show (afterDecodeTime `diffUTCTime` afterFetchTime)
|
|
|
|
decodedValue `onLeft` \err -> throw500 (T.pack err)
|
2019-08-14 02:34:37 +03:00
|
|
|
|
2019-10-11 08:13:57 +03:00
|
|
|
saveTableToCatalog :: (MonadTx m) => QualifiedTable -> SystemDefined -> Bool -> TableConfig -> m ()
|
|
|
|
saveTableToCatalog (QualifiedObject sn tn) systemDefined isEnum config = liftTx $
|
2019-09-19 07:47:36 +03:00
|
|
|
Q.unitQE defaultTxErrorHandler [Q.sql|
|
|
|
|
INSERT INTO "hdb_catalog"."hdb_table"
|
2019-10-11 08:13:57 +03:00
|
|
|
(table_schema, table_name, is_system_defined, is_enum, configuration)
|
|
|
|
VALUES ($1, $2, $3, $4, $5)
|
|
|
|
|] (sn, tn, systemDefined, isEnum, configVal) False
|
2019-09-19 07:47:36 +03:00
|
|
|
where
|
|
|
|
configVal = Q.AltJ $ toJSON config
|
2019-08-14 02:34:37 +03:00
|
|
|
|
|
|
|
updateTableIsEnumInCatalog :: (MonadTx m) => QualifiedTable -> Bool -> m ()
|
2019-09-19 07:47:36 +03:00
|
|
|
updateTableIsEnumInCatalog (QualifiedObject sn tn) isEnum = liftTx $
|
|
|
|
Q.unitQE defaultTxErrorHandler [Q.sql|
|
2019-08-14 02:34:37 +03:00
|
|
|
UPDATE "hdb_catalog"."hdb_table" SET is_enum = $3
|
|
|
|
WHERE table_schema = $1 AND table_name = $2
|
|
|
|
|] (sn, tn, isEnum) False
|
|
|
|
|
2019-09-19 07:47:36 +03:00
|
|
|
updateTableConfig :: (MonadTx m) => QualifiedTable -> TableConfig -> m ()
|
|
|
|
updateTableConfig (QualifiedObject sn tn) config = liftTx $
|
|
|
|
Q.unitQE defaultTxErrorHandler [Q.sql|
|
|
|
|
UPDATE "hdb_catalog"."hdb_table"
|
|
|
|
SET configuration = $1
|
|
|
|
WHERE table_schema = $2 AND table_name = $3
|
|
|
|
|] (configVal, sn, tn) False
|
|
|
|
where
|
|
|
|
configVal = Q.AltJ $ toJSON config
|
|
|
|
|
2019-08-14 02:34:37 +03:00
|
|
|
deleteTableFromCatalog :: (MonadTx m) => QualifiedTable -> m ()
|
|
|
|
deleteTableFromCatalog (QualifiedObject sn tn) = liftTx $ Q.unitQE defaultTxErrorHandler [Q.sql|
|
|
|
|
DELETE FROM "hdb_catalog"."hdb_table"
|
|
|
|
WHERE table_schema = $1 AND table_name = $2
|
|
|
|
|] (sn, tn) False
|
2019-10-03 10:45:52 +03:00
|
|
|
|
|
|
|
getTableConfig :: MonadTx m => QualifiedTable -> m TableConfig
|
|
|
|
getTableConfig (QualifiedObject sn tn) = liftTx $
|
|
|
|
Q.getAltJ . runIdentity . Q.getRow <$> Q.withQE defaultTxErrorHandler
|
|
|
|
[Q.sql|
|
|
|
|
SELECT configuration::json FROM hdb_catalog.hdb_table
|
|
|
|
WHERE table_schema = $1 AND table_name = $2
|
|
|
|
|] (sn, tn) True
|