@thinkdata/cli 0.2.0 → 0.2.1
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/bin/thinkdata.js +14 -2
- package/dist/bin/thinkdata.js.map +1 -1
- package/dist/commands/auth.d.ts +9 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +61 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/compare.d.ts +1 -0
- package/dist/commands/compare.d.ts.map +1 -1
- package/dist/commands/compare.js +2 -2
- package/dist/commands/compare.js.map +1 -1
- package/dist/commands/extract.d.ts +1 -0
- package/dist/commands/extract.d.ts.map +1 -1
- package/dist/commands/extract.js +40 -10
- package/dist/commands/extract.js.map +1 -1
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +100 -1
- package/dist/commands/serve.js.map +1 -1
- package/dist/extractors/index.d.ts.map +1 -1
- package/dist/extractors/index.js +7 -2
- package/dist/extractors/index.js.map +1 -1
- package/dist/extractors/mssql.d.ts +14 -0
- package/dist/extractors/mssql.d.ts.map +1 -0
- package/dist/extractors/mssql.js +234 -0
- package/dist/extractors/mssql.js.map +1 -0
- package/dist/extractors/mysql.d.ts +4 -2
- package/dist/extractors/mysql.d.ts.map +1 -1
- package/dist/extractors/mysql.js +30 -8
- package/dist/extractors/mysql.js.map +1 -1
- package/dist/extractors/oracle.d.ts +13 -0
- package/dist/extractors/oracle.d.ts.map +1 -0
- package/dist/extractors/oracle.js +189 -0
- package/dist/extractors/oracle.js.map +1 -0
- package/dist/extractors/postgres.d.ts +6 -3
- package/dist/extractors/postgres.d.ts.map +1 -1
- package/dist/extractors/postgres.js +63 -13
- package/dist/extractors/postgres.js.map +1 -1
- package/dist/types.d.ts +16 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +19 -6
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SchemaExtractor, ConnectionConfig, ExtractedSchema, ExtractProgressCallback } from '../types.js';
|
|
2
|
+
export declare class MSSQLExtractor implements SchemaExtractor {
|
|
3
|
+
testConnection(config: ConnectionConfig): Promise<string>;
|
|
4
|
+
extract(config: ConnectionConfig, onProgress?: ExtractProgressCallback): Promise<ExtractedSchema>;
|
|
5
|
+
private createConnection;
|
|
6
|
+
private getVersion;
|
|
7
|
+
private getTables;
|
|
8
|
+
private getPrimaryKeys;
|
|
9
|
+
private getForeignKeys;
|
|
10
|
+
private getIndexes;
|
|
11
|
+
private buildPKMap;
|
|
12
|
+
private buildIndexMap;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=mssql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mssql.d.ts","sourceRoot":"","sources":["../../src/extractors/mssql.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACR,eAAe,EACf,gBAAgB,EAChB,eAAe,EAKf,uBAAuB,EAC1B,MAAM,aAAa,CAAC;AAErB,qBAAa,cAAe,YAAW,eAAe;IAC5C,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAUzD,OAAO,CAAC,MAAM,EAAE,gBAAgB,EAAE,UAAU,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,eAAe,CAAC;YA8DzF,gBAAgB;YAehB,UAAU;YAKV,SAAS;YAiDT,cAAc;YAYd,cAAc;YA6Cd,UAAU;IAoBxB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,aAAa;CAmBxB"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQL Server (MSSQL) 스키마 추출기
|
|
3
|
+
*/
|
|
4
|
+
import sql from 'mssql';
|
|
5
|
+
export class MSSQLExtractor {
|
|
6
|
+
async testConnection(config) {
|
|
7
|
+
const pool = await this.createConnection(config);
|
|
8
|
+
try {
|
|
9
|
+
const result = await pool.request().query('SELECT @@version AS ver');
|
|
10
|
+
return result.recordset[0].ver;
|
|
11
|
+
}
|
|
12
|
+
finally {
|
|
13
|
+
await pool.close();
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
async extract(config, onProgress) {
|
|
17
|
+
const pool = await this.createConnection(config);
|
|
18
|
+
const schema = config.schema || 'dbo';
|
|
19
|
+
try {
|
|
20
|
+
onProgress?.(`Connecting to SQL Server at ${config.host}...`);
|
|
21
|
+
onProgress?.(`Fetching server version...`);
|
|
22
|
+
const version = await this.getVersion(pool);
|
|
23
|
+
onProgress?.(`Fetching tables and columns from schema '${schema}'...`);
|
|
24
|
+
const tables = await this.getTables(pool, schema);
|
|
25
|
+
onProgress?.(`Found ${tables.length} tables.`);
|
|
26
|
+
onProgress?.(`Fetching primary keys...`);
|
|
27
|
+
const pks = await this.getPrimaryKeys(pool, schema);
|
|
28
|
+
onProgress?.(`Fetching foreign keys...`);
|
|
29
|
+
const fks = await this.getForeignKeys(pool, schema);
|
|
30
|
+
onProgress?.(`Fetching indexes...`);
|
|
31
|
+
const indexes = await this.getIndexes(pool, schema);
|
|
32
|
+
onProgress?.(`Building relationships and formatting output...`);
|
|
33
|
+
const pkMap = this.buildPKMap(pks);
|
|
34
|
+
const indexMap = this.buildIndexMap(indexes);
|
|
35
|
+
const extractedTables = tables.map((t) => ({
|
|
36
|
+
name: t.table_name,
|
|
37
|
+
schema: schema,
|
|
38
|
+
comment: t.table_comment || undefined,
|
|
39
|
+
columns: t.columns.map((c) => ({
|
|
40
|
+
name: c.COLUMN_NAME,
|
|
41
|
+
type: c.COLUMN_TYPE,
|
|
42
|
+
nullable: c.IS_NULLABLE === 'YES',
|
|
43
|
+
isPK: pkMap.get(t.table_name)?.has(c.COLUMN_NAME) ?? false,
|
|
44
|
+
defaultValue: c.COLUMN_DEFAULT || undefined,
|
|
45
|
+
comment: c.COLUMN_COMMENT || undefined,
|
|
46
|
+
ordinalPosition: c.ORDINAL_POSITION,
|
|
47
|
+
maxLength: c.CHARACTER_MAXIMUM_LENGTH || undefined,
|
|
48
|
+
numericPrecision: c.NUMERIC_PRECISION || undefined,
|
|
49
|
+
numericScale: c.NUMERIC_SCALE || undefined,
|
|
50
|
+
})),
|
|
51
|
+
indexes: indexMap.get(t.table_name) || [],
|
|
52
|
+
}));
|
|
53
|
+
return {
|
|
54
|
+
dbmsType: 'mssql',
|
|
55
|
+
dbmsVersion: version,
|
|
56
|
+
extractedAt: new Date().toISOString(),
|
|
57
|
+
schemaName: schema,
|
|
58
|
+
tables: extractedTables,
|
|
59
|
+
foreignKeys: fks,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
await pool.close();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// ─── Private ─────────────────────────────────────────
|
|
67
|
+
async createConnection(config) {
|
|
68
|
+
return sql.connect({
|
|
69
|
+
server: config.host,
|
|
70
|
+
port: config.port,
|
|
71
|
+
database: config.database,
|
|
72
|
+
user: config.user,
|
|
73
|
+
password: config.password,
|
|
74
|
+
options: {
|
|
75
|
+
encrypt: config.ssl || false,
|
|
76
|
+
trustServerCertificate: !config.ssl,
|
|
77
|
+
},
|
|
78
|
+
connectionTimeout: 10000,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
async getVersion(pool) {
|
|
82
|
+
const result = await pool.request().query('SELECT @@version AS ver');
|
|
83
|
+
return result.recordset[0].ver;
|
|
84
|
+
}
|
|
85
|
+
async getTables(pool, schema) {
|
|
86
|
+
const result = await pool.request()
|
|
87
|
+
.input('schema', sql.NVarChar, schema)
|
|
88
|
+
.query(`
|
|
89
|
+
SELECT
|
|
90
|
+
t.TABLE_NAME, c.COLUMN_NAME, c.ORDINAL_POSITION, c.DATA_TYPE as COLUMN_TYPE,
|
|
91
|
+
c.IS_NULLABLE, c.COLUMN_DEFAULT, c.CHARACTER_MAXIMUM_LENGTH,
|
|
92
|
+
c.NUMERIC_PRECISION, c.NUMERIC_SCALE,
|
|
93
|
+
CAST(ep.value AS NVARCHAR(MAX)) AS COLUMN_COMMENT
|
|
94
|
+
FROM information_schema.TABLES t
|
|
95
|
+
JOIN information_schema.COLUMNS c ON t.TABLE_NAME = c.TABLE_NAME AND t.TABLE_SCHEMA = c.TABLE_SCHEMA
|
|
96
|
+
LEFT JOIN sys.extended_properties ep ON ep.major_id = OBJECT_ID(t.TABLE_SCHEMA + '.' + t.TABLE_NAME)
|
|
97
|
+
AND ep.minor_id = c.ORDINAL_POSITION AND ep.name = 'MS_Description'
|
|
98
|
+
WHERE t.TABLE_SCHEMA = @schema AND t.TABLE_TYPE = 'BASE TABLE'
|
|
99
|
+
ORDER BY t.TABLE_NAME, c.ORDINAL_POSITION
|
|
100
|
+
`);
|
|
101
|
+
// 테이블 코멘트 가져오기
|
|
102
|
+
const tableComments = await pool.request()
|
|
103
|
+
.input('schema', sql.NVarChar, schema)
|
|
104
|
+
.query(`
|
|
105
|
+
SELECT
|
|
106
|
+
t.TABLE_NAME,
|
|
107
|
+
CAST(ep.value AS NVARCHAR(MAX)) AS TABLE_COMMENT
|
|
108
|
+
FROM information_schema.TABLES t
|
|
109
|
+
JOIN sys.extended_properties ep ON ep.major_id = OBJECT_ID(t.TABLE_SCHEMA + '.' + t.TABLE_NAME)
|
|
110
|
+
WHERE t.TABLE_SCHEMA = @schema AND ep.minor_id = 0 AND ep.name = 'MS_Description'
|
|
111
|
+
`);
|
|
112
|
+
const commentMap = new Map();
|
|
113
|
+
for (const tc of tableComments.recordset) {
|
|
114
|
+
commentMap.set(tc.TABLE_NAME, tc.TABLE_COMMENT);
|
|
115
|
+
}
|
|
116
|
+
const tableMap = new Map();
|
|
117
|
+
for (const col of result.recordset) {
|
|
118
|
+
if (!tableMap.has(col.TABLE_NAME)) {
|
|
119
|
+
tableMap.set(col.TABLE_NAME, {
|
|
120
|
+
table_name: col.TABLE_NAME,
|
|
121
|
+
table_comment: commentMap.get(col.TABLE_NAME) || null,
|
|
122
|
+
columns: [],
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
tableMap.get(col.TABLE_NAME).columns.push(col);
|
|
126
|
+
}
|
|
127
|
+
return Array.from(tableMap.values());
|
|
128
|
+
}
|
|
129
|
+
async getPrimaryKeys(pool, schema) {
|
|
130
|
+
const result = await pool.request()
|
|
131
|
+
.input('schema', sql.NVarChar, schema)
|
|
132
|
+
.query(`
|
|
133
|
+
SELECT c.TABLE_NAME, c.COLUMN_NAME
|
|
134
|
+
FROM information_schema.KEY_COLUMN_USAGE c
|
|
135
|
+
JOIN information_schema.TABLE_CONSTRAINTS t ON c.CONSTRAINT_NAME = t.CONSTRAINT_NAME
|
|
136
|
+
WHERE t.CONSTRAINT_TYPE = 'PRIMARY KEY' AND t.TABLE_SCHEMA = @schema
|
|
137
|
+
`);
|
|
138
|
+
return result.recordset;
|
|
139
|
+
}
|
|
140
|
+
async getForeignKeys(pool, schema) {
|
|
141
|
+
const result = await pool.request()
|
|
142
|
+
.input('schema', sql.NVarChar, schema)
|
|
143
|
+
.query(`
|
|
144
|
+
SELECT
|
|
145
|
+
fk.name AS CONSTRAINT_NAME,
|
|
146
|
+
tp.name AS source_table,
|
|
147
|
+
cp.name AS source_column,
|
|
148
|
+
tr.name AS target_table,
|
|
149
|
+
cr.name AS target_column,
|
|
150
|
+
fk.delete_referential_action_desc AS DELETE_RULE,
|
|
151
|
+
fk.update_referential_action_desc AS UPDATE_RULE
|
|
152
|
+
FROM sys.foreign_keys fk
|
|
153
|
+
INNER JOIN sys.tables tp ON fk.parent_object_id = tp.object_id
|
|
154
|
+
INNER JOIN sys.columns cp ON fk.parent_object_id = cp.object_id
|
|
155
|
+
INNER JOIN sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id AND cp.column_id = fkc.parent_column_id
|
|
156
|
+
INNER JOIN sys.tables tr ON fk.referenced_object_id = tr.object_id
|
|
157
|
+
INNER JOIN sys.columns cr ON fk.referenced_object_id = cr.object_id AND cr.column_id = fkc.referenced_column_id
|
|
158
|
+
INNER JOIN sys.schemas s ON tp.schema_id = s.schema_id
|
|
159
|
+
WHERE s.name = @schema
|
|
160
|
+
`);
|
|
161
|
+
return result.recordset.map((r) => {
|
|
162
|
+
const mapRule = (rule) => {
|
|
163
|
+
if (rule === 'NO_ACTION')
|
|
164
|
+
return 'NO ACTION';
|
|
165
|
+
if (rule === 'CASCADE')
|
|
166
|
+
return 'CASCADE';
|
|
167
|
+
if (rule === 'SET_NULL')
|
|
168
|
+
return 'SET NULL';
|
|
169
|
+
if (rule === 'SET_DEFAULT')
|
|
170
|
+
return 'SET DEFAULT';
|
|
171
|
+
return undefined;
|
|
172
|
+
};
|
|
173
|
+
return {
|
|
174
|
+
name: r.CONSTRAINT_NAME,
|
|
175
|
+
sourceTable: r.source_table,
|
|
176
|
+
sourceSchema: schema,
|
|
177
|
+
sourceColumn: r.source_column,
|
|
178
|
+
targetTable: r.target_table,
|
|
179
|
+
targetSchema: schema,
|
|
180
|
+
targetColumn: r.target_column,
|
|
181
|
+
onDelete: mapRule(r.DELETE_RULE),
|
|
182
|
+
onUpdate: mapRule(r.UPDATE_RULE),
|
|
183
|
+
};
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
async getIndexes(pool, schema) {
|
|
187
|
+
const result = await pool.request()
|
|
188
|
+
.input('schema', sql.NVarChar, schema)
|
|
189
|
+
.query(`
|
|
190
|
+
SELECT
|
|
191
|
+
t.name AS TABLE_NAME,
|
|
192
|
+
i.name AS INDEX_NAME,
|
|
193
|
+
c.name AS COLUMN_NAME,
|
|
194
|
+
i.is_unique AS UNIQUE_INDEX
|
|
195
|
+
FROM sys.indexes i
|
|
196
|
+
INNER JOIN sys.tables t ON i.object_id = t.object_id
|
|
197
|
+
INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
|
|
198
|
+
INNER JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
|
|
199
|
+
INNER JOIN sys.schemas s ON t.schema_id = s.schema_id
|
|
200
|
+
WHERE s.name = @schema AND i.is_primary_key = 0 AND i.type > 0
|
|
201
|
+
ORDER BY t.name, i.name, ic.key_ordinal
|
|
202
|
+
`);
|
|
203
|
+
return result.recordset;
|
|
204
|
+
}
|
|
205
|
+
buildPKMap(pks) {
|
|
206
|
+
const map = new Map();
|
|
207
|
+
for (const pk of pks) {
|
|
208
|
+
if (!map.has(pk.TABLE_NAME))
|
|
209
|
+
map.set(pk.TABLE_NAME, new Set());
|
|
210
|
+
map.get(pk.TABLE_NAME).add(pk.COLUMN_NAME);
|
|
211
|
+
}
|
|
212
|
+
return map;
|
|
213
|
+
}
|
|
214
|
+
buildIndexMap(indexes) {
|
|
215
|
+
const map = new Map();
|
|
216
|
+
for (const idx of indexes) {
|
|
217
|
+
const key = `${idx.TABLE_NAME}.${idx.INDEX_NAME}`;
|
|
218
|
+
if (!map.has(idx.TABLE_NAME))
|
|
219
|
+
map.set(idx.TABLE_NAME, []);
|
|
220
|
+
let indexObj = map.get(idx.TABLE_NAME).find(i => i.name === idx.INDEX_NAME);
|
|
221
|
+
if (!indexObj) {
|
|
222
|
+
indexObj = {
|
|
223
|
+
name: idx.INDEX_NAME,
|
|
224
|
+
columns: [],
|
|
225
|
+
unique: idx.UNIQUE_INDEX === true || idx.UNIQUE_INDEX === 1,
|
|
226
|
+
};
|
|
227
|
+
map.get(idx.TABLE_NAME).push(indexObj);
|
|
228
|
+
}
|
|
229
|
+
indexObj.columns.push(idx.COLUMN_NAME);
|
|
230
|
+
}
|
|
231
|
+
return map;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=mssql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mssql.js","sourceRoot":"","sources":["../../src/extractors/mssql.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import type { SchemaExtractor, ConnectionConfig, ExtractedSchema } from '../types.js';
|
|
1
|
+
import type { SchemaExtractor, ConnectionConfig, ExtractedSchema, ExtractProgressCallback } from '../types.js';
|
|
2
2
|
export declare class MySQLExtractor implements SchemaExtractor {
|
|
3
3
|
testConnection(config: ConnectionConfig): Promise<string>;
|
|
4
|
-
|
|
4
|
+
/** 선택 가능한 스키마(=데이터베이스) 목록. MySQL은 schema=database. */
|
|
5
|
+
listSchemas(config: ConnectionConfig): Promise<string[]>;
|
|
6
|
+
extract(config: ConnectionConfig, onProgress?: ExtractProgressCallback): Promise<ExtractedSchema>;
|
|
5
7
|
private createConnection;
|
|
6
8
|
private getVersion;
|
|
7
9
|
private getTables;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mysql.d.ts","sourceRoot":"","sources":["../../src/extractors/mysql.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACR,eAAe,EACf,gBAAgB,EAChB,eAAe,
|
|
1
|
+
{"version":3,"file":"mysql.d.ts","sourceRoot":"","sources":["../../src/extractors/mysql.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACR,eAAe,EACf,gBAAgB,EAChB,eAAe,EAKf,uBAAuB,EAC1B,MAAM,aAAa,CAAC;AAErB,qBAAa,cAAe,YAAW,eAAe;IAC5C,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAU/D,sDAAsD;IAChD,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAexD,OAAO,CAAC,MAAM,EAAE,gBAAgB,EAAE,UAAU,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,eAAe,CAAC;YA8DzF,gBAAgB;YAYhB,UAAU;YAKV,SAAS;YAwCT,cAAc;YAUd,cAAc;YA+Bd,UAAU;IA2BxB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,aAAa;CAYxB"}
|
package/dist/extractors/mysql.js
CHANGED
|
@@ -15,17 +15,39 @@ export class MySQLExtractor {
|
|
|
15
15
|
await conn.end();
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
|
-
|
|
18
|
+
/** 선택 가능한 스키마(=데이터베이스) 목록. MySQL은 schema=database. */
|
|
19
|
+
async listSchemas(config) {
|
|
20
|
+
const conn = await this.createConnection(config);
|
|
21
|
+
try {
|
|
22
|
+
const [rows] = await conn.query(`
|
|
23
|
+
SELECT schema_name
|
|
24
|
+
FROM information_schema.schemata
|
|
25
|
+
WHERE schema_name NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')
|
|
26
|
+
ORDER BY schema_name
|
|
27
|
+
`);
|
|
28
|
+
return rows.map(r => r.schema_name ?? r.SCHEMA_NAME);
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
await conn.end();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async extract(config, onProgress) {
|
|
19
35
|
const conn = await this.createConnection(config);
|
|
20
36
|
const schema = config.database; // MySQL에서 schema = database
|
|
21
37
|
try {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
38
|
+
onProgress?.(`Connecting to MySQL at ${config.host}...`);
|
|
39
|
+
onProgress?.(`Fetching server version...`);
|
|
40
|
+
const version = await this.getVersion(conn);
|
|
41
|
+
onProgress?.(`Fetching tables and columns from schema '${schema}'...`);
|
|
42
|
+
const tables = await this.getTables(conn, schema);
|
|
43
|
+
onProgress?.(`Found ${tables.length} tables.`);
|
|
44
|
+
onProgress?.(`Fetching primary keys...`);
|
|
45
|
+
const pks = await this.getPrimaryKeys(conn, schema);
|
|
46
|
+
onProgress?.(`Fetching foreign keys...`);
|
|
47
|
+
const fks = await this.getForeignKeys(conn, schema);
|
|
48
|
+
onProgress?.(`Fetching indexes...`);
|
|
49
|
+
const indexes = await this.getIndexes(conn, schema);
|
|
50
|
+
onProgress?.(`Building relationships and formatting output...`);
|
|
29
51
|
const pkMap = this.buildPKMap(pks);
|
|
30
52
|
const indexMap = this.buildIndexMap(indexes);
|
|
31
53
|
const extractedTables = tables.map((t) => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../src/extractors/mysql.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../src/extractors/mysql.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SchemaExtractor, ConnectionConfig, ExtractedSchema, ExtractProgressCallback } from '../types.js';
|
|
2
|
+
export declare class OracleExtractor implements SchemaExtractor {
|
|
3
|
+
testConnection(config: ConnectionConfig): Promise<string>;
|
|
4
|
+
extract(config: ConnectionConfig, onProgress?: ExtractProgressCallback): Promise<ExtractedSchema>;
|
|
5
|
+
private createConnection;
|
|
6
|
+
private getTables;
|
|
7
|
+
private getPrimaryKeys;
|
|
8
|
+
private getForeignKeys;
|
|
9
|
+
private getIndexes;
|
|
10
|
+
private buildPKMap;
|
|
11
|
+
private buildIndexMap;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=oracle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oracle.d.ts","sourceRoot":"","sources":["../../src/extractors/oracle.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACR,eAAe,EACf,gBAAgB,EAChB,eAAe,EAKf,uBAAuB,EAC1B,MAAM,aAAa,CAAC;AAErB,qBAAa,eAAgB,YAAW,eAAe;IAC7C,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IASzD,OAAO,CAAC,MAAM,EAAE,gBAAgB,EAAE,UAAU,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,eAAe,CAAC;YA+DzF,gBAAgB;YAQhB,SAAS;YAwCT,cAAc;YAYd,cAAc;YA+Bd,UAAU;IAYxB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,aAAa;CAkBxB"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Oracle 스키마 추출기
|
|
3
|
+
*/
|
|
4
|
+
import oracledb from 'oracledb';
|
|
5
|
+
export class OracleExtractor {
|
|
6
|
+
async testConnection(config) {
|
|
7
|
+
const conn = await this.createConnection(config);
|
|
8
|
+
try {
|
|
9
|
+
return `Oracle ${conn.oracleServerVersionString}`;
|
|
10
|
+
}
|
|
11
|
+
finally {
|
|
12
|
+
await conn.close();
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
async extract(config, onProgress) {
|
|
16
|
+
oracledb.outFormat = oracledb.OUT_FORMAT_OBJECT;
|
|
17
|
+
const conn = await this.createConnection(config);
|
|
18
|
+
const schema = (config.schema || config.user).toUpperCase();
|
|
19
|
+
try {
|
|
20
|
+
onProgress?.(`Connecting to Oracle at ${config.host}...`);
|
|
21
|
+
onProgress?.(`Fetching server version...`);
|
|
22
|
+
const version = `Oracle ${conn.oracleServerVersionString}`;
|
|
23
|
+
onProgress?.(`Fetching tables and columns from schema '${schema}'...`);
|
|
24
|
+
const tables = await this.getTables(conn, schema);
|
|
25
|
+
onProgress?.(`Found ${tables.length} tables.`);
|
|
26
|
+
onProgress?.(`Fetching primary keys...`);
|
|
27
|
+
const pks = await this.getPrimaryKeys(conn, schema);
|
|
28
|
+
onProgress?.(`Fetching foreign keys...`);
|
|
29
|
+
const fks = await this.getForeignKeys(conn, schema);
|
|
30
|
+
onProgress?.(`Fetching indexes...`);
|
|
31
|
+
const indexes = await this.getIndexes(conn, schema);
|
|
32
|
+
onProgress?.(`Building relationships and formatting output...`);
|
|
33
|
+
const pkMap = this.buildPKMap(pks);
|
|
34
|
+
const indexMap = this.buildIndexMap(indexes);
|
|
35
|
+
const extractedTables = tables.map((t) => ({
|
|
36
|
+
name: t.TABLE_NAME,
|
|
37
|
+
schema: schema,
|
|
38
|
+
comment: t.TABLE_COMMENT || undefined,
|
|
39
|
+
columns: t.columns.map((c) => ({
|
|
40
|
+
name: c.COLUMN_NAME,
|
|
41
|
+
type: c.COLUMN_TYPE,
|
|
42
|
+
nullable: c.IS_NULLABLE === 'Y',
|
|
43
|
+
isPK: pkMap.get(t.TABLE_NAME)?.has(c.COLUMN_NAME) ?? false,
|
|
44
|
+
defaultValue: c.COLUMN_DEFAULT ? c.COLUMN_DEFAULT.trim() : undefined,
|
|
45
|
+
comment: c.COLUMN_COMMENT || undefined,
|
|
46
|
+
ordinalPosition: c.ORDINAL_POSITION,
|
|
47
|
+
maxLength: c.CHARACTER_MAXIMUM_LENGTH || undefined,
|
|
48
|
+
numericPrecision: c.NUMERIC_PRECISION || undefined,
|
|
49
|
+
numericScale: c.NUMERIC_SCALE || undefined,
|
|
50
|
+
})),
|
|
51
|
+
indexes: indexMap.get(t.TABLE_NAME) || [],
|
|
52
|
+
}));
|
|
53
|
+
return {
|
|
54
|
+
dbmsType: 'oracle',
|
|
55
|
+
dbmsVersion: version,
|
|
56
|
+
extractedAt: new Date().toISOString(),
|
|
57
|
+
schemaName: schema,
|
|
58
|
+
tables: extractedTables,
|
|
59
|
+
foreignKeys: fks,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
await conn.close();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// ─── Private ─────────────────────────────────────────
|
|
67
|
+
async createConnection(config) {
|
|
68
|
+
return oracledb.getConnection({
|
|
69
|
+
user: config.user,
|
|
70
|
+
password: config.password,
|
|
71
|
+
connectString: `${config.host}:${config.port}/${config.database}`,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
async getTables(conn, schema) {
|
|
75
|
+
const result = await conn.execute(`
|
|
76
|
+
SELECT
|
|
77
|
+
t.TABLE_NAME, c.COLUMN_NAME, c.COLUMN_ID AS ORDINAL_POSITION, c.DATA_TYPE AS COLUMN_TYPE,
|
|
78
|
+
c.NULLABLE AS IS_NULLABLE, c.DATA_DEFAULT AS COLUMN_DEFAULT, c.DATA_LENGTH AS CHARACTER_MAXIMUM_LENGTH,
|
|
79
|
+
c.DATA_PRECISION AS NUMERIC_PRECISION, c.DATA_SCALE AS NUMERIC_SCALE,
|
|
80
|
+
cm.COMMENTS AS COLUMN_COMMENT
|
|
81
|
+
FROM ALL_TABLES t
|
|
82
|
+
JOIN ALL_TAB_COLUMNS c ON t.TABLE_NAME = c.TABLE_NAME AND t.OWNER = c.OWNER
|
|
83
|
+
LEFT JOIN ALL_COL_COMMENTS cm ON t.TABLE_NAME = cm.TABLE_NAME AND c.COLUMN_NAME = cm.COLUMN_NAME AND t.OWNER = cm.OWNER
|
|
84
|
+
WHERE t.OWNER = :schema
|
|
85
|
+
ORDER BY t.TABLE_NAME, c.COLUMN_ID
|
|
86
|
+
`, [schema]);
|
|
87
|
+
const tableComments = await conn.execute(`
|
|
88
|
+
SELECT TABLE_NAME, COMMENTS AS TABLE_COMMENT
|
|
89
|
+
FROM ALL_TAB_COMMENTS
|
|
90
|
+
WHERE OWNER = :schema AND TABLE_TYPE = 'TABLE'
|
|
91
|
+
`, [schema]);
|
|
92
|
+
const commentMap = new Map();
|
|
93
|
+
for (const tc of tableComments.rows || []) {
|
|
94
|
+
if (tc.TABLE_COMMENT)
|
|
95
|
+
commentMap.set(tc.TABLE_NAME, tc.TABLE_COMMENT);
|
|
96
|
+
}
|
|
97
|
+
const tableMap = new Map();
|
|
98
|
+
for (const col of result.rows || []) {
|
|
99
|
+
if (!tableMap.has(col.TABLE_NAME)) {
|
|
100
|
+
tableMap.set(col.TABLE_NAME, {
|
|
101
|
+
TABLE_NAME: col.TABLE_NAME,
|
|
102
|
+
TABLE_COMMENT: commentMap.get(col.TABLE_NAME) || null,
|
|
103
|
+
columns: [],
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
tableMap.get(col.TABLE_NAME).columns.push(col);
|
|
107
|
+
}
|
|
108
|
+
return Array.from(tableMap.values());
|
|
109
|
+
}
|
|
110
|
+
async getPrimaryKeys(conn, schema) {
|
|
111
|
+
const result = await conn.execute(`
|
|
112
|
+
SELECT
|
|
113
|
+
c.TABLE_NAME, c.COLUMN_NAME
|
|
114
|
+
FROM ALL_CONSTRAINTS pk
|
|
115
|
+
JOIN ALL_CONS_COLUMNS c ON pk.CONSTRAINT_NAME = c.CONSTRAINT_NAME AND pk.OWNER = c.OWNER
|
|
116
|
+
WHERE pk.CONSTRAINT_TYPE = 'P' AND pk.OWNER = :schema
|
|
117
|
+
ORDER BY c.TABLE_NAME, c.POSITION
|
|
118
|
+
`, [schema]);
|
|
119
|
+
return result.rows || [];
|
|
120
|
+
}
|
|
121
|
+
async getForeignKeys(conn, schema) {
|
|
122
|
+
const result = await conn.execute(`
|
|
123
|
+
SELECT
|
|
124
|
+
fk.CONSTRAINT_NAME,
|
|
125
|
+
fk.TABLE_NAME AS SOURCE_TABLE,
|
|
126
|
+
c1.COLUMN_NAME AS SOURCE_COLUMN,
|
|
127
|
+
pk.TABLE_NAME AS TARGET_TABLE,
|
|
128
|
+
c2.COLUMN_NAME AS TARGET_COLUMN,
|
|
129
|
+
fk.DELETE_RULE
|
|
130
|
+
FROM ALL_CONSTRAINTS fk
|
|
131
|
+
JOIN ALL_CONSTRAINTS pk ON fk.R_CONSTRAINT_NAME = pk.CONSTRAINT_NAME AND fk.OWNER = pk.OWNER
|
|
132
|
+
JOIN ALL_CONS_COLUMNS c1 ON fk.CONSTRAINT_NAME = c1.CONSTRAINT_NAME AND fk.OWNER = c1.OWNER
|
|
133
|
+
JOIN ALL_CONS_COLUMNS c2 ON pk.CONSTRAINT_NAME = c2.CONSTRAINT_NAME AND pk.OWNER = c2.OWNER AND c1.POSITION = c2.POSITION
|
|
134
|
+
WHERE fk.CONSTRAINT_TYPE = 'R' AND fk.OWNER = :schema
|
|
135
|
+
`, [schema]);
|
|
136
|
+
const rows = result.rows || [];
|
|
137
|
+
return rows.map((r) => {
|
|
138
|
+
return {
|
|
139
|
+
name: r.CONSTRAINT_NAME,
|
|
140
|
+
sourceTable: r.SOURCE_TABLE,
|
|
141
|
+
sourceSchema: schema,
|
|
142
|
+
sourceColumn: r.SOURCE_COLUMN,
|
|
143
|
+
targetTable: r.TARGET_TABLE,
|
|
144
|
+
targetSchema: schema,
|
|
145
|
+
targetColumn: r.TARGET_COLUMN,
|
|
146
|
+
onDelete: r.DELETE_RULE === 'CASCADE' ? 'CASCADE' : (r.DELETE_RULE === 'SET NULL' ? 'SET NULL' : undefined),
|
|
147
|
+
};
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
async getIndexes(conn, schema) {
|
|
151
|
+
const result = await conn.execute(`
|
|
152
|
+
SELECT
|
|
153
|
+
i.TABLE_NAME, i.INDEX_NAME, c.COLUMN_NAME, i.UNIQUENESS
|
|
154
|
+
FROM ALL_INDEXES i
|
|
155
|
+
JOIN ALL_IND_COLUMNS c ON i.INDEX_NAME = c.INDEX_NAME AND i.TABLE_OWNER = c.TABLE_OWNER
|
|
156
|
+
WHERE i.TABLE_OWNER = :schema AND i.INDEX_TYPE != 'LOB'
|
|
157
|
+
ORDER BY i.TABLE_NAME, i.INDEX_NAME, c.COLUMN_POSITION
|
|
158
|
+
`, [schema]);
|
|
159
|
+
return result.rows || [];
|
|
160
|
+
}
|
|
161
|
+
buildPKMap(pks) {
|
|
162
|
+
const map = new Map();
|
|
163
|
+
for (const pk of pks) {
|
|
164
|
+
if (!map.has(pk.TABLE_NAME))
|
|
165
|
+
map.set(pk.TABLE_NAME, new Set());
|
|
166
|
+
map.get(pk.TABLE_NAME).add(pk.COLUMN_NAME);
|
|
167
|
+
}
|
|
168
|
+
return map;
|
|
169
|
+
}
|
|
170
|
+
buildIndexMap(indexes) {
|
|
171
|
+
const map = new Map();
|
|
172
|
+
for (const idx of indexes) {
|
|
173
|
+
if (!map.has(idx.TABLE_NAME))
|
|
174
|
+
map.set(idx.TABLE_NAME, []);
|
|
175
|
+
let indexObj = map.get(idx.TABLE_NAME).find(i => i.name === idx.INDEX_NAME);
|
|
176
|
+
if (!indexObj) {
|
|
177
|
+
indexObj = {
|
|
178
|
+
name: idx.INDEX_NAME,
|
|
179
|
+
columns: [],
|
|
180
|
+
unique: idx.UNIQUENESS === 'UNIQUE',
|
|
181
|
+
};
|
|
182
|
+
map.get(idx.TABLE_NAME).push(indexObj);
|
|
183
|
+
}
|
|
184
|
+
indexObj.columns.push(idx.COLUMN_NAME);
|
|
185
|
+
}
|
|
186
|
+
return map;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=oracle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oracle.js","sourceRoot":"","sources":["../../src/extractors/oracle.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
|
-
import type { SchemaExtractor, ConnectionConfig, ExtractedSchema } from '../types.js';
|
|
1
|
+
import type { SchemaExtractor, ConnectionConfig, ExtractedSchema, ExtractProgressCallback, TableStats } from '../types.js';
|
|
2
2
|
export declare class PostgresExtractor implements SchemaExtractor {
|
|
3
3
|
/**
|
|
4
4
|
* 연결 테스트 — PostgreSQL 버전 반환
|
|
5
5
|
*/
|
|
6
6
|
testConnection(config: ConnectionConfig): Promise<string>;
|
|
7
|
+
getStats(config: ConnectionConfig): Promise<TableStats[]>;
|
|
8
|
+
/** 선택 가능한 스키마 목록 (시스템 스키마 제외) */
|
|
9
|
+
listSchemas(config: ConnectionConfig): Promise<string[]>;
|
|
7
10
|
/**
|
|
8
|
-
* 스키마 추출 — 테이블, 컬럼, PK, FK, 인덱스를
|
|
11
|
+
* 스키마 추출 — 테이블, 컬럼, PK, FK, 인덱스를 추출
|
|
9
12
|
*/
|
|
10
|
-
extract(config: ConnectionConfig): Promise<ExtractedSchema>;
|
|
13
|
+
extract(config: ConnectionConfig, onProgress?: ExtractProgressCallback): Promise<ExtractedSchema>;
|
|
11
14
|
private createClient;
|
|
12
15
|
private getVersion;
|
|
13
16
|
private getTables;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/extractors/postgres.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACR,eAAe,EACf,gBAAgB,EAChB,eAAe,
|
|
1
|
+
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/extractors/postgres.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACR,eAAe,EACf,gBAAgB,EAChB,eAAe,EAKf,uBAAuB,EACvB,UAAU,EACb,MAAM,aAAa,CAAC;AAErB,qBAAa,iBAAkB,YAAW,eAAe;IACrD;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAUzD,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IA2B/D,iCAAiC;IAC3B,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAkB9D;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,gBAAgB,EAAE,UAAU,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,eAAe,CAAC;IAoEvG,OAAO,CAAC,YAAY;YAaN,UAAU;YAKV,SAAS;YAsDT,cAAc;YAkBd,cAAc;YAwCd,UAAU;IAsBxB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,UAAU;CAiBrB"}
|