fdb2 1.0.1 → 1.0.3

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 (110) hide show
  1. package/README.md +334 -221
  2. package/bin/fdb2.js +1 -1
  3. package/dist/public/.vite/manifest.json +82 -0
  4. package/dist/public/bootstrap-icons.woff +0 -0
  5. package/dist/public/bootstrap-icons.woff2 +0 -0
  6. package/dist/public/bootstrap.css +14152 -0
  7. package/dist/public/bootstrap.js +5038 -0
  8. package/dist/public/explorer.css +2137 -0
  9. package/dist/public/explorer.js +49846 -0
  10. package/dist/public/index.css +1071 -0
  11. package/dist/public/index.js +12811 -0
  12. package/dist/public/layout.css +318 -0
  13. package/dist/public/layout.js +25 -0
  14. package/dist/public/vue.css +1 -0
  15. package/dist/public/vue.js +9111 -0
  16. package/dist/server/index.d.ts +2 -0
  17. package/dist/server/index.d.ts.map +1 -0
  18. package/dist/server/index.js +598 -0
  19. package/dist/server/index.js.map +1 -0
  20. package/dist/server/index.ts +677 -0
  21. package/dist/server/model/connection.entity.d.ts +55 -0
  22. package/dist/server/model/connection.entity.d.ts.map +1 -0
  23. package/dist/server/model/connection.entity.js +59 -0
  24. package/dist/server/model/connection.entity.js.map +1 -0
  25. package/dist/server/model/connection.entity.ts +66 -0
  26. package/dist/server/model/database.entity.d.ts +203 -0
  27. package/dist/server/model/database.entity.d.ts.map +1 -0
  28. package/dist/server/model/database.entity.js +211 -0
  29. package/dist/server/model/database.entity.js.map +1 -0
  30. package/dist/server/model/database.entity.ts +246 -0
  31. package/dist/server/service/connection.service.d.ts +79 -0
  32. package/dist/server/service/connection.service.d.ts.map +1 -0
  33. package/dist/server/service/connection.service.js +351 -0
  34. package/dist/server/service/connection.service.js.map +1 -0
  35. package/dist/server/service/connection.service.ts +341 -0
  36. package/dist/server/service/database/base.service.d.ts +152 -0
  37. package/dist/server/service/database/base.service.d.ts.map +1 -0
  38. package/dist/server/service/database/base.service.js +236 -0
  39. package/dist/server/service/database/base.service.js.map +1 -0
  40. package/dist/server/service/database/base.service.ts +363 -0
  41. package/dist/server/service/database/cockroachdb.service.d.ts +95 -0
  42. package/dist/server/service/database/cockroachdb.service.d.ts.map +1 -0
  43. package/dist/server/service/database/cockroachdb.service.js +634 -0
  44. package/dist/server/service/database/cockroachdb.service.js.map +1 -0
  45. package/dist/server/service/database/cockroachdb.service.ts +659 -0
  46. package/dist/server/service/database/database.service.d.ts +487 -0
  47. package/dist/server/service/database/database.service.d.ts.map +1 -0
  48. package/dist/server/service/database/database.service.js +580 -0
  49. package/dist/server/service/database/database.service.js.map +1 -0
  50. package/dist/server/service/database/database.service.ts +630 -0
  51. package/dist/server/service/database/index.d.ts +8 -0
  52. package/dist/server/service/database/index.d.ts.map +1 -0
  53. package/dist/server/service/database/index.js +18 -0
  54. package/dist/server/service/database/index.js.map +1 -0
  55. package/dist/server/service/database/index.ts +7 -0
  56. package/dist/server/service/database/mongodb.service.d.ts +99 -0
  57. package/dist/server/service/database/mongodb.service.d.ts.map +1 -0
  58. package/dist/server/service/database/mongodb.service.js +459 -0
  59. package/dist/server/service/database/mongodb.service.js.map +1 -0
  60. package/dist/server/service/database/mongodb.service.ts +454 -0
  61. package/dist/server/service/database/mssql.service.d.ts +98 -0
  62. package/dist/server/service/database/mssql.service.d.ts.map +1 -0
  63. package/dist/server/service/database/mssql.service.js +694 -0
  64. package/dist/server/service/database/mssql.service.js.map +1 -0
  65. package/dist/server/service/database/mssql.service.ts +723 -0
  66. package/dist/server/service/database/mysql.service.d.ts +94 -0
  67. package/dist/server/service/database/mysql.service.d.ts.map +1 -0
  68. package/dist/server/service/database/mysql.service.js +735 -0
  69. package/dist/server/service/database/mysql.service.js.map +1 -0
  70. package/dist/server/service/database/mysql.service.ts +761 -0
  71. package/dist/server/service/database/oracle.service.d.ts +106 -0
  72. package/dist/server/service/database/oracle.service.d.ts.map +1 -0
  73. package/dist/server/service/database/oracle.service.js +787 -0
  74. package/dist/server/service/database/oracle.service.js.map +1 -0
  75. package/dist/server/service/database/oracle.service.ts +832 -0
  76. package/dist/server/service/database/postgres.service.d.ts +102 -0
  77. package/dist/server/service/database/postgres.service.d.ts.map +1 -0
  78. package/dist/server/service/database/postgres.service.js +696 -0
  79. package/dist/server/service/database/postgres.service.js.map +1 -0
  80. package/dist/server/service/database/postgres.service.ts +741 -0
  81. package/dist/server/service/database/sap.service.d.ts +95 -0
  82. package/dist/server/service/database/sap.service.d.ts.map +1 -0
  83. package/dist/server/service/database/sap.service.js +695 -0
  84. package/dist/server/service/database/sap.service.js.map +1 -0
  85. package/dist/server/service/database/sap.service.ts +713 -0
  86. package/dist/server/service/database/sqlite.service.d.ts +92 -0
  87. package/dist/server/service/database/sqlite.service.d.ts.map +1 -0
  88. package/dist/server/service/database/sqlite.service.js +532 -0
  89. package/dist/server/service/database/sqlite.service.js.map +1 -0
  90. package/dist/server/service/database/sqlite.service.ts +559 -0
  91. package/dist/server/service/session.service.ts +158 -0
  92. package/dist/view/index.html +45 -0
  93. package/package.json +2 -2
  94. package/server/service/connection.service.ts +8 -1
  95. package/server/service/database/cockroachdb.service.ts +659 -0
  96. package/server/service/database/database.service.ts +120 -0
  97. package/server/service/database/mongodb.service.ts +454 -0
  98. package/server/service/database/oracle.service.ts +7 -14
  99. package/server/service/database/postgres.service.ts +4 -7
  100. package/server/service/database/sap.service.ts +713 -0
  101. package/server/service/database/sqlite.service.ts +3 -3
  102. package/server.pid +1 -0
  103. package/src/platform/database/components/database-detail.vue +11 -11
  104. package/src/platform/database/components/table-detail.vue +4 -4
  105. package/src/platform/database/types/common.ts +1 -1
  106. package/bin/docker/.env +0 -4
  107. package/data/connections.demo.json +0 -32
  108. package/nw-build.js +0 -120
  109. package/nw-dev.js +0 -65
  110. package/src/base//345/237/272/347/241/200/345/261/202.md +0 -7
@@ -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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"}