fdb2 1.0.5 → 1.0.7
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/bin/fdb2.js +3 -3
- 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 +518 -275
- 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 +2 -1
- package/dist/server/service/connection.service.js.map +1 -1
- package/dist/server/service/connection.service.ts +2 -1
- 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/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/scripts/preinstall.js +90 -16
- 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/server.js +1 -1
- 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 +1 -0
- 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
|
@@ -738,4 +738,135 @@ export class PostgreSQLService extends BaseDatabaseService {
|
|
|
738
738
|
throw new Error(`导出表数据到Excel失败: ${error.message}`);
|
|
739
739
|
}
|
|
740
740
|
}
|
|
741
|
+
|
|
742
|
+
/**
|
|
743
|
+
* 修改表结构
|
|
744
|
+
*/
|
|
745
|
+
async alterTable(dataSource: DataSource, databaseName: string, tableDiff: any): Promise<any> {
|
|
746
|
+
try {
|
|
747
|
+
const tableName = tableDiff.tableName;
|
|
748
|
+
const sqlStatements: string[] = [];
|
|
749
|
+
|
|
750
|
+
// 修改表注释
|
|
751
|
+
if (tableDiff.tableCommentChanged) {
|
|
752
|
+
sqlStatements.push(`COMMENT ON TABLE "${tableName}" IS '${tableDiff.tableComment}';`);
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
// 添加新列
|
|
756
|
+
tableDiff.addedColumns.forEach((column: any) => {
|
|
757
|
+
// 检查type是否已经包含长度信息(括号)
|
|
758
|
+
const typeHasLength = /\(\d+\)/.test(column.type);
|
|
759
|
+
|
|
760
|
+
let columnSQL = `ALTER TABLE "${tableName}" ADD COLUMN "${column.name}" ${column.type}`;
|
|
761
|
+
|
|
762
|
+
// 处理长度和精度(仅当type中没有指定长度时才添加)
|
|
763
|
+
if (!typeHasLength) {
|
|
764
|
+
if (column.length) {
|
|
765
|
+
columnSQL += `(${column.length})`;
|
|
766
|
+
} else if (column.precision) {
|
|
767
|
+
if (column.scale) {
|
|
768
|
+
columnSQL += `(${column.precision},${column.scale})`;
|
|
769
|
+
} else {
|
|
770
|
+
columnSQL += `(${column.precision})`;
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
// 处理NULL约束
|
|
776
|
+
if (!column.nullable) {
|
|
777
|
+
columnSQL += ' NOT NULL';
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
// 处理默认值
|
|
781
|
+
if (column.defaultValue) {
|
|
782
|
+
const upperDefault = column.defaultValue.toString().toUpperCase();
|
|
783
|
+
if (['CURRENT_TIMESTAMP', 'NOW()', 'CURRENT_DATE', 'CURRENT_TIME'].includes(upperDefault)) {
|
|
784
|
+
columnSQL += ` DEFAULT ${upperDefault}`;
|
|
785
|
+
} else {
|
|
786
|
+
columnSQL += ` DEFAULT '${column.defaultValue}'`;
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
// 处理自增(PostgreSQL使用SERIAL或GENERATED AS IDENTITY)
|
|
791
|
+
if (column.isAutoIncrement) {
|
|
792
|
+
if (column.type.toLowerCase().includes('serial') || column.type.toLowerCase().includes('bigserial')) {
|
|
793
|
+
// 类型已经包含自增
|
|
794
|
+
} else {
|
|
795
|
+
columnSQL += ' GENERATED ALWAYS AS IDENTITY';
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
sqlStatements.push(columnSQL + ';');
|
|
800
|
+
|
|
801
|
+
// 添加列注释
|
|
802
|
+
if (column.comment) {
|
|
803
|
+
sqlStatements.push(`COMMENT ON COLUMN "${tableName}"."${column.name}" IS '${column.comment}';`);
|
|
804
|
+
}
|
|
805
|
+
});
|
|
806
|
+
|
|
807
|
+
// 修改列
|
|
808
|
+
tableDiff.modifiedColumns.forEach((modification: any) => {
|
|
809
|
+
const { oldColumn, newColumn } = modification;
|
|
810
|
+
|
|
811
|
+
// 检查type是否已经包含长度信息(括号)
|
|
812
|
+
const typeHasLength = /\(\d+\)/.test(newColumn.type);
|
|
813
|
+
|
|
814
|
+
let columnSQL = `ALTER TABLE "${tableName}" ALTER COLUMN "${newColumn.name}" SET DATA TYPE ${newColumn.type}`;
|
|
815
|
+
|
|
816
|
+
// 处理长度和精度(仅当type中没有指定长度时才添加)
|
|
817
|
+
if (!typeHasLength) {
|
|
818
|
+
if (newColumn.length) {
|
|
819
|
+
columnSQL += `(${newColumn.length})`;
|
|
820
|
+
} else if (newColumn.precision) {
|
|
821
|
+
if (newColumn.scale) {
|
|
822
|
+
columnSQL += `(${newColumn.precision},${newColumn.scale})`;
|
|
823
|
+
} else {
|
|
824
|
+
columnSQL += `(${newColumn.precision})`;
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
sqlStatements.push(columnSQL + ';');
|
|
830
|
+
|
|
831
|
+
// 修改NULL约束
|
|
832
|
+
if (!newColumn.nullable) {
|
|
833
|
+
sqlStatements.push(`ALTER TABLE "${tableName}" ALTER COLUMN "${newColumn.name}" SET NOT NULL;`);
|
|
834
|
+
} else {
|
|
835
|
+
sqlStatements.push(`ALTER TABLE "${tableName}" ALTER COLUMN "${newColumn.name}" DROP NOT NULL;`);
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
// 修改默认值
|
|
839
|
+
if (newColumn.defaultValue) {
|
|
840
|
+
const upperDefault = newColumn.defaultValue.toString().toUpperCase();
|
|
841
|
+
if (['CURRENT_TIMESTAMP', 'NOW()', 'CURRENT_DATE', 'CURRENT_TIME'].includes(upperDefault)) {
|
|
842
|
+
sqlStatements.push(`ALTER TABLE "${tableName}" ALTER COLUMN "${newColumn.name}" SET DEFAULT ${upperDefault};`);
|
|
843
|
+
} else {
|
|
844
|
+
sqlStatements.push(`ALTER TABLE "${tableName}" ALTER COLUMN "${newColumn.name}" SET DEFAULT '${newColumn.defaultValue}';`);
|
|
845
|
+
}
|
|
846
|
+
} else {
|
|
847
|
+
sqlStatements.push(`ALTER TABLE "${tableName}" ALTER COLUMN "${newColumn.name}" DROP DEFAULT;`);
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
// 修改列注释
|
|
851
|
+
if (newColumn.comment) {
|
|
852
|
+
sqlStatements.push(`COMMENT ON COLUMN "${tableName}"."${newColumn.name}" IS '${newColumn.comment}';`);
|
|
853
|
+
}
|
|
854
|
+
});
|
|
855
|
+
|
|
856
|
+
// 删除列
|
|
857
|
+
tableDiff.deletedColumns.forEach((column: any) => {
|
|
858
|
+
sqlStatements.push(`ALTER TABLE "${tableName}" DROP COLUMN "${column.name}";`);
|
|
859
|
+
});
|
|
860
|
+
|
|
861
|
+
// 执行SQL语句
|
|
862
|
+
if (sqlStatements.length > 0) {
|
|
863
|
+
await this.executeBatchQuery(dataSource, sqlStatements, { useTransaction: true });
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
return { ret: 0, message: '表结构修改成功' };
|
|
867
|
+
} catch (error) {
|
|
868
|
+
console.error('PostgreSQL修改表结构失败:', error);
|
|
869
|
+
return { ret: 1, message: `修改表结构失败: ${error instanceof Error ? error.message : String(error)}` };
|
|
870
|
+
}
|
|
871
|
+
}
|
|
741
872
|
}
|
|
@@ -710,4 +710,124 @@ export class SAPHANADatabaseService extends BaseDatabaseService {
|
|
|
710
710
|
public quoteIdentifier(identifier: string): string {
|
|
711
711
|
return `"${identifier}"`;
|
|
712
712
|
}
|
|
713
|
+
|
|
714
|
+
/**
|
|
715
|
+
* 修改表结构
|
|
716
|
+
*/
|
|
717
|
+
async alterTable(dataSource: DataSource, databaseName: string, tableDiff: any): Promise<any> {
|
|
718
|
+
try {
|
|
719
|
+
const tableName = tableDiff.tableName;
|
|
720
|
+
const sqlStatements: string[] = [];
|
|
721
|
+
|
|
722
|
+
// 修改表注释
|
|
723
|
+
if (tableDiff.tableCommentChanged) {
|
|
724
|
+
sqlStatements.push(`ALTER TABLE "${tableName}" COMMENT '${tableDiff.tableComment}'`);
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
// 添加新列
|
|
728
|
+
tableDiff.addedColumns.forEach((column: any) => {
|
|
729
|
+
// 检查type是否已经包含长度信息(括号)
|
|
730
|
+
const typeHasLength = /\(\d+\)/.test(column.type);
|
|
731
|
+
|
|
732
|
+
let columnSQL = `ALTER TABLE "${tableName}" ADD ("${column.name}" ${column.type}`;
|
|
733
|
+
|
|
734
|
+
// 处理长度和精度(仅当type中没有指定长度时才添加)
|
|
735
|
+
if (!typeHasLength) {
|
|
736
|
+
if (column.length) {
|
|
737
|
+
columnSQL += `(${column.length})`;
|
|
738
|
+
} else if (column.precision) {
|
|
739
|
+
if (column.scale) {
|
|
740
|
+
columnSQL += `(${column.precision},${column.scale})`;
|
|
741
|
+
} else {
|
|
742
|
+
columnSQL += `(${column.precision})`;
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
// 处理NULL约束
|
|
748
|
+
if (!column.nullable) {
|
|
749
|
+
columnSQL += ' NOT NULL';
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
// 处理默认值
|
|
753
|
+
if (column.defaultValue) {
|
|
754
|
+
const upperDefault = column.defaultValue.toString().toUpperCase();
|
|
755
|
+
if (['CURRENT_TIMESTAMP', 'CURRENT_DATE', 'CURRENT_TIME'].includes(upperDefault)) {
|
|
756
|
+
columnSQL += ` DEFAULT ${upperDefault}`;
|
|
757
|
+
} else {
|
|
758
|
+
columnSQL += ` DEFAULT '${column.defaultValue}'`;
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
columnSQL += ')';
|
|
763
|
+
sqlStatements.push(columnSQL + ';');
|
|
764
|
+
|
|
765
|
+
// 添加列注释
|
|
766
|
+
if (column.comment) {
|
|
767
|
+
sqlStatements.push(`ALTER TABLE "${tableName}" ("${column.name}" COMMENT '${column.comment}')`);
|
|
768
|
+
}
|
|
769
|
+
});
|
|
770
|
+
|
|
771
|
+
// 修改列
|
|
772
|
+
tableDiff.modifiedColumns.forEach((modification: any) => {
|
|
773
|
+
const { oldColumn, newColumn } = modification;
|
|
774
|
+
|
|
775
|
+
// 检查type是否已经包含长度信息(括号)
|
|
776
|
+
const typeHasLength = /\(\d+\)/.test(newColumn.type);
|
|
777
|
+
|
|
778
|
+
let columnSQL = `ALTER TABLE "${tableName}" ("${newColumn.name}" ${newColumn.type}`;
|
|
779
|
+
|
|
780
|
+
// 处理长度和精度(仅当type中没有指定长度时才添加)
|
|
781
|
+
if (!typeHasLength) {
|
|
782
|
+
if (newColumn.length) {
|
|
783
|
+
columnSQL += `(${newColumn.length})`;
|
|
784
|
+
} else if (newColumn.precision) {
|
|
785
|
+
if (newColumn.scale) {
|
|
786
|
+
columnSQL += `(${newColumn.precision},${newColumn.scale})`;
|
|
787
|
+
} else {
|
|
788
|
+
columnSQL += `(${newColumn.precision})`;
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
// 处理NULL约束
|
|
794
|
+
if (!newColumn.nullable) {
|
|
795
|
+
columnSQL += ' NOT NULL';
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
// 处理默认值
|
|
799
|
+
if (newColumn.defaultValue) {
|
|
800
|
+
const upperDefault = newColumn.defaultValue.toString().toUpperCase();
|
|
801
|
+
if (['CURRENT_TIMESTAMP', 'CURRENT_DATE', 'CURRENT_TIME'].includes(upperDefault)) {
|
|
802
|
+
columnSQL += ` DEFAULT ${upperDefault}`;
|
|
803
|
+
} else {
|
|
804
|
+
columnSQL += ` DEFAULT '${newColumn.defaultValue}'`;
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
columnSQL += ')';
|
|
809
|
+
sqlStatements.push(columnSQL + ';');
|
|
810
|
+
|
|
811
|
+
// 修改列注释
|
|
812
|
+
if (newColumn.comment) {
|
|
813
|
+
sqlStatements.push(`ALTER TABLE "${tableName}" ("${newColumn.name}" COMMENT '${newColumn.comment}')`);
|
|
814
|
+
}
|
|
815
|
+
});
|
|
816
|
+
|
|
817
|
+
// 删除列
|
|
818
|
+
tableDiff.deletedColumns.forEach((column: any) => {
|
|
819
|
+
sqlStatements.push(`ALTER TABLE "${tableName}" DROP ("${column.name}")`);
|
|
820
|
+
});
|
|
821
|
+
|
|
822
|
+
// 执行SQL语句
|
|
823
|
+
if (sqlStatements.length > 0) {
|
|
824
|
+
await this.executeBatchQuery(dataSource, sqlStatements, { useTransaction: true });
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
return { ret: 0, message: '表结构修改成功' };
|
|
828
|
+
} catch (error) {
|
|
829
|
+
console.error('SAP HANA修改表结构失败:', error);
|
|
830
|
+
return { ret: 1, message: `修改表结构失败: ${error instanceof Error ? error.message : String(error)}` };
|
|
831
|
+
}
|
|
832
|
+
}
|
|
713
833
|
}
|
|
@@ -556,4 +556,154 @@ export class SQLiteService extends BaseDatabaseService {
|
|
|
556
556
|
throw new Error(`导出表数据到Excel失败: ${error.message}`);
|
|
557
557
|
}
|
|
558
558
|
}
|
|
559
|
+
|
|
560
|
+
/**
|
|
561
|
+
* 修改表结构
|
|
562
|
+
* SQLite的ALTER TABLE操作非常有限,需要通过重建表来实现复杂的表结构修改
|
|
563
|
+
*/
|
|
564
|
+
async alterTable(dataSource: DataSource, databaseName: string, tableDiff: any): Promise<any> {
|
|
565
|
+
try {
|
|
566
|
+
const tableName = tableDiff.tableName;
|
|
567
|
+
const sqlStatements: string[] = [];
|
|
568
|
+
|
|
569
|
+
// SQLite不支持直接修改表注释,只能忽略
|
|
570
|
+
|
|
571
|
+
// 如果有修改或删除列,需要重建表
|
|
572
|
+
if (tableDiff.modifiedColumns.length > 0 || tableDiff.deletedColumns.length > 0) {
|
|
573
|
+
const tempTableName = `_temp_${tableName}_${Date.now()}`;
|
|
574
|
+
|
|
575
|
+
// 获取所有列(包括新增的和未修改的)
|
|
576
|
+
const allColumns = [...tableDiff.addedColumns];
|
|
577
|
+
const existingColumns = await this.getColumns(dataSource, databaseName, tableName);
|
|
578
|
+
|
|
579
|
+
// 添加未修改的现有列
|
|
580
|
+
existingColumns.forEach(col => {
|
|
581
|
+
const isDeleted = tableDiff.deletedColumns.some((dc: any) => dc.name === col.name);
|
|
582
|
+
const isModified = tableDiff.modifiedColumns.some((mc: any) => mc.oldColumn.name === col.name);
|
|
583
|
+
if (!isDeleted && !isModified) {
|
|
584
|
+
allColumns.push(col);
|
|
585
|
+
}
|
|
586
|
+
});
|
|
587
|
+
|
|
588
|
+
// 添加修改后的列
|
|
589
|
+
tableDiff.modifiedColumns.forEach((modification: any) => {
|
|
590
|
+
allColumns.push(modification.newColumn);
|
|
591
|
+
});
|
|
592
|
+
|
|
593
|
+
// 创建临时表
|
|
594
|
+
let createTableSQL = `CREATE TABLE "${tempTableName}" (`;
|
|
595
|
+
const columnDefinitions: string[] = [];
|
|
596
|
+
|
|
597
|
+
allColumns.forEach(column => {
|
|
598
|
+
// 检查type是否已经包含长度信息(括号)
|
|
599
|
+
const typeHasLength = /\(\d+\)/.test(column.type);
|
|
600
|
+
|
|
601
|
+
let definition = `"${column.name}" ${column.type}`;
|
|
602
|
+
|
|
603
|
+
// 处理长度和精度(仅当type中没有指定长度时才添加)
|
|
604
|
+
if (!typeHasLength) {
|
|
605
|
+
if (column.length) {
|
|
606
|
+
definition += `(${column.length})`;
|
|
607
|
+
} else if (column.precision) {
|
|
608
|
+
if (column.scale) {
|
|
609
|
+
definition += `(${column.precision},${column.scale})`;
|
|
610
|
+
} else {
|
|
611
|
+
definition += `(${column.precision})`;
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
// 处理NULL约束
|
|
617
|
+
if (!column.nullable) {
|
|
618
|
+
definition += ' NOT NULL';
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
// 处理默认值
|
|
622
|
+
if (column.defaultValue) {
|
|
623
|
+
const upperDefault = column.defaultValue.toString().toUpperCase();
|
|
624
|
+
if (['CURRENT_TIMESTAMP', 'NOW()', 'CURRENT_DATE', 'CURRENT_TIME'].includes(upperDefault)) {
|
|
625
|
+
definition += ` DEFAULT ${upperDefault}`;
|
|
626
|
+
} else {
|
|
627
|
+
definition += ` DEFAULT '${column.defaultValue}'`;
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
// 处理主键和自增
|
|
632
|
+
if (column.isPrimary) {
|
|
633
|
+
if (column.isAutoIncrement) {
|
|
634
|
+
definition += ' PRIMARY KEY AUTOINCREMENT';
|
|
635
|
+
} else {
|
|
636
|
+
definition += ' PRIMARY KEY';
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
columnDefinitions.push(definition);
|
|
641
|
+
});
|
|
642
|
+
|
|
643
|
+
createTableSQL += columnDefinitions.join(',\n');
|
|
644
|
+
createTableSQL += ')';
|
|
645
|
+
sqlStatements.push(createTableSQL + ';');
|
|
646
|
+
|
|
647
|
+
// 复制数据到临时表
|
|
648
|
+
const existingColumnNames = existingColumns.map(col => `"${col.name}"`).join(', ');
|
|
649
|
+
const newColumnNames = allColumns.map(col => `"${col.name}"`).join(', ');
|
|
650
|
+
sqlStatements.push(`INSERT INTO "${tempTableName}" (${newColumnNames}) SELECT ${existingColumnNames} FROM "${tableName}";`);
|
|
651
|
+
|
|
652
|
+
// 删除旧表
|
|
653
|
+
sqlStatements.push(`DROP TABLE "${tableName}";`);
|
|
654
|
+
|
|
655
|
+
// 重命名临时表
|
|
656
|
+
sqlStatements.push(`ALTER TABLE "${tempTableName}" RENAME TO "${tableName}";`);
|
|
657
|
+
|
|
658
|
+
} else if (tableDiff.addedColumns.length > 0) {
|
|
659
|
+
// 只有添加列,可以直接使用ALTER TABLE ADD COLUMN
|
|
660
|
+
tableDiff.addedColumns.forEach((column: any) => {
|
|
661
|
+
// 检查type是否已经包含长度信息(括号)
|
|
662
|
+
const typeHasLength = /\(\d+\)/.test(column.type);
|
|
663
|
+
|
|
664
|
+
let columnSQL = `ALTER TABLE "${tableName}" ADD COLUMN "${column.name}" ${column.type}`;
|
|
665
|
+
|
|
666
|
+
// 处理长度和精度(仅当type中没有指定长度时才添加)
|
|
667
|
+
if (!typeHasLength) {
|
|
668
|
+
if (column.length) {
|
|
669
|
+
columnSQL += `(${column.length})`;
|
|
670
|
+
} else if (column.precision) {
|
|
671
|
+
if (column.scale) {
|
|
672
|
+
columnSQL += `(${column.precision},${column.scale})`;
|
|
673
|
+
} else {
|
|
674
|
+
columnSQL += `(${column.precision})`;
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
// 处理NULL约束
|
|
680
|
+
if (!column.nullable) {
|
|
681
|
+
columnSQL += ' NOT NULL';
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
// 处理默认值
|
|
685
|
+
if (column.defaultValue) {
|
|
686
|
+
const upperDefault = column.defaultValue.toString().toUpperCase();
|
|
687
|
+
if (['CURRENT_TIMESTAMP', 'NOW()', 'CURRENT_DATE', 'CURRENT_TIME'].includes(upperDefault)) {
|
|
688
|
+
columnSQL += ` DEFAULT ${upperDefault}`;
|
|
689
|
+
} else {
|
|
690
|
+
columnSQL += ` DEFAULT '${column.defaultValue}'`;
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
sqlStatements.push(columnSQL + ';');
|
|
695
|
+
});
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
// 执行SQL语句
|
|
699
|
+
if (sqlStatements.length > 0) {
|
|
700
|
+
await this.executeBatchQuery(dataSource, sqlStatements, { useTransaction: true });
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
return { ret: 0, message: '表结构修改成功' };
|
|
704
|
+
} catch (error) {
|
|
705
|
+
console.error('SQLite修改表结构失败:', error);
|
|
706
|
+
return { ret: 1, message: `修改表结构失败: ${error instanceof Error ? error.message : String(error)}` };
|
|
707
|
+
}
|
|
708
|
+
}
|
|
559
709
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2020",
|
|
4
|
+
"module": "CommonJS",
|
|
5
|
+
"moduleResolution": "Node",
|
|
6
|
+
"outDir": "./dist/server",
|
|
7
|
+
"rootDir": "./",
|
|
8
|
+
"strict": false,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"skipLibCheck": true,
|
|
11
|
+
"forceConsistentCasingInFileNames": true,
|
|
12
|
+
"declaration": true,
|
|
13
|
+
"declarationMap": true,
|
|
14
|
+
"sourceMap": true,
|
|
15
|
+
"noEmit": false,
|
|
16
|
+
"resolveJsonModule": true
|
|
17
|
+
},
|
|
18
|
+
"include": ["**/*"],
|
|
19
|
+
"exclude": ["**/__tests__/*", "**/*.spec.ts", "node_modules", "dist"]
|
|
20
|
+
}
|
package/server.js
CHANGED
|
@@ -122,7 +122,7 @@ const PORT = portFromArgs || process.env.PORT || 9800;
|
|
|
122
122
|
app.listen(PORT, () => {
|
|
123
123
|
|
|
124
124
|
// 将 PID 写入 PID 文件
|
|
125
|
-
const pidFilePath = path.join(__dirname, 'server.pid');
|
|
125
|
+
const pidFilePath = path.join(__dirname, 'fdb2.server.pid');
|
|
126
126
|
fs.writeFileSync(pidFilePath, process.pid.toString());
|
|
127
127
|
console.log(`PID ${process.pid} written to ${pidFilePath}`);
|
|
128
128
|
|
|
@@ -317,7 +317,6 @@ function showEditModal(connection: ConnectionEntity) {
|
|
|
317
317
|
// 保存连接配置(不测试连接)
|
|
318
318
|
async function saveConnection(closeModal = true) {
|
|
319
319
|
try {
|
|
320
|
-
debugger
|
|
321
320
|
// 先进行前端验证
|
|
322
321
|
const validation = validateConnection(connectionForm.value);
|
|
323
322
|
if (!validation.isValid) {
|