fdb2 1.0.6 → 1.0.8
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/.vscodeignore +45 -0
- package/README.md +24 -85
- package/dist/package.json +115 -0
- package/dist/pnpm-lock.yaml +7447 -0
- package/dist/public/explorer.css +244 -111
- package/dist/public/explorer.js +523 -278
- package/dist/scripts/preinstall.js +112 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +4 -9
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.ts +5 -10
- package/dist/server/service/connection.service.d.ts.map +1 -1
- package/dist/server/service/connection.service.js +1 -0
- package/dist/server/service/connection.service.js.map +1 -1
- package/dist/server/service/connection.service.ts +1 -0
- package/dist/server/service/database/base.service.d.ts +4 -0
- package/dist/server/service/database/base.service.d.ts.map +1 -1
- package/dist/server/service/database/base.service.js +3 -3
- package/dist/server/service/database/base.service.js.map +1 -1
- package/dist/server/service/database/base.service.ts +8 -3
- package/dist/server/service/database/cockroachdb.service.d.ts +5 -0
- package/dist/server/service/database/cockroachdb.service.d.ts.map +1 -1
- package/dist/server/service/database/cockroachdb.service.js +112 -0
- package/dist/server/service/database/cockroachdb.service.js.map +1 -1
- package/dist/server/service/database/cockroachdb.service.ts +123 -0
- 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 +8 -0
- package/dist/server/service/database/database.service.js.map +1 -1
- package/dist/server/service/database/database.service.ts +9 -0
- package/dist/server/service/database/mongodb.service.d.ts +6 -0
- package/dist/server/service/database/mongodb.service.d.ts.map +1 -1
- package/dist/server/service/database/mongodb.service.js +8 -0
- package/dist/server/service/database/mongodb.service.js.map +1 -1
- package/dist/server/service/database/mongodb.service.ts +9 -0
- package/dist/server/service/database/mssql.service.d.ts +4 -0
- package/dist/server/service/database/mssql.service.d.ts.map +1 -1
- package/dist/server/service/database/mssql.service.js +105 -0
- package/dist/server/service/database/mssql.service.js.map +1 -1
- package/dist/server/service/database/mssql.service.ts +118 -0
- package/dist/server/service/database/mysql.service.d.ts +4 -0
- package/dist/server/service/database/mysql.service.d.ts.map +1 -1
- package/dist/server/service/database/mysql.service.js +116 -0
- package/dist/server/service/database/mysql.service.js.map +1 -1
- package/dist/server/service/database/mysql.service.ts +130 -0
- package/dist/server/service/database/oracle.service.d.ts +4 -0
- package/dist/server/service/database/oracle.service.d.ts.map +1 -1
- package/dist/server/service/database/oracle.service.js +114 -0
- package/dist/server/service/database/oracle.service.js.map +1 -1
- package/dist/server/service/database/oracle.service.ts +128 -0
- package/dist/server/service/database/postgres.service.d.ts +4 -0
- package/dist/server/service/database/postgres.service.d.ts.map +1 -1
- package/dist/server/service/database/postgres.service.js +120 -0
- package/dist/server/service/database/postgres.service.js.map +1 -1
- package/dist/server/service/database/postgres.service.ts +131 -0
- package/dist/server/service/database/sap.service.d.ts +4 -0
- package/dist/server/service/database/sap.service.d.ts.map +1 -1
- package/dist/server/service/database/sap.service.js +107 -0
- package/dist/server/service/database/sap.service.js.map +1 -1
- package/dist/server/service/database/sap.service.ts +120 -0
- package/dist/server/service/database/sqlite.service.d.ts +5 -0
- package/dist/server/service/database/sqlite.service.d.ts.map +1 -1
- package/dist/server/service/database/sqlite.service.js +133 -0
- package/dist/server/service/database/sqlite.service.js.map +1 -1
- package/dist/server/service/database/sqlite.service.ts +150 -0
- package/fdb2.server.pid +1 -0
- package/package.json +18 -9
- package/packages/vscode/.vscodeignore +44 -0
- package/packages/vscode/README.md +62 -0
- package/packages/vscode/out/database-services/base.service.js +236 -0
- package/packages/vscode/out/database-services/base.service.js.map +1 -0
- package/packages/vscode/out/database-services/cockroachdb.service.js +634 -0
- package/packages/vscode/out/database-services/cockroachdb.service.js.map +1 -0
- package/packages/vscode/out/database-services/connection.service.js +346 -0
- package/packages/vscode/out/database-services/connection.service.js.map +1 -0
- package/packages/vscode/out/database-services/database.service.js +571 -0
- package/packages/vscode/out/database-services/database.service.js.map +1 -0
- package/packages/vscode/out/database-services/index.js +18 -0
- package/packages/vscode/out/database-services/index.js.map +1 -0
- package/packages/vscode/out/database-services/model/connection.entity.js +11 -0
- package/packages/vscode/out/database-services/model/connection.entity.js.map +1 -0
- package/packages/vscode/out/database-services/model/database.entity.js +35 -0
- package/packages/vscode/out/database-services/model/database.entity.js.map +1 -0
- package/packages/vscode/out/database-services/mongodb.service.js +458 -0
- package/packages/vscode/out/database-services/mongodb.service.js.map +1 -0
- package/packages/vscode/out/database-services/mssql.service.js +694 -0
- package/packages/vscode/out/database-services/mssql.service.js.map +1 -0
- package/packages/vscode/out/database-services/mysql.service.js +735 -0
- package/packages/vscode/out/database-services/mysql.service.js.map +1 -0
- package/packages/vscode/out/database-services/oracle.service.js +787 -0
- package/packages/vscode/out/database-services/oracle.service.js.map +1 -0
- package/packages/vscode/out/database-services/postgres.service.js +696 -0
- package/packages/vscode/out/database-services/postgres.service.js.map +1 -0
- package/packages/vscode/out/database-services/sap.service.js +695 -0
- package/packages/vscode/out/database-services/sap.service.js.map +1 -0
- package/packages/vscode/out/database-services/sqlite.service.js +532 -0
- package/packages/vscode/out/database-services/sqlite.service.js.map +1 -0
- package/packages/vscode/out/extension.js +93 -0
- package/packages/vscode/out/extension.js.map +1 -0
- package/packages/vscode/out/provider/DatabaseTreeProvider.js +159 -0
- package/packages/vscode/out/provider/DatabaseTreeProvider.js.map +1 -0
- package/packages/vscode/out/provider/WebViewProvider.js +259 -0
- package/packages/vscode/out/provider/WebViewProvider.js.map +1 -0
- package/packages/vscode/out/service/ConnectionManager.js +105 -0
- package/packages/vscode/out/service/ConnectionManager.js.map +1 -0
- package/packages/vscode/out/service/DatabaseServiceBridge.js +395 -0
- package/packages/vscode/out/service/DatabaseServiceBridge.js.map +1 -0
- package/packages/vscode/out/typings/connection.js +3 -0
- package/packages/vscode/out/typings/connection.js.map +1 -0
- package/packages/vscode/package.json +142 -0
- package/packages/vscode/resources/icon.svg +5 -0
- package/packages/vscode/resources/webview/_plugin-vue_export-helper.js +6529 -0
- package/packages/vscode/resources/webview/_plugin-vue_export-helper.js.map +1 -0
- package/packages/vscode/resources/webview/connection.css +69 -0
- package/packages/vscode/resources/webview/connection.js +228 -0
- package/packages/vscode/resources/webview/connection.js.map +1 -0
- package/packages/vscode/resources/webview/database.css +259 -0
- package/packages/vscode/resources/webview/database.js +275 -0
- package/packages/vscode/resources/webview/database.js.map +1 -0
- package/packages/vscode/resources/webview/favicon.ico +0 -0
- package/packages/vscode/resources/webview/index.html +9 -0
- package/packages/vscode/resources/webview/modules/header.tpl +14 -0
- package/packages/vscode/resources/webview/modules/initial_state.tpl +55 -0
- package/packages/vscode/resources/webview/query.css +162 -0
- package/packages/vscode/resources/webview/query.js +198 -0
- package/packages/vscode/resources/webview/query.js.map +1 -0
- package/packages/vscode/src/database-services/base.service.js.map +1 -0
- package/packages/vscode/src/database-services/base.service.ts +363 -0
- package/packages/vscode/src/database-services/cockroachdb.service.js.map +1 -0
- package/packages/vscode/src/database-services/cockroachdb.service.ts +659 -0
- package/packages/vscode/src/database-services/connection.service.ts +341 -0
- package/packages/vscode/src/database-services/database.service.ts +630 -0
- package/packages/vscode/src/database-services/index.ts +7 -0
- package/packages/vscode/src/database-services/model/connection.entity.js +11 -0
- package/packages/vscode/src/database-services/model/connection.entity.js.map +1 -0
- package/packages/vscode/src/database-services/model/connection.entity.ts +66 -0
- package/packages/vscode/src/database-services/model/database.entity.js +35 -0
- package/packages/vscode/src/database-services/model/database.entity.js.map +1 -0
- package/packages/vscode/src/database-services/model/database.entity.ts +246 -0
- package/packages/vscode/src/database-services/mongodb.service.js.map +1 -0
- package/packages/vscode/src/database-services/mongodb.service.ts +454 -0
- package/packages/vscode/src/database-services/mssql.service.js.map +1 -0
- package/packages/vscode/src/database-services/mssql.service.ts +723 -0
- package/packages/vscode/src/database-services/mysql.service.js.map +1 -0
- package/packages/vscode/src/database-services/mysql.service.ts +761 -0
- package/packages/vscode/src/database-services/oracle.service.js.map +1 -0
- package/packages/vscode/src/database-services/oracle.service.ts +832 -0
- package/packages/vscode/src/database-services/postgres.service.js.map +1 -0
- package/packages/vscode/src/database-services/postgres.service.ts +741 -0
- package/packages/vscode/src/database-services/sap.service.js.map +1 -0
- package/packages/vscode/src/database-services/sap.service.ts +713 -0
- package/packages/vscode/src/database-services/sqlite.service.js.map +1 -0
- package/packages/vscode/src/database-services/sqlite.service.ts +559 -0
- package/packages/vscode/src/extension.ts +76 -0
- package/packages/vscode/src/provider/DatabaseTreeProvider.ts +167 -0
- package/packages/vscode/src/provider/WebViewProvider.ts +277 -0
- package/packages/vscode/src/service/DatabaseServiceBridge.ts +414 -0
- package/packages/vscode/src/typings/connection.ts +90 -0
- package/packages/vscode/tsconfig.json +21 -0
- package/public/fdb2.png +0 -0
- package/server/backups/db_ai_breakout_2026-03-11T08-38-48-677Z.sql +0 -0
- package/server/index.ts +5 -10
- package/server/model/connection.entity.js +11 -0
- package/server/model/connection.entity.js.map +1 -0
- package/server/model/database.entity.js +35 -0
- package/server/model/database.entity.js.map +1 -0
- package/server/service/connection.service.ts +1 -0
- package/server/service/database/base.service.ts +8 -3
- package/server/service/database/cockroachdb.service.ts +123 -0
- package/server/service/database/database.service.ts +9 -0
- package/server/service/database/mongodb.service.ts +9 -0
- package/server/service/database/mssql.service.ts +118 -0
- package/server/service/database/mysql.service.ts +130 -0
- package/server/service/database/oracle.service.ts +128 -0
- package/server/service/database/postgres.service.ts +131 -0
- package/server/service/database/sap.service.ts +120 -0
- package/server/service/database/sqlite.service.ts +150 -0
- package/server/tsconfig.json +20 -0
- package/src/components/connection-editor/index.vue +0 -1
- package/src/platform/database/components/db-tools.vue +414 -174
- package/src/platform/database/components/table-detail.vue +3 -2
- package/src/platform/database/components/table-editor.vue +245 -18
- package/src/platform/vscode/bridge.ts +121 -0
- package/src/platform/vscode/components/ConnectionPanel.vue +272 -0
- package/src/platform/vscode/components/DatabasePanel.vue +532 -0
- package/src/platform/vscode/components/QueryPanel.vue +371 -0
- package/src/platform/vscode/entry/connection.ts +13 -0
- package/src/platform/vscode/entry/database.ts +13 -0
- package/src/platform/vscode/entry/query.ts +13 -0
- package/src/platform/vscode/index.ts +5 -0
- package/src/service/database.ts +2 -6
- package/vite.config.ts +46 -6
- package/vite.config.vscode.ts +47 -0
|
@@ -158,9 +158,9 @@
|
|
|
158
158
|
</thead>
|
|
159
159
|
<tbody>
|
|
160
160
|
<tr v-for="(row, index) in paginatedData" :key="index">
|
|
161
|
-
<td v-for="
|
|
161
|
+
<td v-for="column in safeTableColumns" :key="column.name">
|
|
162
162
|
<div class="cell-value">
|
|
163
|
-
{{ formatCellValue(
|
|
163
|
+
{{ formatCellValue(row[column.name]) }}
|
|
164
164
|
</div>
|
|
165
165
|
</td>
|
|
166
166
|
<td>
|
|
@@ -461,6 +461,7 @@
|
|
|
461
461
|
:connection="connection"
|
|
462
462
|
:database="database"
|
|
463
463
|
:table="table"
|
|
464
|
+
:columns="tableStructure?.columns"
|
|
464
465
|
:mode="tableEditorMode"
|
|
465
466
|
@close="closeTableEditor"
|
|
466
467
|
@submit="handleTableStructureChange"
|
|
@@ -193,6 +193,7 @@ import type { ConnectionEntity, TableEntity } from '@/typings/database';
|
|
|
193
193
|
import { DatabaseService } from '@/service/database';
|
|
194
194
|
import { modal } from '@/utils/modal';
|
|
195
195
|
import { getColumnTypesByName, ColumnCategory } from '@/typings/database-types';
|
|
196
|
+
import { isNumericType, isBooleanType } from '@/utils/database-types';
|
|
196
197
|
|
|
197
198
|
// Props
|
|
198
199
|
const props = defineProps<{
|
|
@@ -200,6 +201,7 @@ const props = defineProps<{
|
|
|
200
201
|
connection: ConnectionEntity | null;
|
|
201
202
|
database: string;
|
|
202
203
|
table?: TableEntity | null;
|
|
204
|
+
columns?: any[];
|
|
203
205
|
mode: 'create' | 'edit';
|
|
204
206
|
}>();
|
|
205
207
|
|
|
@@ -245,13 +247,21 @@ const formData = ref({
|
|
|
245
247
|
}]
|
|
246
248
|
});
|
|
247
249
|
|
|
250
|
+
// 原始表结构(用于对比差异)
|
|
251
|
+
const originalTableData = ref({
|
|
252
|
+
tableName: '',
|
|
253
|
+
tableComment: '',
|
|
254
|
+
columns: []
|
|
255
|
+
});
|
|
256
|
+
|
|
248
257
|
// 初始化表单数据
|
|
249
|
-
function initFormData() {
|
|
258
|
+
function initFormData() {
|
|
250
259
|
if (props.mode === 'edit' && props.table) {
|
|
251
|
-
|
|
260
|
+
const columns = props.columns || props.table.columns || [];
|
|
261
|
+
const tableData = {
|
|
252
262
|
tableName: props.table.name || '',
|
|
253
263
|
tableComment: props.table.comment || '',
|
|
254
|
-
columns:
|
|
264
|
+
columns: columns.map(col => ({
|
|
255
265
|
name: col.name || '',
|
|
256
266
|
type: col.type || '',
|
|
257
267
|
length: col.length || '',
|
|
@@ -264,6 +274,8 @@ function initFormData() {
|
|
|
264
274
|
comment: col.comment || ''
|
|
265
275
|
})) || []
|
|
266
276
|
};
|
|
277
|
+
formData.value = { ...tableData };
|
|
278
|
+
originalTableData.value = JSON.parse(JSON.stringify(tableData));
|
|
267
279
|
} else {
|
|
268
280
|
formData.value = {
|
|
269
281
|
tableName: '',
|
|
@@ -281,9 +293,70 @@ function initFormData() {
|
|
|
281
293
|
comment: ''
|
|
282
294
|
}]
|
|
283
295
|
};
|
|
296
|
+
originalTableData.value = {
|
|
297
|
+
tableName: '',
|
|
298
|
+
tableComment: '',
|
|
299
|
+
columns: []
|
|
300
|
+
};
|
|
284
301
|
}
|
|
285
302
|
}
|
|
286
303
|
|
|
304
|
+
// 计算表结构差异
|
|
305
|
+
function calculateTableDiff() {
|
|
306
|
+
const diff = {
|
|
307
|
+
tableName: formData.value.tableName,
|
|
308
|
+
tableCommentChanged: formData.value.tableComment !== originalTableData.value.tableComment,
|
|
309
|
+
tableComment: formData.value.tableComment,
|
|
310
|
+
addedColumns: [],
|
|
311
|
+
modifiedColumns: [],
|
|
312
|
+
deletedColumns: []
|
|
313
|
+
};
|
|
314
|
+
|
|
315
|
+
// 创建原始列的映射(按列名)
|
|
316
|
+
const originalColumnsMap = new Map();
|
|
317
|
+
originalTableData.value.columns.forEach(col => {
|
|
318
|
+
originalColumnsMap.set(col.name, col);
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
// 检查新增和修改的列
|
|
322
|
+
formData.value.columns.forEach(newCol => {
|
|
323
|
+
const originalCol = originalColumnsMap.get(newCol.name);
|
|
324
|
+
|
|
325
|
+
if (!originalCol) {
|
|
326
|
+
// 新增列
|
|
327
|
+
diff.addedColumns.push(newCol);
|
|
328
|
+
} else {
|
|
329
|
+
// 检查列是否被修改
|
|
330
|
+
const isModified =
|
|
331
|
+
newCol.type !== originalCol.type ||
|
|
332
|
+
newCol.length !== originalCol.length ||
|
|
333
|
+
newCol.precision !== originalCol.precision ||
|
|
334
|
+
newCol.scale !== originalCol.scale ||
|
|
335
|
+
newCol.nullable !== originalCol.nullable ||
|
|
336
|
+
newCol.defaultValue !== originalCol.defaultValue ||
|
|
337
|
+
newCol.isPrimary !== originalCol.isPrimary ||
|
|
338
|
+
newCol.isAutoIncrement !== originalCol.isAutoIncrement ||
|
|
339
|
+
newCol.comment !== originalCol.comment;
|
|
340
|
+
|
|
341
|
+
if (isModified) {
|
|
342
|
+
diff.modifiedColumns.push({
|
|
343
|
+
oldColumn: originalCol,
|
|
344
|
+
newColumn: newCol
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
// 检查删除的列
|
|
351
|
+
originalTableData.value.columns.forEach(originalCol => {
|
|
352
|
+
const existsInNew = formData.value.columns.some(newCol => newCol.name === originalCol.name);
|
|
353
|
+
if (!existsInNew) {
|
|
354
|
+
diff.deletedColumns.push(originalCol);
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
return diff;
|
|
359
|
+
}
|
|
287
360
|
// 添加字段
|
|
288
361
|
function addColumn() {
|
|
289
362
|
formData.value.columns.push({
|
|
@@ -347,10 +420,10 @@ function generateSQL(): string {
|
|
|
347
420
|
|
|
348
421
|
let sql = `${quoteIdentifier(col.name)} ${col.type}`;
|
|
349
422
|
|
|
350
|
-
//
|
|
351
|
-
if (col.length && (needsLength(col) || col.type.includes('CHAR'))) {
|
|
423
|
+
// 处理长度和精度参数(仅当类型中不包含括号时)
|
|
424
|
+
if (!col.type.includes('(') && col.length && (needsLength(col) || col.type.includes('CHAR'))) {
|
|
352
425
|
sql += `(${col.length})`;
|
|
353
|
-
} else if (col.precision) {
|
|
426
|
+
} else if (!col.type.includes('(') && col.precision) {
|
|
354
427
|
if (col.scale) {
|
|
355
428
|
sql += `(${col.precision},${col.scale})`;
|
|
356
429
|
} else {
|
|
@@ -490,8 +563,125 @@ function generateSQL(): string {
|
|
|
490
563
|
|
|
491
564
|
return sql;
|
|
492
565
|
} else {
|
|
493
|
-
// 修改表SQL
|
|
494
|
-
|
|
566
|
+
// 修改表SQL
|
|
567
|
+
const quoteIdentifier = (name: string) => {
|
|
568
|
+
if (!props.connection) return `"${name}"`;
|
|
569
|
+
switch (props.connection.type.toLowerCase()) {
|
|
570
|
+
case 'mysql': return `\`${name}\``;
|
|
571
|
+
case 'postgres': return `"${name}"`;
|
|
572
|
+
case 'sqlite': return `"${name}"`;
|
|
573
|
+
case 'oracle': return `"${name.toUpperCase()}"`;
|
|
574
|
+
case 'mssql': return `[${name}]`;
|
|
575
|
+
default: return `"${name}"`;
|
|
576
|
+
}
|
|
577
|
+
};
|
|
578
|
+
|
|
579
|
+
const sqlStatements: string[] = [];
|
|
580
|
+
const tableName = formData.value.tableName;
|
|
581
|
+
|
|
582
|
+
// 修改表注释
|
|
583
|
+
if (formData.value.tableComment) {
|
|
584
|
+
switch (props.connection?.type.toLowerCase()) {
|
|
585
|
+
case 'mysql':
|
|
586
|
+
sqlStatements.push(`ALTER TABLE ${quoteIdentifier(tableName)} COMMENT='${formData.value.tableComment}'`);
|
|
587
|
+
break;
|
|
588
|
+
case 'postgres':
|
|
589
|
+
sqlStatements.push(`COMMENT ON TABLE ${quoteIdentifier(tableName)} IS '${formData.value.tableComment}'`);
|
|
590
|
+
break;
|
|
591
|
+
case 'oracle':
|
|
592
|
+
sqlStatements.push(`COMMENT ON TABLE ${quoteIdentifier(tableName)} IS '${formData.value.tableComment}'`);
|
|
593
|
+
break;
|
|
594
|
+
case 'mssql':
|
|
595
|
+
sqlStatements.push(`EXEC sp_addextendedproperty 'MS_Description', '${formData.value.tableComment}', 'SCHEMA', 'dbo', 'TABLE', '${tableName}'`);
|
|
596
|
+
break;
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
// 生成列修改语句
|
|
601
|
+
formData.value.columns.forEach(col => {
|
|
602
|
+
if (!col.name || !col.type) return;
|
|
603
|
+
|
|
604
|
+
let columnSQL = `${quoteIdentifier(col.name)} ${col.type}`;
|
|
605
|
+
|
|
606
|
+
// 处理长度和精度参数(仅当类型中不包含括号时)
|
|
607
|
+
if (!col.type.includes('(') && col.length && (needsLength(col) || col.type.includes('CHAR'))) {
|
|
608
|
+
columnSQL += `(${col.length})`;
|
|
609
|
+
} else if (!col.type.includes('(') && col.precision) {
|
|
610
|
+
if (col.scale) {
|
|
611
|
+
columnSQL += `(${col.precision},${col.scale})`;
|
|
612
|
+
} else {
|
|
613
|
+
columnSQL += `(${col.precision})`;
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
// 处理NULL约束
|
|
618
|
+
if (!col.nullable) {
|
|
619
|
+
columnSQL += ' NOT NULL';
|
|
620
|
+
} else {
|
|
621
|
+
columnSQL += ' NULL';
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
// 处理默认值
|
|
625
|
+
if (col.defaultValue) {
|
|
626
|
+
columnSQL += ` DEFAULT ${formatDefaultValue(col.defaultValue, col.type)}`;
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
// 处理注释
|
|
630
|
+
let commentStatement = '';
|
|
631
|
+
if (col.comment) {
|
|
632
|
+
switch (props.connection?.type.toLowerCase()) {
|
|
633
|
+
case 'mysql':
|
|
634
|
+
columnSQL += ` COMMENT '${col.comment}'`;
|
|
635
|
+
break;
|
|
636
|
+
case 'postgres':
|
|
637
|
+
commentStatement = `COMMENT ON COLUMN ${quoteIdentifier(tableName)}.${quoteIdentifier(col.name)} IS '${col.comment}'`;
|
|
638
|
+
break;
|
|
639
|
+
case 'oracle':
|
|
640
|
+
columnSQL += ` COMMENT '${col.comment}'`;
|
|
641
|
+
break;
|
|
642
|
+
case 'mssql':
|
|
643
|
+
commentStatement = `EXEC sp_addextendedproperty 'MS_Description', '${col.comment}', 'SCHEMA', 'dbo', 'TABLE', '${tableName}', 'COLUMN', '${col.name}'`;
|
|
644
|
+
break;
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
// 根据数据库类型生成 ALTER COLUMN 或 MODIFY COLUMN 语句
|
|
649
|
+
switch (props.connection?.type.toLowerCase()) {
|
|
650
|
+
case 'mysql':
|
|
651
|
+
sqlStatements.push(`ALTER TABLE ${quoteIdentifier(tableName)} MODIFY COLUMN ${columnSQL}`);
|
|
652
|
+
break;
|
|
653
|
+
case 'postgres':
|
|
654
|
+
case 'mssql':
|
|
655
|
+
sqlStatements.push(`ALTER TABLE ${quoteIdentifier(tableName)} ALTER COLUMN ${columnSQL}`);
|
|
656
|
+
break;
|
|
657
|
+
case 'oracle':
|
|
658
|
+
sqlStatements.push(`ALTER TABLE ${quoteIdentifier(tableName)} MODIFY ${columnSQL}`);
|
|
659
|
+
break;
|
|
660
|
+
case 'sqlite':
|
|
661
|
+
// SQLite 不支持直接修改列,需要重建表
|
|
662
|
+
sqlStatements.push(`-- SQLite 不支持直接修改列,需要重建表`);
|
|
663
|
+
break;
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
// 添加注释语句
|
|
667
|
+
if (commentStatement) {
|
|
668
|
+
sqlStatements.push(commentStatement);
|
|
669
|
+
}
|
|
670
|
+
});
|
|
671
|
+
|
|
672
|
+
// 处理主键
|
|
673
|
+
const primaryKeys = formData.value.columns
|
|
674
|
+
.filter(col => col.isPrimary)
|
|
675
|
+
.map(col => quoteIdentifier(col.name));
|
|
676
|
+
|
|
677
|
+
if (primaryKeys.length > 0) {
|
|
678
|
+
// 先删除旧主键(如果存在)
|
|
679
|
+
sqlStatements.push(`ALTER TABLE ${quoteIdentifier(tableName)} DROP PRIMARY KEY`);
|
|
680
|
+
// 添加新主键
|
|
681
|
+
sqlStatements.push(`ALTER TABLE ${quoteIdentifier(tableName)} ADD PRIMARY KEY (${primaryKeys.join(', ')})`);
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
return sqlStatements.join(';\n') + ';';
|
|
495
685
|
}
|
|
496
686
|
}
|
|
497
687
|
|
|
@@ -501,15 +691,23 @@ function formatDefaultValue(value: any, type: string): string {
|
|
|
501
691
|
return 'NULL';
|
|
502
692
|
}
|
|
503
693
|
|
|
694
|
+
const lowerValue = String(value).toLowerCase();
|
|
695
|
+
|
|
696
|
+
// 处理特殊关键字(不加引号)
|
|
697
|
+
const specialKeywords = ['current_timestamp', 'now()', 'current_date', 'current_time', 'localtimestamp', 'localtime'];
|
|
698
|
+
if (specialKeywords.includes(lowerValue)) {
|
|
699
|
+
return value;
|
|
700
|
+
}
|
|
701
|
+
|
|
504
702
|
const lowerType = type.toLowerCase();
|
|
505
703
|
|
|
506
704
|
// 数值类型不加引号
|
|
507
|
-
if (
|
|
705
|
+
if (isNumericType(lowerType) && !isNaN(value)) {
|
|
508
706
|
return String(value);
|
|
509
707
|
}
|
|
510
708
|
|
|
511
709
|
// 布尔类型
|
|
512
|
-
if (
|
|
710
|
+
if (isBooleanType(lowerType)) {
|
|
513
711
|
return value ? 'TRUE' : 'FALSE';
|
|
514
712
|
}
|
|
515
713
|
|
|
@@ -530,18 +728,41 @@ async function submit() {
|
|
|
530
728
|
return;
|
|
531
729
|
}
|
|
532
730
|
|
|
533
|
-
const sql = generateSQL();
|
|
534
|
-
|
|
535
731
|
if (!props.connection?.id) {
|
|
536
732
|
await modal.warning('请先选择数据库连接');
|
|
537
733
|
return;
|
|
538
734
|
}
|
|
735
|
+
|
|
736
|
+
let result;
|
|
539
737
|
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
sql
|
|
543
|
-
|
|
544
|
-
|
|
738
|
+
if (props.mode === 'create') {
|
|
739
|
+
// 创建表:使用 SQL 语句
|
|
740
|
+
const sql = generateSQL();
|
|
741
|
+
result = await databaseService.executeQuery(
|
|
742
|
+
props.connection.id,
|
|
743
|
+
sql,
|
|
744
|
+
props.database
|
|
745
|
+
);
|
|
746
|
+
} else {
|
|
747
|
+
// 修改表:使用差异化对比
|
|
748
|
+
const tableDiff = calculateTableDiff();
|
|
749
|
+
|
|
750
|
+
// 检查是否有实际修改
|
|
751
|
+
if (tableDiff.addedColumns.length === 0 &&
|
|
752
|
+
tableDiff.modifiedColumns.length === 0 &&
|
|
753
|
+
tableDiff.deletedColumns.length === 0 &&
|
|
754
|
+
!tableDiff.tableCommentChanged) {
|
|
755
|
+
await modal.info('没有检测到任何修改');
|
|
756
|
+
return;
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
// 调用修改表接口(需要后端实现)
|
|
760
|
+
result = await databaseService.alterTable(
|
|
761
|
+
props.connection.id,
|
|
762
|
+
props.database,
|
|
763
|
+
tableDiff
|
|
764
|
+
);
|
|
765
|
+
}
|
|
545
766
|
|
|
546
767
|
emit('submit', {
|
|
547
768
|
success: result.ret === 0,
|
|
@@ -592,7 +813,13 @@ function getCategoryLabel(category: string): string {
|
|
|
592
813
|
|
|
593
814
|
// 获取选中的类型信息
|
|
594
815
|
function getSelectedType(column: any) {
|
|
595
|
-
|
|
816
|
+
if (!column.type) return null;
|
|
817
|
+
|
|
818
|
+
// 提取类型名称(去掉括号和长度信息)
|
|
819
|
+
const typeName = column.type.match(/^[a-zA-Z]+/)?.[0] || column.type;
|
|
820
|
+
|
|
821
|
+
// 大小写不敏感匹配
|
|
822
|
+
return columnTypes.value.find(t => t.name.toLowerCase() === typeName.toLowerCase());
|
|
596
823
|
}
|
|
597
824
|
|
|
598
825
|
// 检查类型是否需要长度参数
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VSCode WebView 桥接层
|
|
3
|
+
* 提供 Vue 应用与 VSCode 扩展之间的通信
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* VSCode API 接口
|
|
8
|
+
*/
|
|
9
|
+
interface VSCodeAPI {
|
|
10
|
+
postMessage(message: any): void;
|
|
11
|
+
getState(): any;
|
|
12
|
+
setState(state: any): void;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
declare const acquireVsCodeApi: () => VSCodeAPI;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* VSCode 桥接类
|
|
19
|
+
*/
|
|
20
|
+
export class VSCodeBridge {
|
|
21
|
+
private vscode: VSCodeAPI | null = null;
|
|
22
|
+
|
|
23
|
+
constructor() {
|
|
24
|
+
if (typeof window !== 'undefined' && typeof acquireVsCodeApi === 'function') {
|
|
25
|
+
this.vscode = acquireVsCodeApi();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* 判断是否在 VSCode 环境中
|
|
31
|
+
*/
|
|
32
|
+
isVSCodeEnvironment(): boolean {
|
|
33
|
+
return this.vscode !== null;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* 发送消息到 VSCode 扩展
|
|
38
|
+
*/
|
|
39
|
+
postMessage(message: any): void {
|
|
40
|
+
if (!this.vscode) {
|
|
41
|
+
console.warn('Not in VSCode environment');
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
this.vscode.postMessage(message);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* 监听来自 VSCode 扩展的消息
|
|
49
|
+
*/
|
|
50
|
+
onMessage(callback: (message: any) => void): void {
|
|
51
|
+
window.addEventListener('message', event => {
|
|
52
|
+
// 安全检查:确保消息来自扩展
|
|
53
|
+
if (event.origin) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
callback(event.data);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* 获取状态
|
|
62
|
+
*/
|
|
63
|
+
getState(): any {
|
|
64
|
+
if (!this.vscode) {
|
|
65
|
+
return {};
|
|
66
|
+
}
|
|
67
|
+
return this.vscode.getState();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* 保存状态
|
|
72
|
+
*/
|
|
73
|
+
setState(state: any): void {
|
|
74
|
+
if (!this.vscode) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
this.vscode.setState(state);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* 初始化桥接
|
|
82
|
+
*/
|
|
83
|
+
init(messageHandler?: (message: any) => void): void {
|
|
84
|
+
if (this.isVSCodeEnvironment()) {
|
|
85
|
+
if (messageHandler) {
|
|
86
|
+
this.onMessage(messageHandler);
|
|
87
|
+
}
|
|
88
|
+
// 恢复之前保存的状态
|
|
89
|
+
const savedState = this.getState();
|
|
90
|
+
if (savedState) {
|
|
91
|
+
this.postMessage({
|
|
92
|
+
command: 'restoreState',
|
|
93
|
+
data: savedState
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// 创建全局实例
|
|
101
|
+
let bridgeInstance: VSCodeBridge | null = null;
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* 获取 VSCode 桥接实例
|
|
105
|
+
*/
|
|
106
|
+
export function getVSCodeBridge(): VSCodeBridge {
|
|
107
|
+
if (!bridgeInstance) {
|
|
108
|
+
bridgeInstance = new VSCodeBridge();
|
|
109
|
+
}
|
|
110
|
+
return bridgeInstance;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* 判断是否在 VSCode 环境中
|
|
115
|
+
*/
|
|
116
|
+
export function isVSCodeEnvironment(): boolean {
|
|
117
|
+
if (!bridgeInstance) {
|
|
118
|
+
bridgeInstance = new VSCodeBridge();
|
|
119
|
+
}
|
|
120
|
+
return bridgeInstance.isVSCodeEnvironment();
|
|
121
|
+
}
|