fdb2 1.0.7 → 1.0.9
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/.dockerignore +21 -21
- package/.editorconfig +11 -11
- package/.eslintrc.cjs +14 -14
- package/.eslintrc.json +7 -7
- package/.prettierrc.js +3 -3
- package/.tpl.env +21 -21
- package/.vscodeignore +45 -45
- package/README.md +312 -312
- package/bin/build.sh +28 -28
- package/bin/deploy.sh +8 -8
- package/bin/dev.sh +10 -10
- package/bin/docker/dev-docker-compose.yml +43 -43
- package/bin/docker/dev.Dockerfile +24 -24
- package/bin/docker/prod-docker-compose.yml +17 -17
- package/bin/docker/prod.Dockerfile +29 -29
- package/bin/fdb2.js +220 -220
- package/dist/package.json +29 -29
- package/dist/pnpm-lock.yaml +1042 -354
- package/dist/public/explorer.css +1464 -1437
- package/dist/public/explorer.js +764 -226
- package/dist/public/index.css +1026 -1026
- package/dist/public/index.js +15 -9
- package/dist/public/layout.css +221 -221
- package/dist/public/layout.js +1 -1
- package/dist/public/vue.js +8 -2
- package/dist/scripts/preinstall.js +112 -112
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +8 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.ts +680 -671
- package/dist/server/model/connection.entity.ts +65 -65
- package/dist/server/model/database.entity.ts +245 -245
- package/dist/server/service/connection.service.d.ts +6 -1
- package/dist/server/service/connection.service.d.ts.map +1 -1
- package/dist/server/service/connection.service.js +15 -0
- package/dist/server/service/connection.service.js.map +1 -1
- package/dist/server/service/connection.service.ts +356 -341
- package/dist/server/service/database/base.service.d.ts +27 -0
- package/dist/server/service/database/base.service.d.ts.map +1 -1
- package/dist/server/service/database/base.service.js +17 -0
- package/dist/server/service/database/base.service.js.map +1 -1
- package/dist/server/service/database/base.service.ts +406 -367
- package/dist/server/service/database/cockroachdb.service.d.ts +16 -0
- package/dist/server/service/database/cockroachdb.service.d.ts.map +1 -1
- package/dist/server/service/database/cockroachdb.service.js +220 -154
- package/dist/server/service/database/cockroachdb.service.js.map +1 -1
- package/dist/server/service/database/cockroachdb.service.ts +871 -782
- package/dist/server/service/database/database.service.d.ts +4 -0
- package/dist/server/service/database/database.service.d.ts.map +1 -1
- package/dist/server/service/database/database.service.js +123 -0
- package/dist/server/service/database/database.service.js.map +1 -1
- package/dist/server/service/database/database.service.ts +775 -638
- package/dist/server/service/database/index.ts +6 -6
- package/dist/server/service/database/mongodb.service.d.ts +16 -0
- package/dist/server/service/database/mongodb.service.d.ts.map +1 -1
- package/dist/server/service/database/mongodb.service.js +35 -0
- package/dist/server/service/database/mongodb.service.js.map +1 -1
- package/dist/server/service/database/mongodb.service.ts +39 -1
- package/dist/server/service/database/mssql.service.d.ts +16 -0
- package/dist/server/service/database/mssql.service.d.ts.map +1 -1
- package/dist/server/service/database/mssql.service.js +168 -96
- package/dist/server/service/database/mssql.service.js.map +1 -1
- package/dist/server/service/database/mssql.service.ts +931 -840
- package/dist/server/service/database/mysql.service.d.ts +16 -0
- package/dist/server/service/database/mysql.service.d.ts.map +1 -1
- package/dist/server/service/database/mysql.service.js +189 -80
- package/dist/server/service/database/mysql.service.js.map +1 -1
- package/dist/server/service/database/mysql.service.ts +1025 -890
- package/dist/server/service/database/oracle.service.d.ts +16 -0
- package/dist/server/service/database/oracle.service.d.ts.map +1 -1
- package/dist/server/service/database/oracle.service.js +182 -120
- package/dist/server/service/database/oracle.service.js.map +1 -1
- package/dist/server/service/database/oracle.service.ts +1035 -959
- package/dist/server/service/database/postgres.service.d.ts +16 -0
- package/dist/server/service/database/postgres.service.d.ts.map +1 -1
- package/dist/server/service/database/postgres.service.js +154 -88
- package/dist/server/service/database/postgres.service.js.map +1 -1
- package/dist/server/service/database/postgres.service.ts +960 -871
- package/dist/server/service/database/sap.service.d.ts +16 -0
- package/dist/server/service/database/sap.service.d.ts.map +1 -1
- package/dist/server/service/database/sap.service.js +66 -0
- package/dist/server/service/database/sap.service.js.map +1 -1
- package/dist/server/service/database/sap.service.ts +89 -0
- package/dist/server/service/database/sqlite.service.d.ts +16 -0
- package/dist/server/service/database/sqlite.service.d.ts.map +1 -1
- package/dist/server/service/database/sqlite.service.js +77 -18
- package/dist/server/service/database/sqlite.service.js.map +1 -1
- package/dist/server/service/database/sqlite.service.ts +787 -708
- package/dist/server/service/session.service.ts +158 -158
- package/dist/view/index.html +38 -38
- package/env.d.ts +1 -1
- package/package.json +1 -1
- package/packages/vscode/.vscodeignore +44 -44
- package/packages/vscode/README.md +62 -62
- package/packages/vscode/out/database-services/cockroachdb.service.js +154 -154
- package/packages/vscode/out/database-services/mssql.service.js +96 -96
- package/packages/vscode/out/database-services/mysql.service.js +80 -80
- package/packages/vscode/out/database-services/oracle.service.js +120 -120
- package/packages/vscode/out/database-services/postgres.service.js +88 -88
- package/packages/vscode/out/database-services/sqlite.service.js +18 -18
- package/packages/vscode/out/provider/WebViewProvider.js +32 -32
- package/packages/vscode/package.json +142 -142
- package/packages/vscode/resources/icon.svg +5 -5
- package/packages/vscode/resources/webview/connection.css +41 -41
- package/packages/vscode/resources/webview/database.css +163 -163
- package/packages/vscode/resources/webview/index.html +9 -9
- package/packages/vscode/resources/webview/modules/header.tpl +13 -13
- package/packages/vscode/resources/webview/modules/initial_state.tpl +54 -54
- package/packages/vscode/resources/webview/query.css +104 -104
- package/packages/vscode/src/database-services/base.service.ts +362 -362
- package/packages/vscode/src/database-services/cockroachdb.service.ts +659 -659
- package/packages/vscode/src/database-services/connection.service.ts +340 -340
- package/packages/vscode/src/database-services/database.service.ts +629 -629
- package/packages/vscode/src/database-services/index.ts +6 -6
- package/packages/vscode/src/database-services/model/connection.entity.ts +65 -65
- package/packages/vscode/src/database-services/model/database.entity.ts +245 -245
- package/packages/vscode/src/database-services/mssql.service.ts +722 -722
- package/packages/vscode/src/database-services/mysql.service.ts +760 -760
- package/packages/vscode/src/database-services/oracle.service.ts +831 -831
- package/packages/vscode/src/database-services/postgres.service.ts +740 -740
- package/packages/vscode/src/database-services/sqlite.service.ts +558 -558
- package/packages/vscode/src/extension.ts +76 -76
- package/packages/vscode/src/provider/DatabaseTreeProvider.ts +167 -167
- package/packages/vscode/src/provider/WebViewProvider.ts +277 -277
- package/packages/vscode/src/service/DatabaseServiceBridge.ts +414 -414
- package/packages/vscode/src/typings/connection.ts +90 -90
- package/packages/vscode/tsconfig.json +21 -21
- package/public/index.html +9 -9
- package/public/modules/header.tpl +13 -13
- package/public/modules/initial_state.tpl +54 -54
- package/scripts/preinstall.js +112 -112
- package/server/index.ts +680 -671
- package/server/model/connection.entity.ts +65 -65
- package/server/model/database.entity.ts +245 -245
- package/server/service/connection.service.ts +356 -341
- package/server/service/database/base.service.ts +406 -367
- package/server/service/database/cockroachdb.service.ts +871 -782
- package/server/service/database/database.service.ts +775 -638
- package/server/service/database/index.ts +6 -6
- package/server/service/database/mongodb.service.ts +39 -1
- package/server/service/database/mssql.service.ts +931 -840
- package/server/service/database/mysql.service.ts +1025 -890
- package/server/service/database/oracle.service.ts +1035 -959
- package/server/service/database/postgres.service.ts +960 -871
- package/server/service/database/sap.service.ts +89 -0
- package/server/service/database/sqlite.service.ts +787 -708
- package/server/service/session.service.ts +158 -158
- package/server/tsconfig.json +20 -20
- package/server.js +149 -149
- package/server.pid +1 -0
- package/src/adapter/ajax.ts +135 -135
- package/src/assets/base.css +1 -1
- package/src/assets/database.css +949 -949
- package/src/assets/images/svg/illustrations/illustration-1.svg +1 -1
- package/src/assets/images/svg/illustrations/illustration-2.svg +2 -2
- package/src/assets/images/svg/illustrations/illustration-3.svg +50 -50
- package/src/assets/images/svg/illustrations/illustration-4.svg +1 -1
- package/src/assets/images/svg/illustrations/illustration-5.svg +73 -73
- package/src/assets/images/svg/illustrations/illustration-6.svg +89 -89
- package/src/assets/images/svg/illustrations/illustration-7.svg +39 -39
- package/src/assets/images/svg/separators/curve-2.svg +3 -3
- package/src/assets/images/svg/separators/curve.svg +3 -3
- package/src/assets/images/svg/separators/line.svg +3 -3
- package/src/assets/logo.svg +73 -73
- package/src/assets/main.css +1 -1
- package/src/base/config.ts +20 -20
- package/src/base/detect.ts +134 -134
- package/src/base/entity.ts +92 -92
- package/src/base/eventBus.ts +36 -36
- package/src/components/connection-editor/index.vue +588 -588
- package/src/components/dataGrid/index.vue +104 -104
- package/src/components/dataGrid/pagination.vue +105 -105
- package/src/components/loading/index.vue +42 -42
- package/src/components/modal/index.ts +180 -180
- package/src/components/modal/index.vue +560 -560
- package/src/components/toast/index.ts +43 -43
- package/src/components/toast/toast.vue +57 -57
- package/src/components/user/name.vue +103 -103
- package/src/components/user/selector.vue +416 -416
- package/src/domain/SysConfig.ts +74 -74
- package/src/platform/App.vue +7 -7
- package/src/platform/database/components/connection-detail.vue +1153 -1154
- package/src/platform/database/components/data-editor.vue +477 -477
- package/src/platform/database/components/database-detail.vue +1173 -1172
- package/src/platform/database/components/database-monitor.vue +1085 -1085
- package/src/platform/database/components/db-tools.vue +1264 -816
- package/src/platform/database/components/query-history.vue +1348 -1348
- package/src/platform/database/components/sql-executor.vue +737 -737
- package/src/platform/database/components/sql-query-editor.vue +1045 -1045
- package/src/platform/database/components/table-detail.vue +1375 -1376
- package/src/platform/database/components/table-editor.vue +916 -916
- package/src/platform/database/explorer.vue +1839 -1839
- package/src/platform/database/index.vue +1192 -1192
- package/src/platform/database/layout.vue +366 -366
- package/src/platform/database/router.ts +36 -36
- package/src/platform/database/styles/common.scss +601 -601
- package/src/platform/database/types/common.ts +444 -444
- package/src/platform/database/utils/export.ts +231 -231
- package/src/platform/database/utils/helpers.ts +436 -436
- package/src/platform/index.ts +32 -32
- package/src/platform/router.ts +40 -40
- package/src/platform/vscode/bridge.ts +121 -121
- package/src/platform/vscode/components/ConnectionPanel.vue +272 -272
- package/src/platform/vscode/components/DatabasePanel.vue +532 -532
- package/src/platform/vscode/components/QueryPanel.vue +371 -371
- package/src/platform/vscode/entry/connection.ts +13 -13
- package/src/platform/vscode/entry/database.ts +13 -13
- package/src/platform/vscode/entry/query.ts +13 -13
- package/src/platform/vscode/index.ts +5 -5
- package/src/service/base.ts +133 -127
- package/src/service/database.ts +505 -495
- package/src/service/login.ts +120 -120
- package/src/shims-vue.d.ts +6 -6
- package/src/stores/connection.ts +266 -266
- package/src/stores/session.ts +87 -87
- package/src/typings/database-types.ts +412 -412
- package/src/typings/database.ts +363 -363
- package/src/typings/global.d.ts +58 -58
- package/src/typings/pinia.d.ts +7 -7
- package/src/utils/clipboard.ts +29 -29
- package/src/utils/database-types.ts +242 -242
- package/src/utils/modal.ts +123 -123
- package/src/utils/request.ts +55 -55
- package/src/utils/sleep.ts +3 -3
- package/src/utils/toast.ts +73 -73
- package/src/utils/util.ts +171 -171
- package/src/utils/xlsx.ts +228 -228
- package/tsconfig.json +33 -33
- package/view/index.html +9 -9
- package/view/modules/header.tpl +13 -13
- package/view/modules/initial_state.tpl +19 -19
- package/vite.config.ts +424 -424
- package/vite.config.vscode.ts +47 -47
- package/server/backups/db_ai_breakout_2026-03-11T08-38-48-677Z.sql +0 -0
|
@@ -217,20 +217,20 @@ class MySQLService extends base_service_1.BaseDatabaseService {
|
|
|
217
217
|
* 获取MySQL表列表
|
|
218
218
|
*/
|
|
219
219
|
async getTables(dataSource, database) {
|
|
220
|
-
const result = await dataSource.query(`
|
|
221
|
-
SELECT
|
|
222
|
-
TABLE_NAME as name,
|
|
223
|
-
TABLE_TYPE as type,
|
|
224
|
-
ENGINE as engine,
|
|
225
|
-
TABLE_ROWS as rowCount,
|
|
226
|
-
DATA_LENGTH as dataSize,
|
|
227
|
-
INDEX_LENGTH as indexSize,
|
|
228
|
-
TABLE_COLLATION as collation,
|
|
229
|
-
CREATE_TIME as createdAt,
|
|
230
|
-
UPDATE_TIME as updatedAt,
|
|
231
|
-
TABLE_COMMENT as comment
|
|
232
|
-
FROM information_schema.TABLES
|
|
233
|
-
WHERE TABLE_SCHEMA = ?
|
|
220
|
+
const result = await dataSource.query(`
|
|
221
|
+
SELECT
|
|
222
|
+
TABLE_NAME as name,
|
|
223
|
+
TABLE_TYPE as type,
|
|
224
|
+
ENGINE as engine,
|
|
225
|
+
TABLE_ROWS as rowCount,
|
|
226
|
+
DATA_LENGTH as dataSize,
|
|
227
|
+
INDEX_LENGTH as indexSize,
|
|
228
|
+
TABLE_COLLATION as collation,
|
|
229
|
+
CREATE_TIME as createdAt,
|
|
230
|
+
UPDATE_TIME as updatedAt,
|
|
231
|
+
TABLE_COMMENT as comment
|
|
232
|
+
FROM information_schema.TABLES
|
|
233
|
+
WHERE TABLE_SCHEMA = ?
|
|
234
234
|
`, [database]);
|
|
235
235
|
return result.map((row) => ({
|
|
236
236
|
name: row.name,
|
|
@@ -250,20 +250,20 @@ class MySQLService extends base_service_1.BaseDatabaseService {
|
|
|
250
250
|
*/
|
|
251
251
|
async getColumns(dataSource, database, table) {
|
|
252
252
|
// 使用兼容的SQL查询,避免使用某些MySQL版本不支持的NUMERIC_PRECISION和NUMERIC_SCALE
|
|
253
|
-
const result = await dataSource.query(`
|
|
254
|
-
SELECT
|
|
255
|
-
COLUMN_NAME as name,
|
|
256
|
-
COLUMN_TYPE as type,
|
|
257
|
-
IS_NULLABLE as nullable,
|
|
258
|
-
COLUMN_DEFAULT as defaultValue,
|
|
259
|
-
COLUMN_KEY as columnKey,
|
|
260
|
-
EXTRA as extra,
|
|
261
|
-
CHARACTER_MAXIMUM_LENGTH as length,
|
|
262
|
-
CHARACTER_SET_NAME as charset,
|
|
263
|
-
COLLATION_NAME as collation,
|
|
264
|
-
COLUMN_COMMENT as comment
|
|
265
|
-
FROM information_schema.COLUMNS
|
|
266
|
-
WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?
|
|
253
|
+
const result = await dataSource.query(`
|
|
254
|
+
SELECT
|
|
255
|
+
COLUMN_NAME as name,
|
|
256
|
+
COLUMN_TYPE as type,
|
|
257
|
+
IS_NULLABLE as nullable,
|
|
258
|
+
COLUMN_DEFAULT as defaultValue,
|
|
259
|
+
COLUMN_KEY as columnKey,
|
|
260
|
+
EXTRA as extra,
|
|
261
|
+
CHARACTER_MAXIMUM_LENGTH as length,
|
|
262
|
+
CHARACTER_SET_NAME as charset,
|
|
263
|
+
COLLATION_NAME as collation,
|
|
264
|
+
COLUMN_COMMENT as comment
|
|
265
|
+
FROM information_schema.COLUMNS
|
|
266
|
+
WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?
|
|
267
267
|
`, [database, table]);
|
|
268
268
|
return result.map((row) => {
|
|
269
269
|
// 从COLUMN_TYPE中解析精度信息
|
|
@@ -297,14 +297,14 @@ class MySQLService extends base_service_1.BaseDatabaseService {
|
|
|
297
297
|
*/
|
|
298
298
|
async getIndexes(dataSource, database, table) {
|
|
299
299
|
// 使用更兼容的SQL查询,避免使用保留关键字作为别名
|
|
300
|
-
const result = await dataSource.query(`
|
|
301
|
-
SELECT
|
|
302
|
-
INDEX_NAME as name,
|
|
303
|
-
INDEX_TYPE as type,
|
|
304
|
-
COLUMN_NAME as columnName
|
|
305
|
-
FROM information_schema.STATISTICS
|
|
306
|
-
WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?
|
|
307
|
-
ORDER BY INDEX_NAME, SEQ_IN_INDEX
|
|
300
|
+
const result = await dataSource.query(`
|
|
301
|
+
SELECT
|
|
302
|
+
INDEX_NAME as name,
|
|
303
|
+
INDEX_TYPE as type,
|
|
304
|
+
COLUMN_NAME as columnName
|
|
305
|
+
FROM information_schema.STATISTICS
|
|
306
|
+
WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?
|
|
307
|
+
ORDER BY INDEX_NAME, SEQ_IN_INDEX
|
|
308
308
|
`, [database, table]);
|
|
309
309
|
// 按索引名分组并判断唯一性
|
|
310
310
|
const indexMap = new Map();
|
|
@@ -334,21 +334,21 @@ class MySQLService extends base_service_1.BaseDatabaseService {
|
|
|
334
334
|
* 获取MySQL外键信息
|
|
335
335
|
*/
|
|
336
336
|
async getForeignKeys(dataSource, database, table) {
|
|
337
|
-
const result = await dataSource.query(`
|
|
338
|
-
SELECT
|
|
339
|
-
kcu.CONSTRAINT_NAME as name,
|
|
340
|
-
kcu.COLUMN_NAME as columnName,
|
|
341
|
-
kcu.REFERENCED_TABLE_NAME as referencedTable,
|
|
342
|
-
kcu.REFERENCED_COLUMN_NAME as referencedColumn,
|
|
343
|
-
rc.DELETE_RULE as onDelete,
|
|
344
|
-
rc.UPDATE_RULE as onUpdate
|
|
345
|
-
FROM information_schema.KEY_COLUMN_USAGE kcu
|
|
346
|
-
LEFT JOIN information_schema.REFERENTIAL_CONSTRAINTS rc
|
|
347
|
-
ON kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME
|
|
348
|
-
AND kcu.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA
|
|
349
|
-
WHERE kcu.TABLE_SCHEMA = ?
|
|
350
|
-
AND kcu.TABLE_NAME = ?
|
|
351
|
-
AND kcu.REFERENCED_TABLE_NAME IS NOT NULL
|
|
337
|
+
const result = await dataSource.query(`
|
|
338
|
+
SELECT
|
|
339
|
+
kcu.CONSTRAINT_NAME as name,
|
|
340
|
+
kcu.COLUMN_NAME as columnName,
|
|
341
|
+
kcu.REFERENCED_TABLE_NAME as referencedTable,
|
|
342
|
+
kcu.REFERENCED_COLUMN_NAME as referencedColumn,
|
|
343
|
+
rc.DELETE_RULE as onDelete,
|
|
344
|
+
rc.UPDATE_RULE as onUpdate
|
|
345
|
+
FROM information_schema.KEY_COLUMN_USAGE kcu
|
|
346
|
+
LEFT JOIN information_schema.REFERENTIAL_CONSTRAINTS rc
|
|
347
|
+
ON kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME
|
|
348
|
+
AND kcu.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA
|
|
349
|
+
WHERE kcu.TABLE_SCHEMA = ?
|
|
350
|
+
AND kcu.TABLE_NAME = ?
|
|
351
|
+
AND kcu.REFERENCED_TABLE_NAME IS NOT NULL
|
|
352
352
|
`, [database, table]);
|
|
353
353
|
return result.map((row) => ({
|
|
354
354
|
name: row.name,
|
|
@@ -363,10 +363,10 @@ class MySQLService extends base_service_1.BaseDatabaseService {
|
|
|
363
363
|
* 获取MySQL数据库大小
|
|
364
364
|
*/
|
|
365
365
|
async getDatabaseSize(dataSource, database) {
|
|
366
|
-
const result = await dataSource.query(`
|
|
367
|
-
SELECT SUM(data_length + index_length) as size
|
|
368
|
-
FROM information_schema.tables
|
|
369
|
-
WHERE table_schema = ?
|
|
366
|
+
const result = await dataSource.query(`
|
|
367
|
+
SELECT SUM(data_length + index_length) as size
|
|
368
|
+
FROM information_schema.tables
|
|
369
|
+
WHERE table_schema = ?
|
|
370
370
|
`, [database]);
|
|
371
371
|
return result[0]?.size || 0;
|
|
372
372
|
}
|
|
@@ -381,13 +381,13 @@ class MySQLService extends base_service_1.BaseDatabaseService {
|
|
|
381
381
|
*/
|
|
382
382
|
async getViews(dataSource, database) {
|
|
383
383
|
// 完全移除TABLE_COMMENT字段,因为某些MySQL版本中不存在该字段
|
|
384
|
-
const result = await dataSource.query(`
|
|
385
|
-
SELECT
|
|
386
|
-
TABLE_NAME as name,
|
|
387
|
-
TABLE_SCHEMA as schemaName
|
|
388
|
-
FROM information_schema.VIEWS
|
|
389
|
-
WHERE TABLE_SCHEMA = ?
|
|
390
|
-
ORDER BY TABLE_NAME
|
|
384
|
+
const result = await dataSource.query(`
|
|
385
|
+
SELECT
|
|
386
|
+
TABLE_NAME as name,
|
|
387
|
+
TABLE_SCHEMA as schemaName
|
|
388
|
+
FROM information_schema.VIEWS
|
|
389
|
+
WHERE TABLE_SCHEMA = ?
|
|
390
|
+
ORDER BY TABLE_NAME
|
|
391
391
|
`, [database]);
|
|
392
392
|
return result.map((row) => ({
|
|
393
393
|
name: row.name,
|
|
@@ -399,11 +399,11 @@ class MySQLService extends base_service_1.BaseDatabaseService {
|
|
|
399
399
|
* 获取MySQL视图定义
|
|
400
400
|
*/
|
|
401
401
|
async getViewDefinition(dataSource, database, viewName) {
|
|
402
|
-
const result = await dataSource.query(`
|
|
403
|
-
SELECT VIEW_DEFINITION as definition
|
|
404
|
-
FROM information_schema.VIEWS
|
|
405
|
-
WHERE TABLE_SCHEMA = ?
|
|
406
|
-
AND TABLE_NAME = ?
|
|
402
|
+
const result = await dataSource.query(`
|
|
403
|
+
SELECT VIEW_DEFINITION as definition
|
|
404
|
+
FROM information_schema.VIEWS
|
|
405
|
+
WHERE TABLE_SCHEMA = ?
|
|
406
|
+
AND TABLE_NAME = ?
|
|
407
407
|
`, [database, viewName]);
|
|
408
408
|
return result[0]?.definition || '';
|
|
409
409
|
}
|
|
@@ -411,14 +411,14 @@ class MySQLService extends base_service_1.BaseDatabaseService {
|
|
|
411
411
|
* 获取MySQL存储过程列表
|
|
412
412
|
*/
|
|
413
413
|
async getProcedures(dataSource, database) {
|
|
414
|
-
const result = await dataSource.query(`
|
|
415
|
-
SELECT
|
|
416
|
-
ROUTINE_NAME as name,
|
|
417
|
-
ROUTINE_TYPE as type,
|
|
418
|
-
ROUTINE_COMMENT as comment
|
|
419
|
-
FROM information_schema.ROUTINES
|
|
420
|
-
WHERE ROUTINE_SCHEMA = ?
|
|
421
|
-
ORDER BY ROUTINE_NAME
|
|
414
|
+
const result = await dataSource.query(`
|
|
415
|
+
SELECT
|
|
416
|
+
ROUTINE_NAME as name,
|
|
417
|
+
ROUTINE_TYPE as type,
|
|
418
|
+
ROUTINE_COMMENT as comment
|
|
419
|
+
FROM information_schema.ROUTINES
|
|
420
|
+
WHERE ROUTINE_SCHEMA = ?
|
|
421
|
+
ORDER BY ROUTINE_NAME
|
|
422
422
|
`, [database]);
|
|
423
423
|
return result.map((row) => ({
|
|
424
424
|
name: row.name,
|
|
@@ -432,11 +432,11 @@ class MySQLService extends base_service_1.BaseDatabaseService {
|
|
|
432
432
|
* 获取MySQL存储过程定义
|
|
433
433
|
*/
|
|
434
434
|
async getProcedureDefinition(dataSource, database, procedureName) {
|
|
435
|
-
const result = await dataSource.query(`
|
|
436
|
-
SELECT ROUTINE_DEFINITION as definition
|
|
437
|
-
FROM information_schema.ROUTINES
|
|
438
|
-
WHERE ROUTINE_SCHEMA = ?
|
|
439
|
-
AND ROUTINE_NAME = ?
|
|
435
|
+
const result = await dataSource.query(`
|
|
436
|
+
SELECT ROUTINE_DEFINITION as definition
|
|
437
|
+
FROM information_schema.ROUTINES
|
|
438
|
+
WHERE ROUTINE_SCHEMA = ?
|
|
439
|
+
AND ROUTINE_NAME = ?
|
|
440
440
|
`, [database, procedureName]);
|
|
441
441
|
return result[0]?.definition || '';
|
|
442
442
|
}
|
|
@@ -49,11 +49,11 @@ class OracleService extends base_service_1.BaseDatabaseService {
|
|
|
49
49
|
* 获取Oracle数据库列表(用户schema)
|
|
50
50
|
*/
|
|
51
51
|
async getDatabases(dataSource) {
|
|
52
|
-
const result = await dataSource.query(`
|
|
53
|
-
SELECT username as name
|
|
54
|
-
FROM all_users
|
|
55
|
-
WHERE username NOT IN ('SYS', 'SYSTEM', 'XDB', 'OUTLN')
|
|
56
|
-
ORDER BY username
|
|
52
|
+
const result = await dataSource.query(`
|
|
53
|
+
SELECT username as name
|
|
54
|
+
FROM all_users
|
|
55
|
+
WHERE username NOT IN ('SYS', 'SYSTEM', 'XDB', 'OUTLN')
|
|
56
|
+
ORDER BY username
|
|
57
57
|
`);
|
|
58
58
|
return result.map((row) => row.name);
|
|
59
59
|
}
|
|
@@ -61,15 +61,15 @@ class OracleService extends base_service_1.BaseDatabaseService {
|
|
|
61
61
|
* 获取Oracle表列表
|
|
62
62
|
*/
|
|
63
63
|
async getTables(dataSource, database) {
|
|
64
|
-
const result = await dataSource.query(`
|
|
65
|
-
SELECT
|
|
66
|
-
table_name as name,
|
|
67
|
-
'TABLE' as type
|
|
68
|
-
FROM all_tables
|
|
69
|
-
WHERE owner = ?
|
|
70
|
-
AND table_name NOT LIKE 'BIN$%'
|
|
71
|
-
AND temporary = 'N'
|
|
72
|
-
ORDER BY table_name
|
|
64
|
+
const result = await dataSource.query(`
|
|
65
|
+
SELECT
|
|
66
|
+
table_name as name,
|
|
67
|
+
'TABLE' as type
|
|
68
|
+
FROM all_tables
|
|
69
|
+
WHERE owner = ?
|
|
70
|
+
AND table_name NOT LIKE 'BIN$%'
|
|
71
|
+
AND temporary = 'N'
|
|
72
|
+
ORDER BY table_name
|
|
73
73
|
`, [database.toUpperCase()]);
|
|
74
74
|
return result.map((row) => ({
|
|
75
75
|
name: row.name,
|
|
@@ -84,17 +84,17 @@ class OracleService extends base_service_1.BaseDatabaseService {
|
|
|
84
84
|
*/
|
|
85
85
|
async getColumns(dataSource, database, table) {
|
|
86
86
|
// 使用兼容的SQL查询,移除可能不兼容的字段
|
|
87
|
-
const result = await dataSource.query(`
|
|
88
|
-
SELECT
|
|
89
|
-
column_name as name,
|
|
90
|
-
data_type as type,
|
|
91
|
-
data_length as length,
|
|
92
|
-
nullable as nullable,
|
|
93
|
-
data_default as defaultValue
|
|
94
|
-
FROM all_tab_columns
|
|
95
|
-
WHERE owner = ?
|
|
96
|
-
AND table_name = ?
|
|
97
|
-
ORDER BY column_id
|
|
87
|
+
const result = await dataSource.query(`
|
|
88
|
+
SELECT
|
|
89
|
+
column_name as name,
|
|
90
|
+
data_type as type,
|
|
91
|
+
data_length as length,
|
|
92
|
+
nullable as nullable,
|
|
93
|
+
data_default as defaultValue
|
|
94
|
+
FROM all_tab_columns
|
|
95
|
+
WHERE owner = ?
|
|
96
|
+
AND table_name = ?
|
|
97
|
+
ORDER BY column_id
|
|
98
98
|
`, [
|
|
99
99
|
database.toUpperCase(),
|
|
100
100
|
table.toUpperCase()
|
|
@@ -133,20 +133,20 @@ class OracleService extends base_service_1.BaseDatabaseService {
|
|
|
133
133
|
* 获取Oracle索引信息
|
|
134
134
|
*/
|
|
135
135
|
async getIndexes(dataSource, database, table) {
|
|
136
|
-
const result = await dataSource.query(`
|
|
137
|
-
SELECT DISTINCT
|
|
138
|
-
i.index_name as name,
|
|
139
|
-
DECODE(i.uniqueness, 'UNIQUE', 'UNIQUE INDEX', 'INDEX') as type,
|
|
140
|
-
ic.column_name as column
|
|
141
|
-
FROM all_indexes i
|
|
142
|
-
JOIN all_ind_columns ic ON i.index_name = ic.index_name
|
|
143
|
-
WHERE i.table_owner = ?
|
|
144
|
-
AND i.table_name = ?
|
|
145
|
-
AND i.index_name NOT IN (SELECT constraint_name
|
|
146
|
-
FROM all_constraints
|
|
147
|
-
WHERE constraint_type = 'P'
|
|
148
|
-
AND table_owner = ?)
|
|
149
|
-
ORDER BY i.index_name, ic.column_position
|
|
136
|
+
const result = await dataSource.query(`
|
|
137
|
+
SELECT DISTINCT
|
|
138
|
+
i.index_name as name,
|
|
139
|
+
DECODE(i.uniqueness, 'UNIQUE', 'UNIQUE INDEX', 'INDEX') as type,
|
|
140
|
+
ic.column_name as column
|
|
141
|
+
FROM all_indexes i
|
|
142
|
+
JOIN all_ind_columns ic ON i.index_name = ic.index_name
|
|
143
|
+
WHERE i.table_owner = ?
|
|
144
|
+
AND i.table_name = ?
|
|
145
|
+
AND i.index_name NOT IN (SELECT constraint_name
|
|
146
|
+
FROM all_constraints
|
|
147
|
+
WHERE constraint_type = 'P'
|
|
148
|
+
AND table_owner = ?)
|
|
149
|
+
ORDER BY i.index_name, ic.column_position
|
|
150
150
|
`, [
|
|
151
151
|
database.toUpperCase(),
|
|
152
152
|
table.toUpperCase(),
|
|
@@ -171,20 +171,20 @@ class OracleService extends base_service_1.BaseDatabaseService {
|
|
|
171
171
|
* 获取Oracle外键信息
|
|
172
172
|
*/
|
|
173
173
|
async getForeignKeys(dataSource, database, table) {
|
|
174
|
-
const result = await dataSource.query(`
|
|
175
|
-
SELECT
|
|
176
|
-
c.constraint_name as name,
|
|
177
|
-
cc.column_name as column,
|
|
178
|
-
r.table_name as referencedTable,
|
|
179
|
-
rc.column_name as referencedColumn,
|
|
180
|
-
c.delete_rule as onDelete
|
|
181
|
-
FROM all_constraints c
|
|
182
|
-
JOIN all_cons_columns cc ON c.constraint_name = cc.constraint_name
|
|
183
|
-
JOIN all_constraints r ON c.r_constraint_name = r.constraint_name
|
|
184
|
-
JOIN all_cons_columns rc ON r.constraint_name = rc.constraint_name AND cc.position = rc.position
|
|
185
|
-
WHERE c.constraint_type = 'R'
|
|
186
|
-
AND c.owner = ?
|
|
187
|
-
AND c.table_name = ?
|
|
174
|
+
const result = await dataSource.query(`
|
|
175
|
+
SELECT
|
|
176
|
+
c.constraint_name as name,
|
|
177
|
+
cc.column_name as column,
|
|
178
|
+
r.table_name as referencedTable,
|
|
179
|
+
rc.column_name as referencedColumn,
|
|
180
|
+
c.delete_rule as onDelete
|
|
181
|
+
FROM all_constraints c
|
|
182
|
+
JOIN all_cons_columns cc ON c.constraint_name = cc.constraint_name
|
|
183
|
+
JOIN all_constraints r ON c.r_constraint_name = r.constraint_name
|
|
184
|
+
JOIN all_cons_columns rc ON r.constraint_name = rc.constraint_name AND cc.position = rc.position
|
|
185
|
+
WHERE c.constraint_type = 'R'
|
|
186
|
+
AND c.owner = ?
|
|
187
|
+
AND c.table_name = ?
|
|
188
188
|
`, [
|
|
189
189
|
database.toUpperCase(),
|
|
190
190
|
table.toUpperCase()
|
|
@@ -202,9 +202,9 @@ class OracleService extends base_service_1.BaseDatabaseService {
|
|
|
202
202
|
* 获取Oracle数据库大小(用户schema大小)
|
|
203
203
|
*/
|
|
204
204
|
async getDatabaseSize(dataSource, database) {
|
|
205
|
-
const result = await dataSource.query(`
|
|
206
|
-
SELECT SUM(bytes) as size
|
|
207
|
-
FROM user_segments
|
|
205
|
+
const result = await dataSource.query(`
|
|
206
|
+
SELECT SUM(bytes) as size
|
|
207
|
+
FROM user_segments
|
|
208
208
|
`);
|
|
209
209
|
return result[0]?.size || 0;
|
|
210
210
|
}
|
|
@@ -213,12 +213,12 @@ class OracleService extends base_service_1.BaseDatabaseService {
|
|
|
213
213
|
*/
|
|
214
214
|
async getTableStats(dataSource, database, table) {
|
|
215
215
|
try {
|
|
216
|
-
const result = await dataSource.query(`
|
|
217
|
-
SELECT
|
|
218
|
-
num_rows as rowCount,
|
|
219
|
-
(SELECT SUM(bytes) FROM user_segments WHERE segment_name = ?) as dataSize
|
|
220
|
-
FROM all_tables
|
|
221
|
-
WHERE owner = ? AND table_name = ?
|
|
216
|
+
const result = await dataSource.query(`
|
|
217
|
+
SELECT
|
|
218
|
+
num_rows as rowCount,
|
|
219
|
+
(SELECT SUM(bytes) FROM user_segments WHERE segment_name = ?) as dataSize
|
|
220
|
+
FROM all_tables
|
|
221
|
+
WHERE owner = ? AND table_name = ?
|
|
222
222
|
`, [
|
|
223
223
|
table.toUpperCase(),
|
|
224
224
|
database.toUpperCase(),
|
|
@@ -243,14 +243,14 @@ class OracleService extends base_service_1.BaseDatabaseService {
|
|
|
243
243
|
* 获取主键信息
|
|
244
244
|
*/
|
|
245
245
|
async getPrimaryKeys(dataSource, database, table) {
|
|
246
|
-
const result = await dataSource.query(`
|
|
247
|
-
SELECT column_name
|
|
248
|
-
FROM all_cons_columns cc
|
|
249
|
-
JOIN all_constraints c ON cc.constraint_name = c.constraint_name
|
|
250
|
-
WHERE c.constraint_type = 'P'
|
|
251
|
-
AND c.owner = ?
|
|
252
|
-
AND c.table_name = ?
|
|
253
|
-
ORDER BY cc.position
|
|
246
|
+
const result = await dataSource.query(`
|
|
247
|
+
SELECT column_name
|
|
248
|
+
FROM all_cons_columns cc
|
|
249
|
+
JOIN all_constraints c ON cc.constraint_name = c.constraint_name
|
|
250
|
+
WHERE c.constraint_type = 'P'
|
|
251
|
+
AND c.owner = ?
|
|
252
|
+
AND c.table_name = ?
|
|
253
|
+
ORDER BY cc.position
|
|
254
254
|
`, [
|
|
255
255
|
database.toUpperCase(),
|
|
256
256
|
table.toUpperCase()
|
|
@@ -262,16 +262,16 @@ class OracleService extends base_service_1.BaseDatabaseService {
|
|
|
262
262
|
*/
|
|
263
263
|
async getSequenceColumns(dataSource, database, table) {
|
|
264
264
|
try {
|
|
265
|
-
const result = await dataSource.query(`
|
|
266
|
-
SELECT acc.column_name
|
|
267
|
-
FROM all_tab_columns acc
|
|
268
|
-
JOIN all_triggers at ON acc.table_name = at.table_name
|
|
269
|
-
AND acc.owner = at.owner
|
|
270
|
-
JOIN all_sequences seq ON at.trigger_name LIKE seq.sequence_name || '%'
|
|
271
|
-
WHERE acc.owner = ?
|
|
272
|
-
AND acc.table_name = ?
|
|
273
|
-
AND acc.data_default IS NOT NULL
|
|
274
|
-
AND acc.data_default LIKE seq.sequence_name || '.nextval'
|
|
265
|
+
const result = await dataSource.query(`
|
|
266
|
+
SELECT acc.column_name
|
|
267
|
+
FROM all_tab_columns acc
|
|
268
|
+
JOIN all_triggers at ON acc.table_name = at.table_name
|
|
269
|
+
AND acc.owner = at.owner
|
|
270
|
+
JOIN all_sequences seq ON at.trigger_name LIKE seq.sequence_name || '%'
|
|
271
|
+
WHERE acc.owner = ?
|
|
272
|
+
AND acc.table_name = ?
|
|
273
|
+
AND acc.data_default IS NOT NULL
|
|
274
|
+
AND acc.data_default LIKE seq.sequence_name || '.nextval'
|
|
275
275
|
`, [
|
|
276
276
|
database.toUpperCase(),
|
|
277
277
|
table.toUpperCase()
|
|
@@ -293,13 +293,13 @@ class OracleService extends base_service_1.BaseDatabaseService {
|
|
|
293
293
|
* 获取Oracle视图列表
|
|
294
294
|
*/
|
|
295
295
|
async getViews(dataSource, database) {
|
|
296
|
-
const result = await dataSource.query(`
|
|
297
|
-
SELECT
|
|
298
|
-
view_name as name,
|
|
299
|
-
'' as comment
|
|
300
|
-
FROM all_views
|
|
301
|
-
WHERE owner = ?
|
|
302
|
-
ORDER BY view_name
|
|
296
|
+
const result = await dataSource.query(`
|
|
297
|
+
SELECT
|
|
298
|
+
view_name as name,
|
|
299
|
+
'' as comment
|
|
300
|
+
FROM all_views
|
|
301
|
+
WHERE owner = ?
|
|
302
|
+
ORDER BY view_name
|
|
303
303
|
`, [database.toUpperCase()]);
|
|
304
304
|
return result.map((row) => ({
|
|
305
305
|
name: row.name,
|
|
@@ -311,11 +311,11 @@ class OracleService extends base_service_1.BaseDatabaseService {
|
|
|
311
311
|
* 获取Oracle视图定义
|
|
312
312
|
*/
|
|
313
313
|
async getViewDefinition(dataSource, database, viewName) {
|
|
314
|
-
const result = await dataSource.query(`
|
|
315
|
-
SELECT text as definition
|
|
316
|
-
FROM all_views
|
|
317
|
-
WHERE owner = ?
|
|
318
|
-
AND view_name = ?
|
|
314
|
+
const result = await dataSource.query(`
|
|
315
|
+
SELECT text as definition
|
|
316
|
+
FROM all_views
|
|
317
|
+
WHERE owner = ?
|
|
318
|
+
AND view_name = ?
|
|
319
319
|
`, [database.toUpperCase(), viewName.toUpperCase()]);
|
|
320
320
|
return result[0]?.definition || '';
|
|
321
321
|
}
|
|
@@ -323,18 +323,18 @@ class OracleService extends base_service_1.BaseDatabaseService {
|
|
|
323
323
|
* 获取Oracle存储过程列表
|
|
324
324
|
*/
|
|
325
325
|
async getProcedures(dataSource, database) {
|
|
326
|
-
const result = await dataSource.query(`
|
|
327
|
-
SELECT
|
|
328
|
-
object_name as name,
|
|
329
|
-
'' as comment,
|
|
330
|
-
'PROCEDURE' as type,
|
|
331
|
-
'' as returnType,
|
|
332
|
-
'PL/SQL' as language
|
|
333
|
-
FROM all_objects
|
|
334
|
-
WHERE owner = ?
|
|
335
|
-
AND object_type IN ('PROCEDURE', 'FUNCTION')
|
|
336
|
-
AND status = 'VALID'
|
|
337
|
-
ORDER BY object_name
|
|
326
|
+
const result = await dataSource.query(`
|
|
327
|
+
SELECT
|
|
328
|
+
object_name as name,
|
|
329
|
+
'' as comment,
|
|
330
|
+
'PROCEDURE' as type,
|
|
331
|
+
'' as returnType,
|
|
332
|
+
'PL/SQL' as language
|
|
333
|
+
FROM all_objects
|
|
334
|
+
WHERE owner = ?
|
|
335
|
+
AND object_type IN ('PROCEDURE', 'FUNCTION')
|
|
336
|
+
AND status = 'VALID'
|
|
337
|
+
ORDER BY object_name
|
|
338
338
|
`, [database.toUpperCase()]);
|
|
339
339
|
return result.map((row) => ({
|
|
340
340
|
name: row.name,
|
|
@@ -348,12 +348,12 @@ class OracleService extends base_service_1.BaseDatabaseService {
|
|
|
348
348
|
* 获取Oracle存储过程定义
|
|
349
349
|
*/
|
|
350
350
|
async getProcedureDefinition(dataSource, database, procedureName) {
|
|
351
|
-
const result = await dataSource.query(`
|
|
352
|
-
SELECT text as definition
|
|
353
|
-
FROM all_source
|
|
354
|
-
WHERE owner = ?
|
|
355
|
-
AND name = ?
|
|
356
|
-
ORDER BY line
|
|
351
|
+
const result = await dataSource.query(`
|
|
352
|
+
SELECT text as definition
|
|
353
|
+
FROM all_source
|
|
354
|
+
WHERE owner = ?
|
|
355
|
+
AND name = ?
|
|
356
|
+
ORDER BY line
|
|
357
357
|
`, [database.toUpperCase(), procedureName.toUpperCase()]);
|
|
358
358
|
return result.map((row) => row.definition).join('\n') || '';
|
|
359
359
|
}
|
|
@@ -470,16 +470,16 @@ class OracleService extends base_service_1.BaseDatabaseService {
|
|
|
470
470
|
// Oracle查看日志
|
|
471
471
|
try {
|
|
472
472
|
// 尝试查看Oracle警告日志
|
|
473
|
-
const logs = await dataSource.query(`
|
|
474
|
-
SELECT * FROM v$diag_info WHERE name LIKE '%Log%'
|
|
473
|
+
const logs = await dataSource.query(`
|
|
474
|
+
SELECT * FROM v$diag_info WHERE name LIKE '%Log%'
|
|
475
475
|
`);
|
|
476
476
|
return logs;
|
|
477
477
|
}
|
|
478
478
|
catch (error) {
|
|
479
479
|
try {
|
|
480
480
|
// 尝试查看Oracle系统事件
|
|
481
|
-
const logs = await dataSource.query(`
|
|
482
|
-
SELECT * FROM v$event_name WHERE name LIKE '%log%' LIMIT ${limit}
|
|
481
|
+
const logs = await dataSource.query(`
|
|
482
|
+
SELECT * FROM v$event_name WHERE name LIKE '%log%' LIMIT ${limit}
|
|
483
483
|
`);
|
|
484
484
|
return logs;
|
|
485
485
|
}
|
|
@@ -541,12 +541,12 @@ class OracleService extends base_service_1.BaseDatabaseService {
|
|
|
541
541
|
// 构建RMAN命令
|
|
542
542
|
const rmanCommand = `rman target ${user}/${password}@${host}:${port}/${serviceName} cmdfile=${backupPath}/restore.rman`;
|
|
543
543
|
// 创建RMAN命令文件
|
|
544
|
-
const rmanScript = `
|
|
545
|
-
SHUTDOWN IMMEDIATE;
|
|
546
|
-
STARTUP MOUNT;
|
|
547
|
-
RESTORE DATABASE FROM DISK '${filePath}';
|
|
548
|
-
RECOVER DATABASE;
|
|
549
|
-
ALTER DATABASE OPEN;
|
|
544
|
+
const rmanScript = `
|
|
545
|
+
SHUTDOWN IMMEDIATE;
|
|
546
|
+
STARTUP MOUNT;
|
|
547
|
+
RESTORE DATABASE FROM DISK '${filePath}';
|
|
548
|
+
RECOVER DATABASE;
|
|
549
|
+
ALTER DATABASE OPEN;
|
|
550
550
|
`;
|
|
551
551
|
fs.writeFileSync(path.join(backupPath, 'restore.rman'), rmanScript);
|
|
552
552
|
// 执行命令
|