Add oracle/mssql

This commit is contained in:
rijkvanzanten
2020-11-09 18:50:08 -05:00
parent 64d34933d1
commit 4d09f4a07e
3 changed files with 91 additions and 10 deletions

View File

@@ -9,9 +9,6 @@ import { schemaInspector } from '../database';
const sanitizeQueryMiddleware: RequestHandler = asyncHandler(async (req, res, next) => {
const schemaOverview = await schemaInspector.overview();
console.log(schemaOverview);
req.schema = schemaOverview;
return next();

View File

@@ -2,6 +2,7 @@ import Knex from 'knex';
import { Schema } from '../types/schema';
import { Table } from '../types/table';
import { Column } from '../types/column';
import { SchemaOverview } from '../types/overview';
type RawTable = {
TABLE_NAME: string;
@@ -40,8 +41,52 @@ export default class MSSQL implements Schema {
// Overview
// ===============================================================================================
async overview() {
/** @TODO */
return {};
const columns = await this.knex.raw(
`
SELECT
c.TABLE_NAME as table_name,
c.COLUMN_NAME as column_name,
c.COLUMN_DEFAULT as default_value,
c.IS_NULLABLE as is_nullable,
c.DATA_TYPE as data_type,
pk.PK_SET as column_key
FROM
${this.knex.client.database()}.INFORMATION_SCHEMA.COLUMNS as c
LEFT JOIN (
SELECT
PK_SET = CASE WHEN CONSTRAINT_NAME LIKE '%pk%' THEN 'PRIMARY' ELSE NULL END
FROM ${this.knex.client.database()}.INFORMATION_SCHEMA.KEY_COLUMN_USAGE
) as pk
ON [c].[TABLE_NAME] = [pk].[CONSTRAINT_TABLE_NAME]
AND [c].[TABLE_CATALOG] = [pk].[CONSTRAINT_CATALOG]
AND [c].[COLUMN_NAME] = [pk].[CONSTRAINT_COLUMN_NAME]
`
);
const overview: SchemaOverview = {};
for (const column of columns[0]) {
if (column.table_name in overview === false) {
overview[column.table_name] = {
primary: columns[0].find(
(nested: { column_key: string; table_name: string }) => {
return (
nested.table_name === column.table_name &&
nested.column_key === 'PRIMARY'
);
}
)?.column_name,
columns: {},
};
}
overview[column.table_name].columns[column.column_name] = {
...column,
is_nullable: column.is_nullable === 'YES',
};
}
return overview;
}
// Tables
@@ -166,8 +211,8 @@ export default class MSSQL implements Schema {
.joinRaw(
`left join (
select CONSTRAINT_NAME AS CONSTRAINT_NAME, TABLE_NAME as CONSTRAINT_TABLE_NAME, COLUMN_NAME AS CONSTRAINT_COLUMN_NAME, CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, PK_SET = CASE
WHEN CONSTRAINT_NAME like '%pk%' THEN 'PRIMARY'
ELSE NULL
WHEN CONSTRAINT_NAME like '%pk%' THEN 'PRIMARY'
ELSE NULL
END from ${dbName}.INFORMATION_SCHEMA.KEY_COLUMN_USAGE
) as pk
ON [c].[TABLE_NAME] = [pk].[CONSTRAINT_TABLE_NAME]
@@ -178,7 +223,7 @@ export default class MSSQL implements Schema {
.joinRaw(
`left join (
select CONSTRAINT_NAME,CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, MATCH_OPTION, DELETE_RULE, UPDATE_RULE from ${dbName}.INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
) as rc
ON [pk].[CONSTRAINT_NAME] = [rc].[CONSTRAINT_NAME]
AND [pk].[CONSTRAINT_CATALOG] = [rc].[CONSTRAINT_CATALOG]

View File

@@ -2,6 +2,7 @@ import Knex from 'knex';
import { Schema } from '../types/schema';
import { Table } from '../types/table';
import { Column } from '../types/column';
import { SchemaOverview } from '../types/overview';
type RawTable = {
TABLE_NAME: string;
@@ -39,8 +40,46 @@ export default class oracleDB implements Schema {
// Overview
// ===============================================================================================
async overview() {
/** @TODO */
return {};
const columns = await this.knex.raw(
`
SELECT
c.TABLE_NAME as table_name,
c.COLUMN_NAME as column_name,
c.DATA_DEFAULT as default_value,
c.NULLABLE as is_nullable,
c.DATA_TYPE as data_type,
pk.CONSTRAINT_TYPE as column_key
FROM DBA_TAB_COLUMNS as c
LEFT JOIN all_constraints as pk
ON c.TABLE_NAME = pk.TABLE_NAME
AND c.CONSTRAINT_NAME = pk.CONSTRAINT_NAME
AND c.OWNER = pk.OWNER
`
);
const overview: SchemaOverview = {};
for (const column of columns[0]) {
if (column.table_name in overview === false) {
overview[column.table_name] = {
primary: columns[0].find(
(nested: { column_key: string; table_name: string }) => {
return (
nested.table_name === column.table_name && nested.column_key === 'P'
);
}
)?.column_name,
columns: {},
};
}
overview[column.table_name].columns[column.column_name] = {
...column,
is_nullable: column.is_nullable === 'YES',
};
}
return overview;
}
// Tables