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.
Files changed (195) hide show
  1. package/.vscodeignore +45 -0
  2. package/README.md +24 -85
  3. package/bin/fdb2.js +3 -3
  4. package/dist/package.json +115 -0
  5. package/dist/pnpm-lock.yaml +7447 -0
  6. package/dist/public/explorer.css +244 -111
  7. package/dist/public/explorer.js +518 -275
  8. package/dist/scripts/preinstall.js +112 -0
  9. package/dist/server/index.d.ts.map +1 -1
  10. package/dist/server/index.js +4 -9
  11. package/dist/server/index.js.map +1 -1
  12. package/dist/server/index.ts +5 -10
  13. package/dist/server/service/connection.service.d.ts.map +1 -1
  14. package/dist/server/service/connection.service.js +2 -1
  15. package/dist/server/service/connection.service.js.map +1 -1
  16. package/dist/server/service/connection.service.ts +2 -1
  17. package/dist/server/service/database/base.service.d.ts +4 -0
  18. package/dist/server/service/database/base.service.d.ts.map +1 -1
  19. package/dist/server/service/database/base.service.js +3 -3
  20. package/dist/server/service/database/base.service.js.map +1 -1
  21. package/dist/server/service/database/base.service.ts +8 -3
  22. package/dist/server/service/database/cockroachdb.service.d.ts +5 -0
  23. package/dist/server/service/database/cockroachdb.service.d.ts.map +1 -1
  24. package/dist/server/service/database/cockroachdb.service.js +112 -0
  25. package/dist/server/service/database/cockroachdb.service.js.map +1 -1
  26. package/dist/server/service/database/cockroachdb.service.ts +123 -0
  27. package/dist/server/service/database/database.service.d.ts +4 -0
  28. package/dist/server/service/database/database.service.d.ts.map +1 -1
  29. package/dist/server/service/database/database.service.js +8 -0
  30. package/dist/server/service/database/database.service.js.map +1 -1
  31. package/dist/server/service/database/database.service.ts +9 -0
  32. package/dist/server/service/database/mongodb.service.d.ts +6 -0
  33. package/dist/server/service/database/mongodb.service.d.ts.map +1 -1
  34. package/dist/server/service/database/mongodb.service.js +8 -0
  35. package/dist/server/service/database/mongodb.service.js.map +1 -1
  36. package/dist/server/service/database/mongodb.service.ts +9 -0
  37. package/dist/server/service/database/mssql.service.d.ts +4 -0
  38. package/dist/server/service/database/mssql.service.d.ts.map +1 -1
  39. package/dist/server/service/database/mssql.service.js +105 -0
  40. package/dist/server/service/database/mssql.service.js.map +1 -1
  41. package/dist/server/service/database/mssql.service.ts +118 -0
  42. package/dist/server/service/database/mysql.service.d.ts +4 -0
  43. package/dist/server/service/database/mysql.service.d.ts.map +1 -1
  44. package/dist/server/service/database/mysql.service.js +116 -0
  45. package/dist/server/service/database/mysql.service.js.map +1 -1
  46. package/dist/server/service/database/mysql.service.ts +130 -0
  47. package/dist/server/service/database/oracle.service.d.ts +4 -0
  48. package/dist/server/service/database/oracle.service.d.ts.map +1 -1
  49. package/dist/server/service/database/oracle.service.js +114 -0
  50. package/dist/server/service/database/oracle.service.js.map +1 -1
  51. package/dist/server/service/database/oracle.service.ts +128 -0
  52. package/dist/server/service/database/postgres.service.d.ts +4 -0
  53. package/dist/server/service/database/postgres.service.d.ts.map +1 -1
  54. package/dist/server/service/database/postgres.service.js +120 -0
  55. package/dist/server/service/database/postgres.service.js.map +1 -1
  56. package/dist/server/service/database/postgres.service.ts +131 -0
  57. package/dist/server/service/database/sap.service.d.ts +4 -0
  58. package/dist/server/service/database/sap.service.d.ts.map +1 -1
  59. package/dist/server/service/database/sap.service.js +107 -0
  60. package/dist/server/service/database/sap.service.js.map +1 -1
  61. package/dist/server/service/database/sap.service.ts +120 -0
  62. package/dist/server/service/database/sqlite.service.d.ts +5 -0
  63. package/dist/server/service/database/sqlite.service.d.ts.map +1 -1
  64. package/dist/server/service/database/sqlite.service.js +133 -0
  65. package/dist/server/service/database/sqlite.service.js.map +1 -1
  66. package/dist/server/service/database/sqlite.service.ts +150 -0
  67. package/package.json +18 -9
  68. package/packages/vscode/.vscodeignore +44 -0
  69. package/packages/vscode/README.md +62 -0
  70. package/packages/vscode/out/database-services/base.service.js +236 -0
  71. package/packages/vscode/out/database-services/base.service.js.map +1 -0
  72. package/packages/vscode/out/database-services/cockroachdb.service.js +634 -0
  73. package/packages/vscode/out/database-services/cockroachdb.service.js.map +1 -0
  74. package/packages/vscode/out/database-services/connection.service.js +346 -0
  75. package/packages/vscode/out/database-services/connection.service.js.map +1 -0
  76. package/packages/vscode/out/database-services/database.service.js +571 -0
  77. package/packages/vscode/out/database-services/database.service.js.map +1 -0
  78. package/packages/vscode/out/database-services/index.js +18 -0
  79. package/packages/vscode/out/database-services/index.js.map +1 -0
  80. package/packages/vscode/out/database-services/model/connection.entity.js +11 -0
  81. package/packages/vscode/out/database-services/model/connection.entity.js.map +1 -0
  82. package/packages/vscode/out/database-services/model/database.entity.js +35 -0
  83. package/packages/vscode/out/database-services/model/database.entity.js.map +1 -0
  84. package/packages/vscode/out/database-services/mongodb.service.js +458 -0
  85. package/packages/vscode/out/database-services/mongodb.service.js.map +1 -0
  86. package/packages/vscode/out/database-services/mssql.service.js +694 -0
  87. package/packages/vscode/out/database-services/mssql.service.js.map +1 -0
  88. package/packages/vscode/out/database-services/mysql.service.js +735 -0
  89. package/packages/vscode/out/database-services/mysql.service.js.map +1 -0
  90. package/packages/vscode/out/database-services/oracle.service.js +787 -0
  91. package/packages/vscode/out/database-services/oracle.service.js.map +1 -0
  92. package/packages/vscode/out/database-services/postgres.service.js +696 -0
  93. package/packages/vscode/out/database-services/postgres.service.js.map +1 -0
  94. package/packages/vscode/out/database-services/sap.service.js +695 -0
  95. package/packages/vscode/out/database-services/sap.service.js.map +1 -0
  96. package/packages/vscode/out/database-services/sqlite.service.js +532 -0
  97. package/packages/vscode/out/database-services/sqlite.service.js.map +1 -0
  98. package/packages/vscode/out/extension.js +93 -0
  99. package/packages/vscode/out/extension.js.map +1 -0
  100. package/packages/vscode/out/provider/DatabaseTreeProvider.js +159 -0
  101. package/packages/vscode/out/provider/DatabaseTreeProvider.js.map +1 -0
  102. package/packages/vscode/out/provider/WebViewProvider.js +259 -0
  103. package/packages/vscode/out/provider/WebViewProvider.js.map +1 -0
  104. package/packages/vscode/out/service/ConnectionManager.js +105 -0
  105. package/packages/vscode/out/service/ConnectionManager.js.map +1 -0
  106. package/packages/vscode/out/service/DatabaseServiceBridge.js +395 -0
  107. package/packages/vscode/out/service/DatabaseServiceBridge.js.map +1 -0
  108. package/packages/vscode/out/typings/connection.js +3 -0
  109. package/packages/vscode/out/typings/connection.js.map +1 -0
  110. package/packages/vscode/package.json +142 -0
  111. package/packages/vscode/resources/icon.svg +5 -0
  112. package/packages/vscode/resources/webview/_plugin-vue_export-helper.js +6529 -0
  113. package/packages/vscode/resources/webview/_plugin-vue_export-helper.js.map +1 -0
  114. package/packages/vscode/resources/webview/connection.css +69 -0
  115. package/packages/vscode/resources/webview/connection.js +228 -0
  116. package/packages/vscode/resources/webview/connection.js.map +1 -0
  117. package/packages/vscode/resources/webview/database.css +259 -0
  118. package/packages/vscode/resources/webview/database.js +275 -0
  119. package/packages/vscode/resources/webview/database.js.map +1 -0
  120. package/packages/vscode/resources/webview/favicon.ico +0 -0
  121. package/packages/vscode/resources/webview/index.html +9 -0
  122. package/packages/vscode/resources/webview/modules/header.tpl +14 -0
  123. package/packages/vscode/resources/webview/modules/initial_state.tpl +55 -0
  124. package/packages/vscode/resources/webview/query.css +162 -0
  125. package/packages/vscode/resources/webview/query.js +198 -0
  126. package/packages/vscode/resources/webview/query.js.map +1 -0
  127. package/packages/vscode/src/database-services/base.service.js.map +1 -0
  128. package/packages/vscode/src/database-services/base.service.ts +363 -0
  129. package/packages/vscode/src/database-services/cockroachdb.service.js.map +1 -0
  130. package/packages/vscode/src/database-services/cockroachdb.service.ts +659 -0
  131. package/packages/vscode/src/database-services/connection.service.ts +341 -0
  132. package/packages/vscode/src/database-services/database.service.ts +630 -0
  133. package/packages/vscode/src/database-services/index.ts +7 -0
  134. package/packages/vscode/src/database-services/model/connection.entity.js +11 -0
  135. package/packages/vscode/src/database-services/model/connection.entity.js.map +1 -0
  136. package/packages/vscode/src/database-services/model/connection.entity.ts +66 -0
  137. package/packages/vscode/src/database-services/model/database.entity.js +35 -0
  138. package/packages/vscode/src/database-services/model/database.entity.js.map +1 -0
  139. package/packages/vscode/src/database-services/model/database.entity.ts +246 -0
  140. package/packages/vscode/src/database-services/mongodb.service.js.map +1 -0
  141. package/packages/vscode/src/database-services/mongodb.service.ts +454 -0
  142. package/packages/vscode/src/database-services/mssql.service.js.map +1 -0
  143. package/packages/vscode/src/database-services/mssql.service.ts +723 -0
  144. package/packages/vscode/src/database-services/mysql.service.js.map +1 -0
  145. package/packages/vscode/src/database-services/mysql.service.ts +761 -0
  146. package/packages/vscode/src/database-services/oracle.service.js.map +1 -0
  147. package/packages/vscode/src/database-services/oracle.service.ts +832 -0
  148. package/packages/vscode/src/database-services/postgres.service.js.map +1 -0
  149. package/packages/vscode/src/database-services/postgres.service.ts +741 -0
  150. package/packages/vscode/src/database-services/sap.service.js.map +1 -0
  151. package/packages/vscode/src/database-services/sap.service.ts +713 -0
  152. package/packages/vscode/src/database-services/sqlite.service.js.map +1 -0
  153. package/packages/vscode/src/database-services/sqlite.service.ts +559 -0
  154. package/packages/vscode/src/extension.ts +76 -0
  155. package/packages/vscode/src/provider/DatabaseTreeProvider.ts +167 -0
  156. package/packages/vscode/src/provider/WebViewProvider.ts +277 -0
  157. package/packages/vscode/src/service/DatabaseServiceBridge.ts +414 -0
  158. package/packages/vscode/src/typings/connection.ts +90 -0
  159. package/packages/vscode/tsconfig.json +21 -0
  160. package/public/fdb2.png +0 -0
  161. package/scripts/preinstall.js +90 -16
  162. package/server/backups/db_ai_breakout_2026-03-11T08-38-48-677Z.sql +0 -0
  163. package/server/index.ts +5 -10
  164. package/server/model/connection.entity.js +11 -0
  165. package/server/model/connection.entity.js.map +1 -0
  166. package/server/model/database.entity.js +35 -0
  167. package/server/model/database.entity.js.map +1 -0
  168. package/server/service/connection.service.ts +1 -0
  169. package/server/service/database/base.service.ts +8 -3
  170. package/server/service/database/cockroachdb.service.ts +123 -0
  171. package/server/service/database/database.service.ts +9 -0
  172. package/server/service/database/mongodb.service.ts +9 -0
  173. package/server/service/database/mssql.service.ts +118 -0
  174. package/server/service/database/mysql.service.ts +130 -0
  175. package/server/service/database/oracle.service.ts +128 -0
  176. package/server/service/database/postgres.service.ts +131 -0
  177. package/server/service/database/sap.service.ts +120 -0
  178. package/server/service/database/sqlite.service.ts +150 -0
  179. package/server/tsconfig.json +20 -0
  180. package/server.js +1 -1
  181. package/src/components/connection-editor/index.vue +0 -1
  182. package/src/platform/database/components/db-tools.vue +414 -174
  183. package/src/platform/database/components/table-detail.vue +1 -0
  184. package/src/platform/database/components/table-editor.vue +245 -18
  185. package/src/platform/vscode/bridge.ts +121 -0
  186. package/src/platform/vscode/components/ConnectionPanel.vue +272 -0
  187. package/src/platform/vscode/components/DatabasePanel.vue +532 -0
  188. package/src/platform/vscode/components/QueryPanel.vue +371 -0
  189. package/src/platform/vscode/entry/connection.ts +13 -0
  190. package/src/platform/vscode/entry/database.ts +13 -0
  191. package/src/platform/vscode/entry/query.ts +13 -0
  192. package/src/platform/vscode/index.ts +5 -0
  193. package/src/service/database.ts +2 -6
  194. package/vite.config.ts +46 -6
  195. 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) {