WIP: converting dbstructure

This commit is contained in:
Joe Nelson
2016-01-24 18:09:18 -08:00
parent 684b11badb
commit 2d5210464a
+53 -53
View File
@@ -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