fdb2 1.0.2 → 1.0.4

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 (94) hide show
  1. package/bin/fdb2.js +11 -3
  2. package/dist/public/.vite/manifest.json +82 -0
  3. package/dist/public/bootstrap-icons.woff +0 -0
  4. package/dist/public/bootstrap-icons.woff2 +0 -0
  5. package/dist/public/bootstrap.css +14152 -0
  6. package/dist/public/bootstrap.js +5038 -0
  7. package/dist/public/explorer.css +2137 -0
  8. package/dist/public/explorer.js +49846 -0
  9. package/dist/public/index.css +1071 -0
  10. package/dist/public/index.js +12811 -0
  11. package/dist/public/layout.css +318 -0
  12. package/dist/public/layout.js +25 -0
  13. package/dist/public/vue.css +1 -0
  14. package/dist/public/vue.js +9111 -0
  15. package/dist/server/index.d.ts +2 -0
  16. package/dist/server/index.d.ts.map +1 -0
  17. package/dist/server/index.js +598 -0
  18. package/dist/server/index.js.map +1 -0
  19. package/dist/server/index.ts +677 -0
  20. package/dist/server/model/connection.entity.d.ts +55 -0
  21. package/dist/server/model/connection.entity.d.ts.map +1 -0
  22. package/dist/server/model/connection.entity.js +59 -0
  23. package/dist/server/model/connection.entity.js.map +1 -0
  24. package/dist/server/model/connection.entity.ts +66 -0
  25. package/dist/server/model/database.entity.d.ts +203 -0
  26. package/dist/server/model/database.entity.d.ts.map +1 -0
  27. package/dist/server/model/database.entity.js +211 -0
  28. package/dist/server/model/database.entity.js.map +1 -0
  29. package/dist/server/model/database.entity.ts +246 -0
  30. package/dist/server/service/connection.service.d.ts +79 -0
  31. package/dist/server/service/connection.service.d.ts.map +1 -0
  32. package/dist/server/service/connection.service.js +351 -0
  33. package/dist/server/service/connection.service.js.map +1 -0
  34. package/dist/server/service/connection.service.ts +341 -0
  35. package/dist/server/service/database/base.service.d.ts +152 -0
  36. package/dist/server/service/database/base.service.d.ts.map +1 -0
  37. package/dist/server/service/database/base.service.js +236 -0
  38. package/dist/server/service/database/base.service.js.map +1 -0
  39. package/dist/server/service/database/base.service.ts +363 -0
  40. package/dist/server/service/database/cockroachdb.service.d.ts +95 -0
  41. package/dist/server/service/database/cockroachdb.service.d.ts.map +1 -0
  42. package/dist/server/service/database/cockroachdb.service.js +634 -0
  43. package/dist/server/service/database/cockroachdb.service.js.map +1 -0
  44. package/dist/server/service/database/cockroachdb.service.ts +659 -0
  45. package/dist/server/service/database/database.service.d.ts +487 -0
  46. package/dist/server/service/database/database.service.d.ts.map +1 -0
  47. package/dist/server/service/database/database.service.js +580 -0
  48. package/dist/server/service/database/database.service.js.map +1 -0
  49. package/dist/server/service/database/database.service.ts +630 -0
  50. package/dist/server/service/database/index.d.ts +8 -0
  51. package/dist/server/service/database/index.d.ts.map +1 -0
  52. package/dist/server/service/database/index.js +18 -0
  53. package/dist/server/service/database/index.js.map +1 -0
  54. package/dist/server/service/database/index.ts +7 -0
  55. package/dist/server/service/database/mongodb.service.d.ts +99 -0
  56. package/dist/server/service/database/mongodb.service.d.ts.map +1 -0
  57. package/dist/server/service/database/mongodb.service.js +459 -0
  58. package/dist/server/service/database/mongodb.service.js.map +1 -0
  59. package/dist/server/service/database/mongodb.service.ts +454 -0
  60. package/dist/server/service/database/mssql.service.d.ts +98 -0
  61. package/dist/server/service/database/mssql.service.d.ts.map +1 -0
  62. package/dist/server/service/database/mssql.service.js +694 -0
  63. package/dist/server/service/database/mssql.service.js.map +1 -0
  64. package/dist/server/service/database/mssql.service.ts +723 -0
  65. package/dist/server/service/database/mysql.service.d.ts +94 -0
  66. package/dist/server/service/database/mysql.service.d.ts.map +1 -0
  67. package/dist/server/service/database/mysql.service.js +735 -0
  68. package/dist/server/service/database/mysql.service.js.map +1 -0
  69. package/dist/server/service/database/mysql.service.ts +761 -0
  70. package/dist/server/service/database/oracle.service.d.ts +106 -0
  71. package/dist/server/service/database/oracle.service.d.ts.map +1 -0
  72. package/dist/server/service/database/oracle.service.js +787 -0
  73. package/dist/server/service/database/oracle.service.js.map +1 -0
  74. package/dist/server/service/database/oracle.service.ts +832 -0
  75. package/dist/server/service/database/postgres.service.d.ts +102 -0
  76. package/dist/server/service/database/postgres.service.d.ts.map +1 -0
  77. package/dist/server/service/database/postgres.service.js +696 -0
  78. package/dist/server/service/database/postgres.service.js.map +1 -0
  79. package/dist/server/service/database/postgres.service.ts +741 -0
  80. package/dist/server/service/database/sap.service.d.ts +95 -0
  81. package/dist/server/service/database/sap.service.d.ts.map +1 -0
  82. package/dist/server/service/database/sap.service.js +695 -0
  83. package/dist/server/service/database/sap.service.js.map +1 -0
  84. package/dist/server/service/database/sap.service.ts +713 -0
  85. package/dist/server/service/database/sqlite.service.d.ts +92 -0
  86. package/dist/server/service/database/sqlite.service.d.ts.map +1 -0
  87. package/dist/server/service/database/sqlite.service.js +532 -0
  88. package/dist/server/service/database/sqlite.service.js.map +1 -0
  89. package/dist/server/service/database/sqlite.service.ts +559 -0
  90. package/dist/server/service/session.service.ts +158 -0
  91. package/dist/view/index.html +45 -0
  92. package/package.json +2 -1
  93. package/scripts/preinstall.js +38 -0
  94. package/server.pid +0 -1
@@ -0,0 +1,246 @@
1
+ /**
2
+ * 数据库信息实体
3
+ * 用于存储数据库的基本信息和结构
4
+ */
5
+
6
+ export class DatabaseEntity {
7
+ /**
8
+ * 数据库名称
9
+ */
10
+ name: string;
11
+
12
+ /**
13
+ * 数据库字符集
14
+ */
15
+ charset?: string;
16
+
17
+ /**
18
+ * 数据库排序规则
19
+ */
20
+ collation?: string;
21
+
22
+ /**
23
+ * 表数量
24
+ */
25
+ tableCount: number;
26
+
27
+ /**
28
+ * 数据库大小 (字节)
29
+ */
30
+ size: number;
31
+
32
+ /**
33
+ * 创建时间
34
+ */
35
+ createdAt?: Date;
36
+
37
+ /**
38
+ * 表信息列表
39
+ */
40
+ tables?: TableEntity[];
41
+ }
42
+
43
+ /**
44
+ * 数据库表实体
45
+ */
46
+ export class TableEntity {
47
+ /**
48
+ * 表名
49
+ */
50
+ name: string;
51
+
52
+ /**
53
+ * 表类型
54
+ */
55
+ type?: string;
56
+
57
+ /**
58
+ * 引擎 (MySQL)
59
+ */
60
+ engine?: string;
61
+
62
+ /**
63
+ * 行数
64
+ */
65
+ rowCount: number;
66
+
67
+ /**
68
+ * 数据大小 (字节)
69
+ */
70
+ dataSize: number;
71
+
72
+ /**
73
+ * 索引大小 (字节)
74
+ */
75
+ indexSize: number;
76
+
77
+ /**
78
+ * 字符集
79
+ */
80
+ charset?: string;
81
+
82
+ /**
83
+ * 排序规则
84
+ */
85
+ collation?: string;
86
+
87
+ /**
88
+ * 创建时间
89
+ */
90
+ createdAt?: Date;
91
+
92
+ /**
93
+ * 更新时间
94
+ */
95
+ updatedAt?: Date;
96
+
97
+ /**
98
+ * 注释
99
+ */
100
+ comment?: string;
101
+
102
+ /**
103
+ * 列信息
104
+ */
105
+ columns?: ColumnEntity[];
106
+
107
+ /**
108
+ * 索引信息
109
+ */
110
+ indexes?: IndexEntity[];
111
+
112
+ /**
113
+ * 外键信息
114
+ */
115
+ foreignKeys?: ForeignKeyEntity[];
116
+ }
117
+
118
+ /**
119
+ * 数据库列实体
120
+ */
121
+ export class ColumnEntity {
122
+ /**
123
+ * 列名
124
+ */
125
+ name: string;
126
+
127
+ /**
128
+ * 数据类型
129
+ */
130
+ type: string;
131
+
132
+ /**
133
+ * 是否允许NULL
134
+ */
135
+ nullable: boolean;
136
+
137
+ /**
138
+ * 默认值
139
+ */
140
+ defaultValue?: any;
141
+
142
+ /**
143
+ * 是否主键
144
+ */
145
+ isPrimary: boolean;
146
+
147
+ /**
148
+ * 是否自增
149
+ */
150
+ isAutoIncrement: boolean;
151
+
152
+ /**
153
+ * 字符长度
154
+ */
155
+ length?: number;
156
+
157
+ /**
158
+ * 小数位数
159
+ */
160
+ precision?: number;
161
+
162
+ /**
163
+ * 小数点后位数
164
+ */
165
+ scale?: number;
166
+
167
+ /**
168
+ * 字符集
169
+ */
170
+ charset?: string;
171
+
172
+ /**
173
+ * 排序规则
174
+ */
175
+ collation?: string;
176
+
177
+ /**
178
+ * 注释
179
+ */
180
+ comment?: string;
181
+ }
182
+
183
+ /**
184
+ * 数据库索引实体
185
+ */
186
+ export class IndexEntity {
187
+ /**
188
+ * 索引名
189
+ */
190
+ name: string;
191
+
192
+ /**
193
+ * 索引类型 (PRIMARY, UNIQUE, INDEX, FULLTEXT)
194
+ */
195
+ type: string;
196
+
197
+ /**
198
+ * 索引列
199
+ */
200
+ columns: string[];
201
+
202
+ /**
203
+ * 是否唯一
204
+ */
205
+ unique: boolean;
206
+
207
+ /**
208
+ * 注释
209
+ */
210
+ comment?: string;
211
+ }
212
+
213
+ /**
214
+ * 外键实体
215
+ */
216
+ export class ForeignKeyEntity {
217
+ /**
218
+ * 约束名
219
+ */
220
+ name: string;
221
+
222
+ /**
223
+ * 本地表列
224
+ */
225
+ column: string;
226
+
227
+ /**
228
+ * 目标表
229
+ */
230
+ referencedTable: string;
231
+
232
+ /**
233
+ * 目标表列
234
+ */
235
+ referencedColumn: string;
236
+
237
+ /**
238
+ * 删除规则 (CASCADE, SET NULL, RESTRICT, NO ACTION)
239
+ */
240
+ onDelete: string;
241
+
242
+ /**
243
+ * 更新规则 (CASCADE, SET NULL, RESTRICT, NO ACTION)
244
+ */
245
+ onUpdate: string;
246
+ }
@@ -0,0 +1,79 @@
1
+ import { ConnectionEntity } from '../model/connection.entity';
2
+ import { DataSource } from 'typeorm';
3
+ /**
4
+ * 数据库连接管理服务
5
+ * 负责管理数据库连接配置和连接实例
6
+ */
7
+ export declare class ConnectionService {
8
+ /**
9
+ * 连接配置文件路径
10
+ * 优先使用环境变量 DB_TOOL_DATA_DIR,否则使用用户主目录下的 .db-tool 目录
11
+ */
12
+ private readonly configPath;
13
+ /**
14
+ * 活跃的数据库连接实例
15
+ */
16
+ private activeConnections;
17
+ constructor();
18
+ /**
19
+ * 初始化服务,创建配置目录
20
+ */
21
+ init(): Promise<void>;
22
+ /**
23
+ * 获取所有数据库连接配置
24
+ */
25
+ getAllConnections(): Promise<ConnectionEntity[]>;
26
+ /**
27
+ * 根据ID获取数据库连接配置
28
+ */
29
+ getConnectionById(id: string): Promise<ConnectionEntity | null>;
30
+ /**
31
+ * 添加数据库连接配置
32
+ */
33
+ addConnection(connection: ConnectionEntity): Promise<ConnectionEntity>;
34
+ /**
35
+ * 更新数据库连接配置
36
+ */
37
+ updateConnection(id: string, updates: Partial<ConnectionEntity>): Promise<ConnectionEntity>;
38
+ /**
39
+ * 删除数据库连接配置
40
+ */
41
+ deleteConnection(id: string): Promise<void>;
42
+ /**
43
+ * 测试数据库连接
44
+ */
45
+ testConnection(connection: ConnectionEntity): Promise<boolean>;
46
+ /**
47
+ * 获取活跃的数据库连接
48
+ */
49
+ getActiveConnection(id: string, database?: string): Promise<DataSource>;
50
+ /**
51
+ * 关闭数据库连接
52
+ */
53
+ closeConnection(id: string, database?: string): Promise<void>;
54
+ /**
55
+ * 关闭特定连接的所有数据库连接
56
+ */
57
+ closeAllConnectionsForId(connectionId: string): Promise<void>;
58
+ /**
59
+ * 关闭所有数据库连接
60
+ */
61
+ closeAllConnections(): Promise<void>;
62
+ /**
63
+ * 创建TypeORM数据源
64
+ */
65
+ private createTypeORMDataSource;
66
+ /**
67
+ * 获取TypeORM连接配置
68
+ */
69
+ private getTypeORMOptions;
70
+ /**
71
+ * 保存连接配置到文件
72
+ */
73
+ private saveConnections;
74
+ /**
75
+ * 生成唯一ID
76
+ */
77
+ private generateId;
78
+ }
79
+ //# sourceMappingURL=connection.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.service.d.ts","sourceRoot":"","sources":["../../../server/service/connection.service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAA0B,MAAM,SAAS,CAAC;AAE7D;;;GAGG;AACH,qBAAa,iBAAiB;IAE5B;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC;;OAEG;IACH,OAAO,CAAC,iBAAiB,CAAsC;;IAO/D;;OAEG;IACG,IAAI;IAOV;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAatD;;OAEG;IACG,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAKrE;;OAEG;IACG,aAAa,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAoB5E;;OAEG;IACG,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAmBjG;;OAEG;IACG,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBjD;;OAEG;IACG,cAAc,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAapE;;OAEG;IACG,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA2C7E;;OAEG;IACG,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAanE;;OAEG;IACG,wBAAwB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAenE;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAW1C;;OAEG;YACW,uBAAuB;IAKrC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAsEzB;;OAEG;YACW,eAAe;IAa7B;;OAEG;IACH,OAAO,CAAC,UAAU;CAGnB"}
@@ -0,0 +1,351 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ConnectionService = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const os = __importStar(require("os"));
40
+ const typeorm_1 = require("typeorm");
41
+ /**
42
+ * 数据库连接管理服务
43
+ * 负责管理数据库连接配置和连接实例
44
+ */
45
+ class ConnectionService {
46
+ /**
47
+ * 连接配置文件路径
48
+ * 优先使用环境变量 DB_TOOL_DATA_DIR,否则使用用户主目录下的 .db-tool 目录
49
+ */
50
+ configPath;
51
+ /**
52
+ * 活跃的数据库连接实例
53
+ */
54
+ activeConnections = new Map();
55
+ constructor() {
56
+ const dataDir = process.env.DB_TOOL_DATA_DIR || path.join(os.homedir(), '.db-tool');
57
+ this.configPath = path.join(dataDir, 'connections.json');
58
+ }
59
+ /**
60
+ * 初始化服务,创建配置目录
61
+ */
62
+ async init() {
63
+ const configDir = path.dirname(this.configPath);
64
+ if (!fs.existsSync(configDir)) {
65
+ fs.mkdirSync(configDir, { recursive: true });
66
+ }
67
+ }
68
+ /**
69
+ * 获取所有数据库连接配置
70
+ */
71
+ async getAllConnections() {
72
+ try {
73
+ if (!fs.existsSync(this.configPath)) {
74
+ return [];
75
+ }
76
+ const data = fs.readFileSync(this.configPath, 'utf8');
77
+ return JSON.parse(data);
78
+ }
79
+ catch (error) {
80
+ console.error('读取连接配置失败:', error);
81
+ return [];
82
+ }
83
+ }
84
+ /**
85
+ * 根据ID获取数据库连接配置
86
+ */
87
+ async getConnectionById(id) {
88
+ const connections = await this.getAllConnections();
89
+ return connections.find(conn => conn.id === id) || null;
90
+ }
91
+ /**
92
+ * 添加数据库连接配置
93
+ */
94
+ async addConnection(connection) {
95
+ const connections = await this.getAllConnections();
96
+ // 检查名称是否重复
97
+ if (connections.find(conn => conn.name === connection.name)) {
98
+ throw new Error('连接名称已存在');
99
+ }
100
+ // 生成ID并设置时间戳
101
+ connection.id = this.generateId();
102
+ connection.createdAt = new Date();
103
+ connection.updatedAt = new Date();
104
+ connection.enabled = connection.enabled !== undefined ? connection.enabled : true;
105
+ connections.push(connection);
106
+ await this.saveConnections(connections);
107
+ return connection;
108
+ }
109
+ /**
110
+ * 更新数据库连接配置
111
+ */
112
+ async updateConnection(id, updates) {
113
+ const connections = await this.getAllConnections();
114
+ const index = connections.findIndex(conn => conn.id === id);
115
+ if (index === -1) {
116
+ throw new Error('连接配置不存在');
117
+ }
118
+ // 检查名称重复
119
+ if (updates.name && connections.find((conn, idx) => conn.name === updates.name && idx !== index)) {
120
+ throw new Error('连接名称已存在');
121
+ }
122
+ // @ts-ignore
123
+ connections[index] = { ...connections[index], ...updates, updatedAt: new Date() };
124
+ await this.saveConnections(connections);
125
+ // @ts-ignore
126
+ return connections[index];
127
+ }
128
+ /**
129
+ * 删除数据库连接配置
130
+ */
131
+ async deleteConnection(id) {
132
+ const connections = await this.getAllConnections();
133
+ const filteredConnections = connections.filter(conn => conn.id !== id);
134
+ if (filteredConnections.length === connections.length) {
135
+ throw new Error('连接配置不存在');
136
+ }
137
+ // 关闭活跃连接
138
+ if (this.activeConnections.has(id)) {
139
+ await this.activeConnections.get(id)?.destroy();
140
+ this.activeConnections.delete(id);
141
+ }
142
+ await this.saveConnections(filteredConnections);
143
+ }
144
+ /**
145
+ * 测试数据库连接
146
+ */
147
+ async testConnection(connection) {
148
+ try {
149
+ console.log('test', connection);
150
+ const tempDataSource = await this.createTypeORMDataSource(connection);
151
+ await tempDataSource.query('SELECT 1');
152
+ await tempDataSource.destroy();
153
+ return true;
154
+ }
155
+ catch (error) {
156
+ console.error(error);
157
+ return false;
158
+ }
159
+ }
160
+ /**
161
+ * 获取活跃的数据库连接
162
+ */
163
+ async getActiveConnection(id, database) {
164
+ const key = database ? `${id}_${database}` : id;
165
+ if (this.activeConnections.has(key)) {
166
+ const db = this.activeConnections.get(key);
167
+ // 检查连接是否仍然有效
168
+ if (db?.isInitialized) {
169
+ return db;
170
+ }
171
+ else {
172
+ // 连接已关闭,从缓存中移除
173
+ this.activeConnections.delete(key);
174
+ }
175
+ }
176
+ // 连接池大小限制,防止连接数无限增长
177
+ if (this.activeConnections.size >= 10) {
178
+ // 关闭最旧的连接
179
+ const oldestKey = this.activeConnections.keys().next().value || '';
180
+ const oldestConnection = this.activeConnections.get(oldestKey);
181
+ try {
182
+ await oldestConnection?.destroy();
183
+ }
184
+ catch (error) {
185
+ console.error(`关闭旧连接 ${oldestKey} 失败:`, error);
186
+ }
187
+ this.activeConnections.delete(oldestKey);
188
+ }
189
+ const connectionConfig = await this.getConnectionById(id);
190
+ if (!connectionConfig) {
191
+ throw new Error('连接配置不存在');
192
+ }
193
+ // 创建一个新的连接配置,使用指定的数据库
194
+ const updatedConnectionConfig = {
195
+ ...connectionConfig,
196
+ database: database || connectionConfig.database
197
+ };
198
+ const dataSource = await this.createTypeORMDataSource(updatedConnectionConfig);
199
+ this.activeConnections.set(key, dataSource);
200
+ return dataSource;
201
+ }
202
+ /**
203
+ * 关闭数据库连接
204
+ */
205
+ async closeConnection(id, database) {
206
+ const key = database ? `${id}_${database}` : id;
207
+ if (this.activeConnections.has(key)) {
208
+ await this.activeConnections.get(key)?.destroy();
209
+ this.activeConnections.delete(key);
210
+ }
211
+ // 也关闭默认连接(如果存在)
212
+ if (database && this.activeConnections.has(id)) {
213
+ await this.activeConnections.get(id)?.destroy();
214
+ this.activeConnections.delete(id);
215
+ }
216
+ }
217
+ /**
218
+ * 关闭特定连接的所有数据库连接
219
+ */
220
+ async closeAllConnectionsForId(connectionId) {
221
+ const keysToDelete = [];
222
+ for (const [key, dataSource] of this.activeConnections) {
223
+ if (key.startsWith(connectionId + '_') || key === connectionId) {
224
+ try {
225
+ await dataSource.destroy();
226
+ keysToDelete.push(key);
227
+ }
228
+ catch (error) {
229
+ console.error(`关闭连接 ${key} 失败:`, error);
230
+ }
231
+ }
232
+ }
233
+ keysToDelete.forEach(key => this.activeConnections.delete(key));
234
+ }
235
+ /**
236
+ * 关闭所有数据库连接
237
+ */
238
+ async closeAllConnections() {
239
+ for (const [id, dataSource] of this.activeConnections) {
240
+ try {
241
+ await dataSource.destroy();
242
+ }
243
+ catch (error) {
244
+ console.error(`关闭连接 ${id} 失败:`, error);
245
+ }
246
+ }
247
+ this.activeConnections.clear();
248
+ }
249
+ /**
250
+ * 创建TypeORM数据源
251
+ */
252
+ async createTypeORMDataSource(connectionConfig) {
253
+ const connectionOptions = this.getTypeORMOptions(connectionConfig);
254
+ return new typeorm_1.DataSource(connectionOptions).initialize();
255
+ }
256
+ /**
257
+ * 获取TypeORM连接配置
258
+ */
259
+ getTypeORMOptions(connectionConfig) {
260
+ const baseOptions = {
261
+ type: connectionConfig.type,
262
+ host: connectionConfig.host,
263
+ port: connectionConfig.port,
264
+ username: connectionConfig.username,
265
+ password: connectionConfig.password,
266
+ database: connectionConfig.database,
267
+ synchronize: false,
268
+ logging: false,
269
+ // 关键配置:开启多语句执行
270
+ extra: {
271
+ multipleStatements: true
272
+ },
273
+ ...connectionConfig.options
274
+ };
275
+ // 根据数据库类型调整配置
276
+ switch (connectionConfig.type.toLowerCase()) {
277
+ case 'sqlite':
278
+ return {
279
+ ...baseOptions,
280
+ type: 'sqlite',
281
+ database: connectionConfig.database,
282
+ host: undefined,
283
+ port: undefined,
284
+ username: undefined,
285
+ password: undefined
286
+ };
287
+ case 'postgres':
288
+ case 'postgresql':
289
+ return {
290
+ ...baseOptions,
291
+ type: 'postgres',
292
+ ssl: connectionConfig.options?.ssl || false
293
+ };
294
+ case 'oracle':
295
+ return {
296
+ ...baseOptions,
297
+ type: 'oracle',
298
+ connectString: `${connectionConfig.host}:${connectionConfig.port}/${connectionConfig.database}`,
299
+ host: undefined,
300
+ port: undefined,
301
+ database: undefined,
302
+ extra: {
303
+ connectionTimeout: 60000,
304
+ poolMax: 10,
305
+ poolMin: 1,
306
+ poolIncrement: 1
307
+ }
308
+ };
309
+ case 'mssql':
310
+ case 'sqlserver':
311
+ return {
312
+ ...baseOptions,
313
+ type: 'mssql',
314
+ options: {
315
+ encrypt: connectionConfig.options?.encrypt || false,
316
+ trustServerCertificate: true
317
+ },
318
+ extra: {
319
+ connectionTimeout: 60000,
320
+ requestTimeout: 15000
321
+ }
322
+ };
323
+ default:
324
+ return baseOptions;
325
+ }
326
+ }
327
+ /**
328
+ * 保存连接配置到文件
329
+ */
330
+ async saveConnections(connections) {
331
+ try {
332
+ const dir = path.dirname(this.configPath);
333
+ if (!fs.existsSync(dir)) {
334
+ fs.mkdirSync(dir, { recursive: true });
335
+ }
336
+ fs.writeFileSync(this.configPath, JSON.stringify(connections, null, 2), 'utf8');
337
+ }
338
+ catch (error) {
339
+ console.error('保存连接配置失败:', error);
340
+ throw error;
341
+ }
342
+ }
343
+ /**
344
+ * 生成唯一ID
345
+ */
346
+ generateId() {
347
+ return Date.now().toString(36) + Math.random().toString(36).substr(2);
348
+ }
349
+ }
350
+ exports.ConnectionService = ConnectionService;
351
+ //# sourceMappingURL=connection.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.service.js","sourceRoot":"","sources":["../../../server/service/connection.service.ts"],"names":[],"mappings":"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"}