callman-core 1.29.0 → 1.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/prompts/diagram.d.ts.map +1 -1
- package/dist/ai/prompts/diagram.js +24 -7
- package/dist/ai/prompts/diagram.js.map +1 -1
- package/dist/ai/types.d.ts +1 -1
- package/dist/ai/types.d.ts.map +1 -1
- package/dist/diagram/componentCatalog.d.ts +3 -0
- package/dist/diagram/componentCatalog.d.ts.map +1 -1
- package/dist/diagram/componentCatalog.js +5 -1
- package/dist/diagram/componentCatalog.js.map +1 -1
- package/dist/diagram/database/derive.d.ts +14 -0
- package/dist/diagram/database/derive.d.ts.map +1 -0
- package/dist/diagram/database/derive.js +114 -0
- package/dist/diagram/database/derive.js.map +1 -0
- package/dist/diagram/database/diff.d.ts +48 -0
- package/dist/diagram/database/diff.d.ts.map +1 -0
- package/dist/diagram/database/diff.js +109 -0
- package/dist/diagram/database/diff.js.map +1 -0
- package/dist/diagram/database/edit.d.ts +113 -0
- package/dist/diagram/database/edit.d.ts.map +1 -0
- package/dist/diagram/database/edit.js +359 -0
- package/dist/diagram/database/edit.js.map +1 -0
- package/dist/diagram/database/fromSchema.d.ts +12 -0
- package/dist/diagram/database/fromSchema.d.ts.map +1 -0
- package/dist/diagram/database/fromSchema.js +182 -0
- package/dist/diagram/database/fromSchema.js.map +1 -0
- package/dist/diagram/database/index.d.ts +9 -0
- package/dist/diagram/database/index.d.ts.map +1 -0
- package/dist/diagram/database/index.js +14 -0
- package/dist/diagram/database/index.js.map +1 -0
- package/dist/diagram/database/model.d.ts +93 -0
- package/dist/diagram/database/model.d.ts.map +1 -0
- package/dist/diagram/database/model.js +294 -0
- package/dist/diagram/database/model.js.map +1 -0
- package/dist/diagram/database/patch.d.ts +14 -0
- package/dist/diagram/database/patch.d.ts.map +1 -0
- package/dist/diagram/database/patch.js +186 -0
- package/dist/diagram/database/patch.js.map +1 -0
- package/dist/diagram/database/place.d.ts +4 -0
- package/dist/diagram/database/place.d.ts.map +1 -0
- package/dist/diagram/database/place.js +22 -0
- package/dist/diagram/database/place.js.map +1 -0
- package/dist/diagram/database/types.d.ts +50 -0
- package/dist/diagram/database/types.d.ts.map +1 -0
- package/dist/diagram/database/types.js +106 -0
- package/dist/diagram/database/types.js.map +1 -0
- package/dist/diagram/index.d.ts +1 -0
- package/dist/diagram/index.d.ts.map +1 -1
- package/dist/diagram/index.js +1 -0
- package/dist/diagram/index.js.map +1 -1
- package/dist/diagram/layout.d.ts +1 -0
- package/dist/diagram/layout.d.ts.map +1 -1
- package/dist/diagram/layout.js +2 -1
- package/dist/diagram/layout.js.map +1 -1
- package/dist/diagram/ops.d.ts +1 -1
- package/dist/diagram/ops.d.ts.map +1 -1
- package/dist/diagram/ops.js +42 -0
- package/dist/diagram/ops.js.map +1 -1
- package/dist/diagram/opsReference.d.ts +1 -1
- package/dist/diagram/opsReference.d.ts.map +1 -1
- package/dist/diagram/opsReference.js +9 -0
- package/dist/diagram/opsReference.js.map +1 -1
- package/dist/diagram/patchInput.d.ts +65 -1
- package/dist/diagram/patchInput.d.ts.map +1 -1
- package/dist/diagram/patchInput.js +414 -11
- package/dist/diagram/patchInput.js.map +1 -1
- package/dist/diagram/schema.d.ts +2 -2
- package/dist/diagram/schema.d.ts.map +1 -1
- package/dist/diagram/schema.js +3 -3
- package/dist/diagram/schema.js.map +1 -1
- package/dist/diagram/views.d.ts +13 -0
- package/dist/diagram/views.d.ts.map +1 -1
- package/dist/diagram/views.js +49 -0
- package/dist/diagram/views.js.map +1 -1
- package/dist/host/db/introspection/index.d.ts +9 -0
- package/dist/host/db/introspection/index.d.ts.map +1 -0
- package/dist/host/db/introspection/index.js +35 -0
- package/dist/host/db/introspection/index.js.map +1 -0
- package/dist/host/db/introspection/mongo.d.ts +7 -0
- package/dist/host/db/introspection/mongo.d.ts.map +1 -0
- package/dist/host/db/introspection/mongo.js +183 -0
- package/dist/host/db/introspection/mongo.js.map +1 -0
- package/dist/host/db/introspection/mssql.d.ts +6 -0
- package/dist/host/db/introspection/mssql.d.ts.map +1 -0
- package/dist/host/db/introspection/mssql.js +211 -0
- package/dist/host/db/introspection/mssql.js.map +1 -0
- package/dist/host/db/introspection/mysql.d.ts +5 -0
- package/dist/host/db/introspection/mysql.d.ts.map +1 -0
- package/dist/host/db/introspection/mysql.js +163 -0
- package/dist/host/db/introspection/mysql.js.map +1 -0
- package/dist/host/db/introspection/oracle.d.ts +12 -0
- package/dist/host/db/introspection/oracle.d.ts.map +1 -0
- package/dist/host/db/introspection/oracle.js +225 -0
- package/dist/host/db/introspection/oracle.js.map +1 -0
- package/dist/host/db/introspection/postgres.d.ts +5 -0
- package/dist/host/db/introspection/postgres.d.ts.map +1 -0
- package/dist/host/db/introspection/postgres.js +172 -0
- package/dist/host/db/introspection/postgres.js.map +1 -0
- package/dist/host/db/introspection/shared.d.ts +29 -0
- package/dist/host/db/introspection/shared.d.ts.map +1 -0
- package/dist/host/db/introspection/shared.js +119 -0
- package/dist/host/db/introspection/shared.js.map +1 -0
- package/dist/host/db/introspection/types.d.ts +58 -0
- package/dist/host/db/introspection/types.d.ts.map +1 -0
- package/dist/host/db/introspection/types.js +6 -0
- package/dist/host/db/introspection/types.js.map +1 -0
- package/dist/host/db/mongoAdapter.d.ts +1 -0
- package/dist/host/db/mongoAdapter.d.ts.map +1 -1
- package/dist/host/db/mongoAdapter.js +13 -0
- package/dist/host/db/mongoAdapter.js.map +1 -1
- package/dist/host/db/mssqlAdapter.d.ts +1 -0
- package/dist/host/db/mssqlAdapter.d.ts.map +1 -1
- package/dist/host/db/mssqlAdapter.js +3 -1
- package/dist/host/db/mssqlAdapter.js.map +1 -1
- package/dist/host/db/mysqlAdapter.d.ts +1 -0
- package/dist/host/db/mysqlAdapter.d.ts.map +1 -1
- package/dist/host/db/mysqlAdapter.js +11 -0
- package/dist/host/db/mysqlAdapter.js.map +1 -1
- package/dist/host/db/oracleAdapter.d.ts +1 -0
- package/dist/host/db/oracleAdapter.d.ts.map +1 -1
- package/dist/host/db/oracleAdapter.js +22 -0
- package/dist/host/db/oracleAdapter.js.map +1 -1
- package/dist/host/db/postgresAdapter.d.ts +1 -0
- package/dist/host/db/postgresAdapter.d.ts.map +1 -1
- package/dist/host/db/postgresAdapter.js +13 -0
- package/dist/host/db/postgresAdapter.js.map +1 -1
- package/dist/host/db/queryExecutor.d.ts +2 -1
- package/dist/host/db/queryExecutor.d.ts.map +1 -1
- package/dist/host/db/queryExecutor.js +1 -1
- package/dist/host/db/queryExecutor.js.map +1 -1
- package/dist/host/index.d.ts +7 -0
- package/dist/host/index.d.ts.map +1 -1
- package/dist/host/index.js +9 -0
- package/dist/host/index.js.map +1 -1
- package/dist-cjs/ai/prompts/diagram.js +23 -6
- package/dist-cjs/ai/prompts/diagram.js.map +1 -1
- package/dist-cjs/diagram/componentCatalog.js +5 -1
- package/dist-cjs/diagram/componentCatalog.js.map +1 -1
- package/dist-cjs/diagram/database/derive.js +119 -0
- package/dist-cjs/diagram/database/derive.js.map +1 -0
- package/dist-cjs/diagram/database/diff.js +115 -0
- package/dist-cjs/diagram/database/diff.js.map +1 -0
- package/dist-cjs/diagram/database/edit.js +366 -0
- package/dist-cjs/diagram/database/edit.js.map +1 -0
- package/dist-cjs/diagram/database/fromSchema.js +188 -0
- package/dist-cjs/diagram/database/fromSchema.js.map +1 -0
- package/dist-cjs/diagram/database/index.js +32 -0
- package/dist-cjs/diagram/database/index.js.map +1 -0
- package/dist-cjs/diagram/database/model.js +311 -0
- package/dist-cjs/diagram/database/model.js.map +1 -0
- package/dist-cjs/diagram/database/patch.js +190 -0
- package/dist-cjs/diagram/database/patch.js.map +1 -0
- package/dist-cjs/diagram/database/place.js +26 -0
- package/dist-cjs/diagram/database/place.js.map +1 -0
- package/dist-cjs/diagram/database/types.js +122 -0
- package/dist-cjs/diagram/database/types.js.map +1 -0
- package/dist-cjs/diagram/index.js +1 -0
- package/dist-cjs/diagram/index.js.map +1 -1
- package/dist-cjs/diagram/layout.js +3 -2
- package/dist-cjs/diagram/layout.js.map +1 -1
- package/dist-cjs/diagram/ops.js +42 -0
- package/dist-cjs/diagram/ops.js.map +1 -1
- package/dist-cjs/diagram/opsReference.js +9 -0
- package/dist-cjs/diagram/opsReference.js.map +1 -1
- package/dist-cjs/diagram/patchInput.js +414 -11
- package/dist-cjs/diagram/patchInput.js.map +1 -1
- package/dist-cjs/diagram/schema.js +3 -3
- package/dist-cjs/diagram/schema.js.map +1 -1
- package/dist-cjs/diagram/views.js +51 -1
- package/dist-cjs/diagram/views.js.map +1 -1
- package/dist-cjs/host/db/introspection/index.js +59 -0
- package/dist-cjs/host/db/introspection/index.js.map +1 -0
- package/dist-cjs/host/db/introspection/mongo.js +189 -0
- package/dist-cjs/host/db/introspection/mongo.js.map +1 -0
- package/dist-cjs/host/db/introspection/mssql.js +216 -0
- package/dist-cjs/host/db/introspection/mssql.js.map +1 -0
- package/dist-cjs/host/db/introspection/mysql.js +167 -0
- package/dist-cjs/host/db/introspection/mysql.js.map +1 -0
- package/dist-cjs/host/db/introspection/oracle.js +230 -0
- package/dist-cjs/host/db/introspection/oracle.js.map +1 -0
- package/dist-cjs/host/db/introspection/postgres.js +176 -0
- package/dist-cjs/host/db/introspection/postgres.js.map +1 -0
- package/dist-cjs/host/db/introspection/shared.js +133 -0
- package/dist-cjs/host/db/introspection/shared.js.map +1 -0
- package/dist-cjs/host/db/introspection/types.js +7 -0
- package/dist-cjs/host/db/introspection/types.js.map +1 -0
- package/dist-cjs/host/db/mongoAdapter.js +15 -1
- package/dist-cjs/host/db/mongoAdapter.js.map +1 -1
- package/dist-cjs/host/db/mssqlAdapter.js +5 -2
- package/dist-cjs/host/db/mssqlAdapter.js.map +1 -1
- package/dist-cjs/host/db/mysqlAdapter.js +13 -1
- package/dist-cjs/host/db/mysqlAdapter.js.map +1 -1
- package/dist-cjs/host/db/oracleAdapter.js +24 -1
- package/dist-cjs/host/db/oracleAdapter.js.map +1 -1
- package/dist-cjs/host/db/postgresAdapter.js +15 -1
- package/dist-cjs/host/db/postgresAdapter.js.map +1 -1
- package/dist-cjs/host/db/queryExecutor.js +5 -4
- package/dist-cjs/host/db/queryExecutor.js.map +1 -1
- package/dist-cjs/host/index.js +24 -1
- package/dist-cjs/host/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DbConnection } from "../types.js";
|
|
2
|
+
import { type ResolvedIntrospectOptions } from "./shared.js";
|
|
3
|
+
import type { DbSchema } from "./types.js";
|
|
4
|
+
export declare const formatOracleType: (row: {
|
|
5
|
+
DATA_TYPE?: unknown;
|
|
6
|
+
DATA_LENGTH?: unknown;
|
|
7
|
+
CHAR_LENGTH?: unknown;
|
|
8
|
+
DATA_PRECISION?: unknown;
|
|
9
|
+
DATA_SCALE?: unknown;
|
|
10
|
+
}) => string;
|
|
11
|
+
export declare const introspectOracle: (connection: DbConnection, options: ResolvedIntrospectOptions) => Promise<DbSchema>;
|
|
12
|
+
//# sourceMappingURL=oracle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oracle.d.ts","sourceRoot":"","sources":["../../../../src/host/db/introspection/oracle.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAA0F,KAAK,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACrJ,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,YAAY,CAAC;AA0D1D,eAAO,MAAM,gBAAgB,GAAI,KAAK;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,KAAG,MAc7J,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,YAAY,YAAY,EAAE,SAAS,yBAAyB,KAAG,OAAO,CAAC,QAAQ,CAmJ5G,CAAC"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
// Oracle schema introspection over the ALL_* data dictionary views (one
|
|
2
|
+
// connection, a handful of queries per schema/owner). The current schema is
|
|
3
|
+
// read unless owners are named; Oracle-maintained accounts are never listed.
|
|
4
|
+
import { withOracleConnection } from "../oracleAdapter.js";
|
|
5
|
+
import { asNumber, asString, emptyTable, finishTable, referentialAction, selectTables, tableKey } from "./shared.js";
|
|
6
|
+
const CURRENT_SCHEMA_SQL = "SELECT SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA') AS SCH FROM DUAL";
|
|
7
|
+
const DB_NAME_SQL = "SELECT SYS_CONTEXT('USERENV', 'DB_NAME') AS DB FROM DUAL";
|
|
8
|
+
const SCHEMAS_SQL = "SELECT USERNAME AS SCH FROM ALL_USERS WHERE ORACLE_MAINTAINED = 'N' ORDER BY 1";
|
|
9
|
+
const SCHEMAS_FALLBACK_SQL = `
|
|
10
|
+
SELECT USERNAME AS SCH FROM ALL_USERS
|
|
11
|
+
WHERE USERNAME NOT IN ('SYS', 'SYSTEM', 'OUTLN', 'XDB', 'CTXSYS', 'MDSYS', 'ORDSYS', 'ORDDATA', 'WMSYS', 'DBSNMP', 'APPQOSSYS', 'AUDSYS',
|
|
12
|
+
'GSMADMIN_INTERNAL', 'DVSYS', 'LBACSYS', 'OJVMSYS', 'OLAPSYS', 'ORACLE_OCM', 'REMOTE_SCHEDULER_AGENT', 'SYSBACKUP', 'SYSDG', 'SYSKM', 'SYSRAC',
|
|
13
|
+
'SYS$UMF', 'DBSFWUSER', 'GGSYS', 'ANONYMOUS', 'XS$NULL', 'DIP', 'APEX_PUBLIC_USER', 'FLOWS_FILES', 'MDDATA', 'SI_INFORMTN_SCHEMA', 'ORDPLUGINS',
|
|
14
|
+
'SPATIAL_CSW_ADMIN_USR', 'WKSYS', 'WKPROXY', 'WK_TEST', 'EXFSYS', 'DMSYS', 'TSMSYS', 'OWBSYS', 'OWBSYS_AUDIT', 'SCOTT', 'HR', 'OE', 'PM', 'IX', 'SH', 'BI')
|
|
15
|
+
ORDER BY 1`;
|
|
16
|
+
const TABLES_SQL = `
|
|
17
|
+
SELECT t.OWNER AS SCH, t.TABLE_NAME AS TBL, 'table' AS KIND, c.COMMENTS AS TABLE_COMMENT, t.NUM_ROWS AS ESTIMATE
|
|
18
|
+
FROM ALL_TABLES t
|
|
19
|
+
LEFT JOIN ALL_TAB_COMMENTS c ON c.OWNER = t.OWNER AND c.TABLE_NAME = t.TABLE_NAME
|
|
20
|
+
WHERE t.OWNER = :owner AND t.TABLE_NAME NOT LIKE 'BIN$%'
|
|
21
|
+
UNION ALL
|
|
22
|
+
SELECT v.OWNER, v.VIEW_NAME, 'view', c.COMMENTS, NULL
|
|
23
|
+
FROM ALL_VIEWS v
|
|
24
|
+
LEFT JOIN ALL_TAB_COMMENTS c ON c.OWNER = v.OWNER AND c.TABLE_NAME = v.VIEW_NAME
|
|
25
|
+
WHERE v.OWNER = :owner
|
|
26
|
+
ORDER BY 1, 2`;
|
|
27
|
+
const COLUMNS_SQL = `
|
|
28
|
+
SELECT c.TABLE_NAME AS TBL, c.COLUMN_NAME AS COL, c.COLUMN_ID AS ORDINAL, c.DATA_TYPE, c.DATA_LENGTH, c.CHAR_LENGTH,
|
|
29
|
+
c.DATA_PRECISION, c.DATA_SCALE, c.NULLABLE, c.DATA_DEFAULT, cc.COMMENTS AS COL_COMMENT
|
|
30
|
+
FROM ALL_TAB_COLUMNS c
|
|
31
|
+
LEFT JOIN ALL_COL_COMMENTS cc ON cc.OWNER = c.OWNER AND cc.TABLE_NAME = c.TABLE_NAME AND cc.COLUMN_NAME = c.COLUMN_NAME
|
|
32
|
+
WHERE c.OWNER = :owner
|
|
33
|
+
ORDER BY 1, 3`;
|
|
34
|
+
const CONSTRAINTS_SQL = `
|
|
35
|
+
SELECT c.TABLE_NAME AS TBL, c.CONSTRAINT_NAME AS CNAME, c.CONSTRAINT_TYPE AS CTYPE, cc.COLUMN_NAME AS COL, cc.POSITION AS POS,
|
|
36
|
+
c.R_OWNER AS REF_OWNER, c.R_CONSTRAINT_NAME AS REF_CNAME, c.DELETE_RULE AS ON_DELETE
|
|
37
|
+
FROM ALL_CONSTRAINTS c
|
|
38
|
+
JOIN ALL_CONS_COLUMNS cc ON cc.OWNER = c.OWNER AND cc.CONSTRAINT_NAME = c.CONSTRAINT_NAME AND cc.TABLE_NAME = c.TABLE_NAME
|
|
39
|
+
WHERE c.OWNER = :owner AND c.CONSTRAINT_TYPE IN ('P', 'U', 'R')
|
|
40
|
+
ORDER BY 1, 2, 5`;
|
|
41
|
+
const KEY_COLUMNS_SQL = `
|
|
42
|
+
SELECT cc.CONSTRAINT_NAME AS CNAME, cc.TABLE_NAME AS TBL, cc.COLUMN_NAME AS COL, cc.POSITION AS POS
|
|
43
|
+
FROM ALL_CONS_COLUMNS cc
|
|
44
|
+
JOIN ALL_CONSTRAINTS c ON c.OWNER = cc.OWNER AND c.CONSTRAINT_NAME = cc.CONSTRAINT_NAME
|
|
45
|
+
WHERE cc.OWNER = :owner AND c.CONSTRAINT_TYPE IN ('P', 'U')
|
|
46
|
+
ORDER BY 1, 4`;
|
|
47
|
+
const INDEXES_SQL = `
|
|
48
|
+
SELECT i.TABLE_NAME AS TBL, i.INDEX_NAME AS NAME, i.UNIQUENESS AS UNIQ, ic.COLUMN_NAME AS COL, ic.COLUMN_POSITION AS POS
|
|
49
|
+
FROM ALL_INDEXES i
|
|
50
|
+
JOIN ALL_IND_COLUMNS ic ON ic.INDEX_OWNER = i.OWNER AND ic.INDEX_NAME = i.INDEX_NAME
|
|
51
|
+
WHERE i.TABLE_OWNER = :owner
|
|
52
|
+
ORDER BY 1, 2, 5`;
|
|
53
|
+
// The type the way SQL Developer prints it: VARCHAR2(120), NUMBER(10,2), DATE.
|
|
54
|
+
export const formatOracleType = (row) => {
|
|
55
|
+
const type = String(row.DATA_TYPE ?? "").toUpperCase();
|
|
56
|
+
const charLength = asNumber(row.CHAR_LENGTH);
|
|
57
|
+
const dataLength = asNumber(row.DATA_LENGTH);
|
|
58
|
+
const precision = asNumber(row.DATA_PRECISION);
|
|
59
|
+
const scale = asNumber(row.DATA_SCALE);
|
|
60
|
+
if (["VARCHAR2", "NVARCHAR2", "CHAR", "NCHAR"].includes(type))
|
|
61
|
+
return `${type}(${charLength && charLength > 0 ? charLength : dataLength ?? ""})`.replace("()", "");
|
|
62
|
+
if (type === "RAW")
|
|
63
|
+
return dataLength !== undefined ? `RAW(${dataLength})` : type;
|
|
64
|
+
if (type === "NUMBER") {
|
|
65
|
+
if (precision !== undefined)
|
|
66
|
+
return scale ? `NUMBER(${precision},${scale})` : `NUMBER(${precision})`;
|
|
67
|
+
return "NUMBER";
|
|
68
|
+
}
|
|
69
|
+
if (type === "FLOAT")
|
|
70
|
+
return precision !== undefined ? `FLOAT(${precision})` : type;
|
|
71
|
+
return type;
|
|
72
|
+
};
|
|
73
|
+
export const introspectOracle = (connection, options) => withOracleConnection(connection, async (client, oracledb) => {
|
|
74
|
+
const query = async (sql, binds = {}) => {
|
|
75
|
+
const result = await client.execute(sql, binds, { outFormat: oracledb.OUT_FORMAT_OBJECT });
|
|
76
|
+
return Array.isArray(result?.rows) ? result.rows : [];
|
|
77
|
+
};
|
|
78
|
+
const warnings = [];
|
|
79
|
+
const current = String((await query(CURRENT_SCHEMA_SQL))[0]?.SCH ?? connection.username).toUpperCase();
|
|
80
|
+
let database;
|
|
81
|
+
try {
|
|
82
|
+
database = asString((await query(DB_NAME_SQL))[0]?.DB);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
database = connection.serviceName?.trim() || connection.database?.trim() || undefined;
|
|
86
|
+
}
|
|
87
|
+
let schemas;
|
|
88
|
+
try {
|
|
89
|
+
schemas = (await query(SCHEMAS_SQL)).map((row) => String(row.SCH));
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// ORACLE_MAINTAINED arrived in 12c; older servers get the static list.
|
|
93
|
+
schemas = (await query(SCHEMAS_FALLBACK_SQL)).map((row) => String(row.SCH));
|
|
94
|
+
}
|
|
95
|
+
if (!schemas.includes(current))
|
|
96
|
+
schemas.unshift(current);
|
|
97
|
+
const wanted = options.schemas ? options.schemas.map((name) => name.toUpperCase()) : [current];
|
|
98
|
+
const candidates = [];
|
|
99
|
+
for (const owner of wanted) {
|
|
100
|
+
for (const row of await query(TABLES_SQL, { owner })) {
|
|
101
|
+
candidates.push({
|
|
102
|
+
schema: String(row.SCH),
|
|
103
|
+
name: String(row.TBL),
|
|
104
|
+
kind: String(row.KIND) === "view" ? "view" : "table",
|
|
105
|
+
...(asString(row.TABLE_COMMENT) ? { comment: String(row.TABLE_COMMENT) } : {}),
|
|
106
|
+
...(asNumber(row.ESTIMATE) !== undefined ? { estimate: asNumber(row.ESTIMATE) } : {}),
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const { selected, truncated } = selectTables(candidates, options);
|
|
111
|
+
const tables = new Map();
|
|
112
|
+
for (const candidate of selected) {
|
|
113
|
+
tables.set(tableKey(candidate.schema, candidate.name), emptyTable(candidate, {
|
|
114
|
+
...(candidate.comment ? { comment: candidate.comment } : {}),
|
|
115
|
+
...(candidate.estimate !== undefined ? { rowCountEstimate: candidate.estimate } : {}),
|
|
116
|
+
}));
|
|
117
|
+
}
|
|
118
|
+
if (!options.objectsOnly && tables.size > 0) {
|
|
119
|
+
const detailOwners = [...new Set(selected.map((candidate) => candidate.schema))];
|
|
120
|
+
// Referenced key constraints, by owner + constraint name, for the FK ends.
|
|
121
|
+
const keyColumns = new Map();
|
|
122
|
+
const loadKeyColumns = async (owner) => {
|
|
123
|
+
for (const row of await query(KEY_COLUMNS_SQL, { owner })) {
|
|
124
|
+
const key = `${owner}.${row.CNAME}`;
|
|
125
|
+
const entry = keyColumns.get(key) ?? { table: String(row.TBL), columns: [] };
|
|
126
|
+
entry.columns.push(String(row.COL));
|
|
127
|
+
keyColumns.set(key, entry);
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
for (const owner of detailOwners) {
|
|
131
|
+
for (const row of await query(COLUMNS_SQL, { owner })) {
|
|
132
|
+
const table = tables.get(tableKey(owner, String(row.TBL)));
|
|
133
|
+
if (!table)
|
|
134
|
+
continue;
|
|
135
|
+
const defaultValue = asString(row.DATA_DEFAULT)?.trim();
|
|
136
|
+
table.columns.push({
|
|
137
|
+
name: String(row.COL),
|
|
138
|
+
dataType: formatOracleType(row),
|
|
139
|
+
ordinal: asNumber(row.ORDINAL) ?? table.columns.length + 1,
|
|
140
|
+
nullable: String(row.NULLABLE ?? "Y").toUpperCase() === "Y",
|
|
141
|
+
primaryKey: false,
|
|
142
|
+
...(defaultValue ? { defaultValue } : {}),
|
|
143
|
+
...(defaultValue && /\.NEXTVAL$/i.test(defaultValue) ? { autoIncrement: true } : {}),
|
|
144
|
+
...(asString(row.COL_COMMENT) ? { comment: String(row.COL_COMMENT) } : {}),
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
await loadKeyColumns(owner);
|
|
148
|
+
const groups = new Map();
|
|
149
|
+
for (const row of await query(CONSTRAINTS_SQL, { owner })) {
|
|
150
|
+
const table = tables.get(tableKey(owner, String(row.TBL)));
|
|
151
|
+
if (!table)
|
|
152
|
+
continue;
|
|
153
|
+
const key = `${row.TBL}.${row.CNAME}`;
|
|
154
|
+
let group = groups.get(key);
|
|
155
|
+
if (!group) {
|
|
156
|
+
group = {
|
|
157
|
+
table,
|
|
158
|
+
name: String(row.CNAME),
|
|
159
|
+
type: String(row.CTYPE),
|
|
160
|
+
columns: [],
|
|
161
|
+
...(asString(row.REF_OWNER) ? { refOwner: String(row.REF_OWNER) } : {}),
|
|
162
|
+
...(asString(row.REF_CNAME) ? { refName: String(row.REF_CNAME) } : {}),
|
|
163
|
+
...(referentialAction(row.ON_DELETE) ? { onDelete: referentialAction(row.ON_DELETE) } : {}),
|
|
164
|
+
};
|
|
165
|
+
groups.set(key, group);
|
|
166
|
+
}
|
|
167
|
+
group.columns.push(String(row.COL));
|
|
168
|
+
}
|
|
169
|
+
for (const group of groups.values()) {
|
|
170
|
+
if (group.type === "P")
|
|
171
|
+
group.table.primaryKey = group.columns;
|
|
172
|
+
else if (group.type === "U")
|
|
173
|
+
group.table.indexes.push({ name: group.name, columns: group.columns, unique: true });
|
|
174
|
+
else if (group.type === "R" && group.refOwner && group.refName) {
|
|
175
|
+
if (!detailOwners.includes(group.refOwner) && ![...keyColumns.keys()].some((key) => key.startsWith(`${group.refOwner}.`)))
|
|
176
|
+
await loadKeyColumns(group.refOwner);
|
|
177
|
+
const referenced = keyColumns.get(`${group.refOwner}.${group.refName}`);
|
|
178
|
+
if (!referenced) {
|
|
179
|
+
warnings.push(`Foreign key ${group.name} on ${owner}.${group.table.name} references a key this connection cannot read.`);
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
group.table.foreignKeys.push({
|
|
183
|
+
name: group.name,
|
|
184
|
+
columns: group.columns,
|
|
185
|
+
refSchema: group.refOwner,
|
|
186
|
+
refTable: referenced.table,
|
|
187
|
+
refColumns: referenced.columns,
|
|
188
|
+
...(group.onDelete ? { onDelete: group.onDelete } : {}),
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
const indexGroups = new Map();
|
|
193
|
+
for (const row of await query(INDEXES_SQL, { owner })) {
|
|
194
|
+
const table = tables.get(tableKey(owner, String(row.TBL)));
|
|
195
|
+
if (!table)
|
|
196
|
+
continue;
|
|
197
|
+
const key = `${row.TBL}.${row.NAME}`;
|
|
198
|
+
let group = indexGroups.get(key);
|
|
199
|
+
if (!group) {
|
|
200
|
+
group = { table, name: String(row.NAME), unique: String(row.UNIQ ?? "").toUpperCase() === "UNIQUE", columns: [] };
|
|
201
|
+
indexGroups.set(key, group);
|
|
202
|
+
}
|
|
203
|
+
group.columns.push(String(row.COL));
|
|
204
|
+
}
|
|
205
|
+
for (const group of indexGroups.values()) {
|
|
206
|
+
if (group.table.indexes.some((index) => index.name === group.name))
|
|
207
|
+
continue;
|
|
208
|
+
const primary = group.unique && group.table.primaryKey.length > 0 && group.columns.join(",") === group.table.primaryKey.join(",");
|
|
209
|
+
group.table.indexes.push({ name: group.name, columns: group.columns, unique: group.unique, ...(primary ? { primary: true } : {}) });
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
for (const table of tables.values())
|
|
213
|
+
finishTable(table);
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
dialect: "oracle",
|
|
217
|
+
...(database ? { database } : {}),
|
|
218
|
+
schemas,
|
|
219
|
+
tables: [...tables.values()],
|
|
220
|
+
capturedAt: new Date().toISOString(),
|
|
221
|
+
warnings,
|
|
222
|
+
...(truncated ? { truncated: true } : {}),
|
|
223
|
+
};
|
|
224
|
+
});
|
|
225
|
+
//# sourceMappingURL=oracle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oracle.js","sourceRoot":"","sources":["../../../../src/host/db/introspection/oracle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { DbConnection } from "../types.js";
|
|
2
|
+
import { type ResolvedIntrospectOptions } from "./shared.js";
|
|
3
|
+
import type { DbSchema } from "./types.js";
|
|
4
|
+
export declare const introspectPostgres: (connection: DbConnection, options: ResolvedIntrospectOptions) => Promise<DbSchema>;
|
|
5
|
+
//# sourceMappingURL=postgres.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../../../src/host/db/introspection/postgres.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EASL,KAAK,yBAAyB,EAC/B,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,YAAY,CAAC;AAiF1D,eAAO,MAAM,kBAAkB,GAAI,YAAY,YAAY,EAAE,SAAS,yBAAyB,KAAG,OAAO,CAAC,QAAQ,CA2F9G,CAAC"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
// PostgreSQL schema introspection over pg_catalog (one client, five catalog
|
|
2
|
+
// queries). information_schema is avoided on purpose: it hides objects the
|
|
3
|
+
// role does not own and formats types less faithfully than format_type().
|
|
4
|
+
import { withPostgresClient } from "../postgresAdapter.js";
|
|
5
|
+
import { asBoolean, asNumber, asString, emptyTable, finishTable, referentialAction, selectTables, tableKey, } from "./shared.js";
|
|
6
|
+
const SCHEMAS_SQL = `
|
|
7
|
+
SELECT n.nspname AS sch
|
|
8
|
+
FROM pg_namespace n
|
|
9
|
+
WHERE n.nspname NOT IN ('pg_catalog', 'information_schema', 'pg_toast')
|
|
10
|
+
AND n.nspname NOT LIKE 'pg\\_temp\\_%'
|
|
11
|
+
AND n.nspname NOT LIKE 'pg\\_toast\\_temp\\_%'
|
|
12
|
+
ORDER BY 1`;
|
|
13
|
+
const TABLES_SQL = `
|
|
14
|
+
SELECT n.nspname AS sch, c.relname AS tbl, c.relkind::text AS kind,
|
|
15
|
+
obj_description(c.oid, 'pg_class') AS comment,
|
|
16
|
+
GREATEST(c.reltuples, 0)::bigint AS estimate
|
|
17
|
+
FROM pg_class c
|
|
18
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
19
|
+
WHERE n.nspname = ANY($1::text[]) AND c.relkind::text = ANY($2::text[])
|
|
20
|
+
ORDER BY 1, 2`;
|
|
21
|
+
const COLUMNS_SQL = `
|
|
22
|
+
SELECT n.nspname AS sch, c.relname AS tbl, a.attname AS col, a.attnum AS ordinal,
|
|
23
|
+
format_type(a.atttypid, a.atttypmod) AS data_type,
|
|
24
|
+
NOT a.attnotnull AS nullable,
|
|
25
|
+
pg_get_expr(d.adbin, d.adrelid) AS default_value,
|
|
26
|
+
col_description(c.oid, a.attnum) AS comment,
|
|
27
|
+
(a.attidentity <> '') AS identity
|
|
28
|
+
FROM pg_attribute a
|
|
29
|
+
JOIN pg_class c ON c.oid = a.attrelid
|
|
30
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
31
|
+
LEFT JOIN pg_attrdef d ON d.adrelid = a.attrelid AND d.adnum = a.attnum
|
|
32
|
+
WHERE a.attnum > 0 AND NOT a.attisdropped
|
|
33
|
+
AND n.nspname = ANY($1::text[]) AND c.relkind::text = ANY($2::text[])
|
|
34
|
+
ORDER BY 1, 2, 4`;
|
|
35
|
+
const CONSTRAINTS_SQL = `
|
|
36
|
+
SELECT con.conname AS cname, con.contype::text AS ctype, n.nspname AS sch, c.relname AS tbl,
|
|
37
|
+
(SELECT array_agg(a.attname ORDER BY k.ord)
|
|
38
|
+
FROM unnest(con.conkey) WITH ORDINALITY AS k(attnum, ord)
|
|
39
|
+
JOIN pg_attribute a ON a.attrelid = con.conrelid AND a.attnum = k.attnum) AS cols,
|
|
40
|
+
fn.nspname AS ref_sch, fc.relname AS ref_tbl,
|
|
41
|
+
(SELECT array_agg(a.attname ORDER BY k.ord)
|
|
42
|
+
FROM unnest(con.confkey) WITH ORDINALITY AS k(attnum, ord)
|
|
43
|
+
JOIN pg_attribute a ON a.attrelid = con.confrelid AND a.attnum = k.attnum) AS ref_cols,
|
|
44
|
+
con.confdeltype::text AS on_delete, con.confupdtype::text AS on_update
|
|
45
|
+
FROM pg_constraint con
|
|
46
|
+
JOIN pg_class c ON c.oid = con.conrelid
|
|
47
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
48
|
+
LEFT JOIN pg_class fc ON fc.oid = con.confrelid
|
|
49
|
+
LEFT JOIN pg_namespace fn ON fn.oid = fc.relnamespace
|
|
50
|
+
WHERE con.contype IN ('p', 'u', 'f') AND n.nspname = ANY($1::text[])
|
|
51
|
+
ORDER BY 3, 4, 1`;
|
|
52
|
+
const INDEXES_SQL = `
|
|
53
|
+
SELECT n.nspname AS sch, t.relname AS tbl, i.relname AS name,
|
|
54
|
+
ix.indisunique AS is_unique, ix.indisprimary AS is_primary,
|
|
55
|
+
(SELECT array_agg(a.attname ORDER BY k.ord)
|
|
56
|
+
FROM unnest(ix.indkey::int2[]) WITH ORDINALITY AS k(attnum, ord)
|
|
57
|
+
JOIN pg_attribute a ON a.attrelid = ix.indrelid AND a.attnum = k.attnum
|
|
58
|
+
WHERE k.attnum > 0) AS cols
|
|
59
|
+
FROM pg_index ix
|
|
60
|
+
JOIN pg_class t ON t.oid = ix.indrelid
|
|
61
|
+
JOIN pg_class i ON i.oid = ix.indexrelid
|
|
62
|
+
JOIN pg_namespace n ON n.oid = t.relnamespace
|
|
63
|
+
WHERE n.nspname = ANY($1::text[])
|
|
64
|
+
ORDER BY 1, 2, 3`;
|
|
65
|
+
const asList = (value) => {
|
|
66
|
+
if (Array.isArray(value))
|
|
67
|
+
return value.map(String);
|
|
68
|
+
if (typeof value === "string") {
|
|
69
|
+
// pg returns text[] as arrays, but a driver without type parsing may hand
|
|
70
|
+
// back the "{a,b}" literal.
|
|
71
|
+
const inner = value.replace(/^\{|\}$/g, "");
|
|
72
|
+
return inner ? inner.split(",").map((item) => item.replace(/^"|"$/g, "")) : [];
|
|
73
|
+
}
|
|
74
|
+
return [];
|
|
75
|
+
};
|
|
76
|
+
const kindOf = (relkind) => (relkind === "v" || relkind === "m" ? "view" : "table");
|
|
77
|
+
export const introspectPostgres = (connection, options) => withPostgresClient(connection, async (client) => {
|
|
78
|
+
const query = async (sql, params = []) => {
|
|
79
|
+
const result = await client.query(sql, params);
|
|
80
|
+
return Array.isArray(result?.rows) ? result.rows : [];
|
|
81
|
+
};
|
|
82
|
+
const warnings = [];
|
|
83
|
+
const databaseRow = (await query("SELECT current_database() AS db"))[0];
|
|
84
|
+
const schemas = (await query(SCHEMAS_SQL)).map((row) => String(row.sch));
|
|
85
|
+
const wanted = options.schemas ? options.schemas.filter((name) => schemas.includes(name)) : schemas;
|
|
86
|
+
for (const name of options.schemas ?? [])
|
|
87
|
+
if (!schemas.includes(name))
|
|
88
|
+
warnings.push(`Schema "${name}" is not visible to this connection.`);
|
|
89
|
+
const kinds = options.includeViews ? ["r", "p", "f", "v", "m"] : ["r", "p", "f"];
|
|
90
|
+
const tableRows = wanted.length > 0 ? await query(TABLES_SQL, [wanted, kinds]) : [];
|
|
91
|
+
const candidates = tableRows.map((row) => ({
|
|
92
|
+
schema: String(row.sch),
|
|
93
|
+
name: String(row.tbl),
|
|
94
|
+
kind: kindOf(String(row.kind)),
|
|
95
|
+
comment: asString(row.comment),
|
|
96
|
+
estimate: asNumber(row.estimate),
|
|
97
|
+
}));
|
|
98
|
+
const { selected, truncated } = selectTables(candidates, options);
|
|
99
|
+
const tables = new Map();
|
|
100
|
+
for (const candidate of selected) {
|
|
101
|
+
tables.set(tableKey(candidate.schema, candidate.name), emptyTable(candidate, {
|
|
102
|
+
...(candidate.comment ? { comment: candidate.comment } : {}),
|
|
103
|
+
...(candidate.estimate !== undefined ? { rowCountEstimate: candidate.estimate } : {}),
|
|
104
|
+
}));
|
|
105
|
+
}
|
|
106
|
+
if (!options.objectsOnly && tables.size > 0) {
|
|
107
|
+
const detailSchemas = [...new Set(selected.map((candidate) => candidate.schema))];
|
|
108
|
+
for (const row of await query(COLUMNS_SQL, [detailSchemas, kinds])) {
|
|
109
|
+
const table = tables.get(tableKey(String(row.sch), String(row.tbl)));
|
|
110
|
+
if (!table)
|
|
111
|
+
continue;
|
|
112
|
+
const defaultValue = asString(row.default_value);
|
|
113
|
+
table.columns.push({
|
|
114
|
+
name: String(row.col),
|
|
115
|
+
dataType: String(row.data_type),
|
|
116
|
+
ordinal: asNumber(row.ordinal) ?? table.columns.length + 1,
|
|
117
|
+
nullable: asBoolean(row.nullable),
|
|
118
|
+
primaryKey: false,
|
|
119
|
+
...(defaultValue !== undefined ? { defaultValue } : {}),
|
|
120
|
+
...(asBoolean(row.identity) || /^nextval\(/i.test(defaultValue ?? "") ? { autoIncrement: true } : {}),
|
|
121
|
+
...(asString(row.comment) ? { comment: asString(row.comment) } : {}),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
for (const row of await query(CONSTRAINTS_SQL, [detailSchemas])) {
|
|
125
|
+
const table = tables.get(tableKey(String(row.sch), String(row.tbl)));
|
|
126
|
+
if (!table)
|
|
127
|
+
continue;
|
|
128
|
+
const columns = asList(row.cols);
|
|
129
|
+
const type = String(row.ctype);
|
|
130
|
+
if (type === "p")
|
|
131
|
+
table.primaryKey = columns;
|
|
132
|
+
else if (type === "u") {
|
|
133
|
+
table.indexes.push({ name: String(row.cname), columns, unique: true });
|
|
134
|
+
}
|
|
135
|
+
else if (type === "f") {
|
|
136
|
+
table.foreignKeys.push({
|
|
137
|
+
name: String(row.cname),
|
|
138
|
+
columns,
|
|
139
|
+
...(asString(row.ref_sch) ? { refSchema: String(row.ref_sch) } : {}),
|
|
140
|
+
refTable: String(row.ref_tbl ?? ""),
|
|
141
|
+
refColumns: asList(row.ref_cols),
|
|
142
|
+
...(referentialAction(row.on_delete) ? { onDelete: referentialAction(row.on_delete) } : {}),
|
|
143
|
+
...(referentialAction(row.on_update) ? { onUpdate: referentialAction(row.on_update) } : {}),
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
for (const row of await query(INDEXES_SQL, [detailSchemas])) {
|
|
148
|
+
const table = tables.get(tableKey(String(row.sch), String(row.tbl)));
|
|
149
|
+
if (!table)
|
|
150
|
+
continue;
|
|
151
|
+
const name = String(row.name);
|
|
152
|
+
if (table.indexes.some((index) => index.name === name))
|
|
153
|
+
continue; // the unique constraint already listed it
|
|
154
|
+
const columns = asList(row.cols);
|
|
155
|
+
if (columns.length === 0)
|
|
156
|
+
continue; // expression index
|
|
157
|
+
table.indexes.push({ name, columns, unique: asBoolean(row.is_unique), ...(asBoolean(row.is_primary) ? { primary: true } : {}) });
|
|
158
|
+
}
|
|
159
|
+
for (const table of tables.values())
|
|
160
|
+
finishTable(table);
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
dialect: "postgres",
|
|
164
|
+
...(asString(databaseRow?.db) ? { database: String(databaseRow.db) } : {}),
|
|
165
|
+
schemas,
|
|
166
|
+
tables: [...tables.values()],
|
|
167
|
+
capturedAt: new Date().toISOString(),
|
|
168
|
+
warnings,
|
|
169
|
+
...(truncated ? { truncated: true } : {}),
|
|
170
|
+
};
|
|
171
|
+
});
|
|
172
|
+
//# sourceMappingURL=postgres.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../../../src/host/db/introspection/postgres.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,2EAA2E;AAC3E,0EAA0E;AAE1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EACL,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,QAAQ,GAET,MAAM,aAAa,CAAC;AAKrB,MAAM,WAAW,GAAG;;;;;;WAMT,CAAC;AAEZ,MAAM,UAAU,GAAG;;;;;;;cAOL,CAAC;AAEf,MAAM,WAAW,GAAG;;;;;;;;;;;;;iBAaH,CAAC;AAElB,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;iBAgBP,CAAC;AAElB,MAAM,WAAW,GAAG;;;;;;;;;;;;iBAYH,CAAC;AAElB,MAAM,MAAM,GAAG,CAAC,KAAc,EAAY,EAAE;IAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,0EAA0E;QAC1E,4BAA4B;QAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC5C,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjF,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,OAAe,EAAoB,EAAE,CAAC,CAAC,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AAE9G,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,UAAwB,EAAE,OAAkC,EAAqB,EAAE,CACpH,kBAAkB,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;IAC9C,MAAM,KAAK,GAAG,KAAK,EAAE,GAAW,EAAE,SAAoB,EAAE,EAAkB,EAAE;QAC1E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC/C,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAE,MAAM,CAAC,IAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,CAAC,CAAC;IACF,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,WAAW,GAAG,CAAC,MAAM,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACpG,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,OAAO,IAAI,EAAE;QAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,IAAI,sCAAsC,CAAC,CAAC;IAC5I,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAEjF,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpF,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACzC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;QACvB,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;QAC9B,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;KACjC,CAAC,CAAC,CAAC;IACJ,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAChD,KAAK,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,CACR,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,EAC1C,UAAU,CAAC,SAAS,EAAE;YACpB,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,GAAG,CAAC,SAAS,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtF,CAAC,CACH,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAClF,KAAK,MAAM,GAAG,IAAI,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YACnE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACrE,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACjD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;gBACjB,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;gBACrB,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;gBAC/B,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;gBAC1D,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;gBACjC,UAAU,EAAE,KAAK;gBACjB,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvD,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACrE,CAAC,CAAC;QACL,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,MAAM,KAAK,CAAC,eAAe,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;YAChE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACrE,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,IAAI,KAAK,GAAG;gBAAE,KAAK,CAAC,UAAU,GAAG,OAAO,CAAC;iBACxC,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACtB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACzE,CAAC;iBAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACxB,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;oBACrB,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;oBACvB,OAAO;oBACP,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACpE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;oBACnC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;oBAChC,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3F,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC5F,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;YAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACrE,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;gBAAE,SAAS,CAAC,0CAA0C;YAC5G,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS,CAAC,mBAAmB;YACvD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACnI,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE;YAAE,WAAW,CAAC,KAAK,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO;QACL,OAAO,EAAE,UAAU;QACnB,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,OAAO;QACP,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAC5B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,QAAQ;QACR,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1C,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { DbIntrospectOptions, DbSchemaObjectKind, DbSchemaTable } from "./types.js";
|
|
2
|
+
export interface ResolvedIntrospectOptions {
|
|
3
|
+
schemas?: string[];
|
|
4
|
+
tables?: string[];
|
|
5
|
+
includeViews: boolean;
|
|
6
|
+
objectsOnly: boolean;
|
|
7
|
+
sampleSize: number;
|
|
8
|
+
maxTables: number;
|
|
9
|
+
}
|
|
10
|
+
export declare const resolveIntrospectOptions: (options?: DbIntrospectOptions) => ResolvedIntrospectOptions;
|
|
11
|
+
export declare const tableKey: (schema: string | undefined, name: string) => string;
|
|
12
|
+
export declare const tableMatchesFilter: (schema: string | undefined, name: string, filters: string[] | undefined) => boolean;
|
|
13
|
+
export interface TableCandidate {
|
|
14
|
+
schema?: string;
|
|
15
|
+
name: string;
|
|
16
|
+
kind: DbSchemaObjectKind;
|
|
17
|
+
}
|
|
18
|
+
export declare const selectTables: <T extends TableCandidate>(candidates: T[], options: ResolvedIntrospectOptions) => {
|
|
19
|
+
selected: T[];
|
|
20
|
+
truncated: boolean;
|
|
21
|
+
};
|
|
22
|
+
export declare const emptyTable: (candidate: TableCandidate, extra?: Partial<DbSchemaTable>) => DbSchemaTable;
|
|
23
|
+
export declare const asString: (value: unknown) => string | undefined;
|
|
24
|
+
export declare const asNumber: (value: unknown) => number | undefined;
|
|
25
|
+
export declare const asBoolean: (value: unknown) => boolean;
|
|
26
|
+
export declare const referentialAction: (value: unknown) => string | undefined;
|
|
27
|
+
export declare const markUniqueColumns: (table: DbSchemaTable) => void;
|
|
28
|
+
export declare const finishTable: (table: DbSchemaTable) => DbSchemaTable;
|
|
29
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../src/host/db/introspection/shared.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEzF,MAAM,WAAW,yBAAyB;IACxC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,eAAO,MAAM,wBAAwB,GAAI,UAAS,mBAAwB,KAAG,yBAW5E,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,QAAQ,MAAM,GAAG,SAAS,EAAE,MAAM,MAAM,KAAG,MAA+C,CAAC;AAKpH,eAAO,MAAM,kBAAkB,GAAI,QAAQ,MAAM,GAAG,SAAS,EAAE,MAAM,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,KAAG,OAQ5G,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAKD,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,cAAc,EACnD,YAAY,CAAC,EAAE,EACf,SAAS,yBAAyB,KACjC;IAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAMrC,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,WAAW,cAAc,EAAE,QAAO,OAAO,CAAC,aAAa,CAAM,KAAG,aASzF,CAAC;AAEH,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAIlD,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAIlD,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,OAAO,OAAO,KAAG,OAK1C,CAAC;AAGF,eAAO,MAAM,iBAAiB,GAAI,OAAO,OAAO,KAAG,MAAM,GAAG,SAuB3D,CAAC;AAGF,eAAO,MAAM,iBAAiB,GAAI,OAAO,aAAa,KAAG,IAUxD,CAAC;AAGF,eAAO,MAAM,WAAW,GAAI,OAAO,aAAa,KAAG,aAMlD,CAAC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// Helpers every dialect's introspection shares: the resolved options, the
|
|
2
|
+
// table filter, the size cap and small normalisers.
|
|
3
|
+
const clamp = (value, min, max) => Math.min(max, Math.max(min, value));
|
|
4
|
+
export const resolveIntrospectOptions = (options = {}) => {
|
|
5
|
+
const schemas = options.schemas?.map((name) => name.trim()).filter(Boolean);
|
|
6
|
+
const tables = options.tables?.map((name) => name.trim()).filter(Boolean);
|
|
7
|
+
return {
|
|
8
|
+
...(schemas && schemas.length > 0 ? { schemas } : {}),
|
|
9
|
+
...(tables && tables.length > 0 ? { tables } : {}),
|
|
10
|
+
includeViews: options.includeViews !== false,
|
|
11
|
+
objectsOnly: Boolean(options.objectsOnly),
|
|
12
|
+
sampleSize: clamp(Math.round(Number(options.sampleSize) || 100), 1, 1000),
|
|
13
|
+
maxTables: clamp(Math.round(Number(options.maxTables) || 2000), 1, 20000),
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export const tableKey = (schema, name) => (schema ? `${schema}.${name}` : name);
|
|
17
|
+
// "schema.table" matches the qualified name, a bare name matches the table
|
|
18
|
+
// name in any schema; both case-insensitive (Oracle upper-cases, Postgres
|
|
19
|
+
// lower-cases, SQL Server does not care).
|
|
20
|
+
export const tableMatchesFilter = (schema, name, filters) => {
|
|
21
|
+
if (!filters || filters.length === 0)
|
|
22
|
+
return true;
|
|
23
|
+
const qualified = tableKey(schema, name).toLowerCase();
|
|
24
|
+
const bare = name.toLowerCase();
|
|
25
|
+
return filters.some((filter) => {
|
|
26
|
+
const wanted = filter.toLowerCase();
|
|
27
|
+
return wanted.includes(".") ? wanted === qualified : wanted === bare;
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
// Views, the explicit table filter and the cap, applied in the order the
|
|
31
|
+
// database listed the objects. Returns the kept candidates and whether the
|
|
32
|
+
// cap cut anything.
|
|
33
|
+
export const selectTables = (candidates, options) => {
|
|
34
|
+
const filtered = candidates.filter((candidate) => (options.includeViews || candidate.kind !== "view") && tableMatchesFilter(candidate.schema, candidate.name, options.tables));
|
|
35
|
+
if (filtered.length <= options.maxTables)
|
|
36
|
+
return { selected: filtered, truncated: false };
|
|
37
|
+
return { selected: filtered.slice(0, options.maxTables), truncated: true };
|
|
38
|
+
};
|
|
39
|
+
export const emptyTable = (candidate, extra = {}) => ({
|
|
40
|
+
...(candidate.schema ? { schema: candidate.schema } : {}),
|
|
41
|
+
name: candidate.name,
|
|
42
|
+
kind: candidate.kind,
|
|
43
|
+
columns: [],
|
|
44
|
+
primaryKey: [],
|
|
45
|
+
foreignKeys: [],
|
|
46
|
+
indexes: [],
|
|
47
|
+
...extra,
|
|
48
|
+
});
|
|
49
|
+
export const asString = (value) => {
|
|
50
|
+
if (value === null || value === undefined)
|
|
51
|
+
return undefined;
|
|
52
|
+
const text = String(value);
|
|
53
|
+
return text.length > 0 ? text : undefined;
|
|
54
|
+
};
|
|
55
|
+
export const asNumber = (value) => {
|
|
56
|
+
if (value === null || value === undefined || value === "")
|
|
57
|
+
return undefined;
|
|
58
|
+
const number = Number(value);
|
|
59
|
+
return Number.isFinite(number) ? number : undefined;
|
|
60
|
+
};
|
|
61
|
+
export const asBoolean = (value) => {
|
|
62
|
+
if (typeof value === "boolean")
|
|
63
|
+
return value;
|
|
64
|
+
if (typeof value === "number")
|
|
65
|
+
return value !== 0;
|
|
66
|
+
if (typeof value === "string")
|
|
67
|
+
return /^(1|true|yes|y|t)$/i.test(value.trim());
|
|
68
|
+
return Boolean(value);
|
|
69
|
+
};
|
|
70
|
+
// Referential actions the way SQL spells them, from the dialect's codes.
|
|
71
|
+
export const referentialAction = (value) => {
|
|
72
|
+
const text = asString(value);
|
|
73
|
+
if (!text)
|
|
74
|
+
return undefined;
|
|
75
|
+
const upper = text.trim().toUpperCase().replace(/_/g, " ");
|
|
76
|
+
switch (upper) {
|
|
77
|
+
case "A":
|
|
78
|
+
case "NO ACTION":
|
|
79
|
+
return "NO ACTION";
|
|
80
|
+
case "R":
|
|
81
|
+
case "RESTRICT":
|
|
82
|
+
return "RESTRICT";
|
|
83
|
+
case "C":
|
|
84
|
+
case "CASCADE":
|
|
85
|
+
return "CASCADE";
|
|
86
|
+
case "N":
|
|
87
|
+
case "SET NULL":
|
|
88
|
+
return "SET NULL";
|
|
89
|
+
case "D":
|
|
90
|
+
case "SET DEFAULT":
|
|
91
|
+
return "SET DEFAULT";
|
|
92
|
+
default:
|
|
93
|
+
return upper;
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
// Mark the columns a single-column unique constraint/index covers.
|
|
97
|
+
export const markUniqueColumns = (table) => {
|
|
98
|
+
const unique = new Set();
|
|
99
|
+
const primary = new Set(table.primaryKey);
|
|
100
|
+
for (const index of table.indexes) {
|
|
101
|
+
if (!index.unique || index.primary || index.columns.length !== 1 || primary.has(index.columns[0]))
|
|
102
|
+
continue;
|
|
103
|
+
unique.add(index.columns[0]);
|
|
104
|
+
}
|
|
105
|
+
for (const column of table.columns) {
|
|
106
|
+
if (unique.has(column.name) && !column.primaryKey)
|
|
107
|
+
column.unique = true;
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
// Column order and primary-key flags from the table's key list.
|
|
111
|
+
export const finishTable = (table) => {
|
|
112
|
+
table.columns.sort((a, b) => a.ordinal - b.ordinal);
|
|
113
|
+
const primary = new Set(table.primaryKey);
|
|
114
|
+
for (const column of table.columns)
|
|
115
|
+
column.primaryKey = primary.has(column.name);
|
|
116
|
+
markUniqueColumns(table);
|
|
117
|
+
return table;
|
|
118
|
+
};
|
|
119
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../src/host/db/introspection/shared.ts"],"names":[],"mappings":"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"}
|