WIP: converting dbstructure
This commit is contained in:
@@ -53,12 +53,12 @@ encodeQi =
|
|||||||
contramap qiSchema (HE.value HE.text) <>
|
contramap qiSchema (HE.value HE.text) <>
|
||||||
contramap qiName (HE.value HE.text)
|
contramap qiName (HE.value HE.text)
|
||||||
|
|
||||||
decodeTable :: HD.Result Table
|
decodeTables :: HD.Result [Table]
|
||||||
decodeTable =
|
decodeTables =
|
||||||
HD.singleRow standardRow
|
HD.rowsList tblRow
|
||||||
where
|
where
|
||||||
standardRow = Table <$> HD.value HD.text <*> HD.value HD.text
|
tblRow = Table <$> HD.value HD.text <*> HD.value HD.text
|
||||||
<*> HD.value HD.bool
|
<*> HD.value HD.bool
|
||||||
|
|
||||||
doesProcExist :: H.Query QualifiedIdentifier Bool
|
doesProcExist :: H.Query QualifiedIdentifier Bool
|
||||||
doesProcExist =
|
doesProcExist =
|
||||||
@@ -87,33 +87,33 @@ doesProcReturnJWT =
|
|||||||
AND pg_catalog.pg_get_function_result(p.oid) like '%jwt_claims'
|
AND pg_catalog.pg_get_function_result(p.oid) like '%jwt_claims'
|
||||||
) |]
|
) |]
|
||||||
|
|
||||||
accessibleTables :: Schema -> H.Tx P.Postgres s [Table]
|
accessibleTables :: H.Query Schema [Table]
|
||||||
accessibleTables schema = do
|
accessibleTables =
|
||||||
rows <- H.listEx $
|
H.statement sql (HE.value HE.text) (HD.rowsList (HD.value HD.text)) True
|
||||||
[H.stmt|
|
where
|
||||||
select
|
sql = [q|
|
||||||
n.nspname as table_schema,
|
select
|
||||||
relname as table_name,
|
n.nspname as table_schema,
|
||||||
c.relkind = 'r' or (c.relkind IN ('v', 'f')) and (pg_relation_is_updatable(c.oid::regclass, false) & 8) = 8
|
relname as table_name,
|
||||||
or (exists (
|
c.relkind = 'r' or (c.relkind IN ('v', 'f')) and (pg_relation_is_updatable(c.oid::regclass, false) & 8) = 8
|
||||||
select 1
|
or (exists (
|
||||||
from pg_trigger
|
select 1
|
||||||
where pg_trigger.tgrelid = c.oid and (pg_trigger.tgtype::integer & 69) = 69)
|
from pg_trigger
|
||||||
) as insertable
|
where pg_trigger.tgrelid = c.oid and (pg_trigger.tgtype::integer & 69) = 69)
|
||||||
from
|
) as insertable
|
||||||
pg_class c
|
from
|
||||||
join pg_namespace n on n.oid = c.relnamespace
|
pg_class c
|
||||||
where
|
join pg_namespace n on n.oid = c.relnamespace
|
||||||
c.relkind in ('v', 'r', 'm')
|
where
|
||||||
and n.nspname = ?
|
c.relkind in ('v', 'r', 'm')
|
||||||
and (
|
and n.nspname = $1
|
||||||
pg_has_role(c.relowner, 'USAGE'::text)
|
and (
|
||||||
or has_table_privilege(c.oid, 'SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER'::text)
|
pg_has_role(c.relowner, 'USAGE'::text)
|
||||||
or has_any_column_privilege(c.oid, 'SELECT, INSERT, UPDATE, REFERENCES'::text)
|
or has_table_privilege(c.oid, 'SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER'::text)
|
||||||
)
|
or has_any_column_privilege(c.oid, 'SELECT, INSERT, UPDATE, REFERENCES'::text)
|
||||||
order by relname
|
)
|
||||||
|] schema
|
order by relname
|
||||||
return $ map tableFromRow rows
|
|]
|
||||||
|
|
||||||
synonymousColumns :: [(Column,Column)] -> [Column] -> [[Column]]
|
synonymousColumns :: [(Column,Column)] -> [Column] -> [[Column]]
|
||||||
synonymousColumns allSyns cols = synCols'
|
synonymousColumns allSyns cols = synCols'
|
||||||
@@ -187,27 +187,27 @@ synonymousPrimaryKeys syns (key:keys) = key : newKeys ++ synonymousPrimaryKeys s
|
|||||||
keySyns = filter ((\c -> colTable c == pkTable key && colName c == pkName key) . fst) syns
|
keySyns = filter ((\c -> colTable c == pkTable key && colName c == pkName key) . fst) syns
|
||||||
newKeys = map ((\c -> PrimaryKey{pkTable=colTable c,pkName=colName c}) . snd) keySyns
|
newKeys = map ((\c -> PrimaryKey{pkTable=colTable c,pkName=colName c}) . snd) keySyns
|
||||||
|
|
||||||
allTables :: H.Session [Table]
|
allTables :: H.Query () [Table]
|
||||||
allTables = do
|
allTables =
|
||||||
rows <- H.listEx $ [H.stmt|
|
H.statement sql HE.unit decodeTables True
|
||||||
SELECT
|
where
|
||||||
n.nspname AS table_schema,
|
sql = [q|
|
||||||
c.relname AS table_name,
|
SELECT
|
||||||
c.relkind = 'r' OR (c.relkind IN ('v','f'))
|
n.nspname AS table_schema,
|
||||||
AND (pg_relation_is_updatable(c.oid::regclass, FALSE) & 8) = 8
|
c.relname AS table_name,
|
||||||
OR (EXISTS
|
c.relkind = 'r' OR (c.relkind IN ('v','f'))
|
||||||
( SELECT 1
|
AND (pg_relation_is_updatable(c.oid::regclass, FALSE) & 8) = 8
|
||||||
FROM pg_trigger
|
OR (EXISTS
|
||||||
WHERE pg_trigger.tgrelid = c.oid
|
( SELECT 1
|
||||||
AND (pg_trigger.tgtype::integer & 69) = 69) ) AS insertable
|
FROM pg_trigger
|
||||||
FROM pg_class c
|
WHERE pg_trigger.tgrelid = c.oid
|
||||||
JOIN pg_namespace n ON n.oid = c.relnamespace
|
AND (pg_trigger.tgtype::integer & 69) = 69) ) AS insertable
|
||||||
WHERE c.relkind IN ('v','r','m')
|
FROM pg_class c
|
||||||
AND n.nspname NOT IN ('pg_catalog', 'information_schema')
|
JOIN pg_namespace n ON n.oid = c.relnamespace
|
||||||
GROUP BY table_schema, table_name, insertable
|
WHERE c.relkind IN ('v','r','m')
|
||||||
ORDER BY table_schema, table_name
|
AND n.nspname NOT IN ('pg_catalog', 'information_schema')
|
||||||
|]
|
GROUP BY table_schema, table_name, insertable
|
||||||
return $ map tableFromRow rows
|
ORDER BY table_schema, table_name |]
|
||||||
|
|
||||||
tableFromRow :: (Text, Text, Bool) -> Table
|
tableFromRow :: (Text, Text, Bool) -> Table
|
||||||
tableFromRow (s, n, i) = Table s n i
|
tableFromRow (s, n, i) = Table s n i
|
||||||
|
|||||||
Reference in New Issue
Block a user