datapeek 0.1.11 → 0.1.12
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/dist/cli/chunk-2I4MNNVK.js +628 -0
- package/dist/cli/chunk-4GDQ7VJZ.js +662 -0
- package/dist/cli/chunk-4MIQHH6K.js +47 -0
- package/dist/cli/chunk-6K3WSEIM.js +375 -0
- package/dist/cli/chunk-6PMCDR7J.js +628 -0
- package/dist/cli/chunk-B7K46745.js +605 -0
- package/dist/cli/chunk-CK2O76SG.js +713 -0
- package/dist/cli/chunk-FXOMCTFV.js +696 -0
- package/dist/cli/chunk-G4ID5SFT.js +628 -0
- package/dist/cli/chunk-GCVFEHSZ.js +708 -0
- package/dist/cli/chunk-LGE2JQ3S.js +628 -0
- package/dist/cli/chunk-NDLKLB5A.js +710 -0
- package/dist/cli/chunk-PG6I26XT.js +614 -0
- package/dist/cli/chunk-RK2Q2AX5.js +582 -0
- package/dist/cli/chunk-S5LRCCK6.js +582 -0
- package/dist/cli/chunk-UBFQXPPF.js +701 -0
- package/dist/cli/chunk-X2DQBOP6.js +712 -0
- package/dist/cli/chunk-XRMPVZIS.js +709 -0
- package/dist/cli/chunk-Z5G3UEXN.js +711 -0
- package/dist/cli/chunk-ZMP7S3G6.js +696 -0
- package/dist/cli/db-32TDDTFP.js +28 -0
- package/dist/cli/db-47O74DN5.js +34 -0
- package/dist/cli/db-4U22OWGB.js +29 -0
- package/dist/cli/db-CL72XDNO.js +34 -0
- package/dist/cli/db-CZCZOEID.js +28 -0
- package/dist/cli/db-IX3DXZ2C.js +34 -0
- package/dist/cli/db-LJCRTZTY.js +34 -0
- package/dist/cli/db-LNX4UMRF.js +28 -0
- package/dist/cli/db-NESFXDWL.js +28 -0
- package/dist/cli/db-OIJ2PJK6.js +34 -0
- package/dist/cli/db-OPAF6ZO3.js +28 -0
- package/dist/cli/db-PQURQHSK.js +28 -0
- package/dist/cli/db-QN5MTDYB.js +28 -0
- package/dist/cli/db-RBMUR3OK.js +34 -0
- package/dist/cli/db-REMUYLPP.js +34 -0
- package/dist/cli/db-RTHQ4ZAU.js +28 -0
- package/dist/cli/db-SHFLGGWD.js +28 -0
- package/dist/cli/db-ULMGZXQ5.js +34 -0
- package/dist/cli/db-YOGJ4LXE.js +28 -0
- package/dist/cli/dev.js +449 -374
- package/dist/cli/index.js +452 -376
- package/dist/cli/queryCancellation-4CMKYTFU.js +46 -0
- package/dist/cli/queryCancellation-E5O4FBUY.js +14 -0
- package/dist/client/assets/index-BXssAVuE.css +1 -0
- package/dist/client/assets/index-DgwSpfvt.js +378 -0
- package/dist/client/index.html +2 -2
- package/dist/server/chunk-26GSUAI4.js +710 -0
- package/dist/server/chunk-36OOXHKI.js +659 -0
- package/dist/server/chunk-3DAIYH42.js +44 -0
- package/dist/server/chunk-4ELMZYWA.js +611 -0
- package/dist/server/chunk-5ESS5YBD.js +707 -0
- package/dist/server/chunk-7HIBWXBL.js +625 -0
- package/dist/server/chunk-BH22Q2FV.js +705 -0
- package/dist/server/chunk-CFU2CLKS.js +693 -0
- package/dist/server/chunk-CXA3HXTK.js +698 -0
- package/dist/server/chunk-DAUUXYQF.js +706 -0
- package/dist/server/chunk-FMSIEQ2T.js +579 -0
- package/dist/server/chunk-G6A463RM.js +625 -0
- package/dist/server/chunk-H6DUOXOK.js +625 -0
- package/dist/server/chunk-JCRZ6H7P.js +579 -0
- package/dist/server/chunk-L6LL3NE7.js +602 -0
- package/dist/server/chunk-TH6TUILG.js +709 -0
- package/dist/server/chunk-UJ2LRK25.js +373 -0
- package/dist/server/chunk-YI67PW64.js +625 -0
- package/dist/server/chunk-ZDZ2C5ZQ.js +693 -0
- package/dist/server/chunk-ZJOVVCPT.js +708 -0
- package/dist/server/db-22DQ6YG7.js +32 -0
- package/dist/server/db-3CBO6RHU.js +26 -0
- package/dist/server/db-3XN2KWYT.js +32 -0
- package/dist/server/db-3Y6K4EDP.js +26 -0
- package/dist/server/db-57HXNWPD.js +26 -0
- package/dist/server/db-5GCTDKYH.js +27 -0
- package/dist/server/db-5VQOTJ52.js +26 -0
- package/dist/server/db-B5L7VQ7E.js +32 -0
- package/dist/server/db-CJPCGHL3.js +32 -0
- package/dist/server/db-DAQ4BVCU.js +32 -0
- package/dist/server/db-EEA6EWHL.js +26 -0
- package/dist/server/db-KR7Z5M5V.js +32 -0
- package/dist/server/db-LMSBISDM.js +26 -0
- package/dist/server/db-LSOQE7N7.js +32 -0
- package/dist/server/db-NHBP6YLH.js +26 -0
- package/dist/server/db-OWVJVBBD.js +26 -0
- package/dist/server/db-TTVXKX7P.js +26 -0
- package/dist/server/db-YJ753EQV.js +26 -0
- package/dist/server/db-ZV6GZHFU.js +32 -0
- package/dist/server/dev.js +449 -374
- package/dist/server/index.js +449 -374
- package/dist/server/queryCancellation-M56DISJX.js +43 -0
- package/dist/server/queryCancellation-T2HSNMIV.js +12 -0
- package/package.json +3 -1
- package/dist/client/assets/index-CPoX5Biw.css +0 -1
- package/dist/client/assets/index-KtK9Gzwi.js +0 -375
|
@@ -0,0 +1,628 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
// src/server/db/mssql.ts
|
|
5
|
+
import sql from "mssql";
|
|
6
|
+
var pool = null;
|
|
7
|
+
function parseConnectionString(connectionString) {
|
|
8
|
+
const config = {
|
|
9
|
+
server: "",
|
|
10
|
+
database: "",
|
|
11
|
+
options: {
|
|
12
|
+
encrypt: true,
|
|
13
|
+
trustServerCertificate: false,
|
|
14
|
+
enableArithAbort: true
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
const parts = connectionString.split(";");
|
|
18
|
+
for (const part of parts) {
|
|
19
|
+
const [key, ...valueParts] = part.split("=");
|
|
20
|
+
const value = valueParts.join("=").trim();
|
|
21
|
+
const keyLower = key.trim().toLowerCase();
|
|
22
|
+
switch (keyLower) {
|
|
23
|
+
case "server":
|
|
24
|
+
case "data source":
|
|
25
|
+
let serverValue = value;
|
|
26
|
+
if (serverValue.startsWith("tcp:")) {
|
|
27
|
+
serverValue = serverValue.substring(4);
|
|
28
|
+
}
|
|
29
|
+
const [serverHost, serverPort] = serverValue.split(",");
|
|
30
|
+
config.server = serverHost.trim();
|
|
31
|
+
if (serverPort) {
|
|
32
|
+
config.port = parseInt(serverPort.trim(), 10);
|
|
33
|
+
}
|
|
34
|
+
break;
|
|
35
|
+
case "database":
|
|
36
|
+
case "initial catalog":
|
|
37
|
+
config.database = value;
|
|
38
|
+
break;
|
|
39
|
+
case "user id":
|
|
40
|
+
case "userid":
|
|
41
|
+
case "uid":
|
|
42
|
+
config.user = value;
|
|
43
|
+
break;
|
|
44
|
+
case "password":
|
|
45
|
+
case "pwd":
|
|
46
|
+
config.password = value;
|
|
47
|
+
break;
|
|
48
|
+
case "port":
|
|
49
|
+
config.port = parseInt(value, 10);
|
|
50
|
+
break;
|
|
51
|
+
case "encrypt":
|
|
52
|
+
config.options.encrypt = value.toLowerCase() === "true";
|
|
53
|
+
break;
|
|
54
|
+
case "trustservercertificate":
|
|
55
|
+
case "trust server certificate":
|
|
56
|
+
config.options.trustServerCertificate = value.toLowerCase() === "true";
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return config;
|
|
61
|
+
}
|
|
62
|
+
async function testConnection(config) {
|
|
63
|
+
const testPool = typeof config === "string" ? new sql.ConnectionPool(parseConnectionString(config)) : new sql.ConnectionPool(config);
|
|
64
|
+
try {
|
|
65
|
+
await testPool.connect();
|
|
66
|
+
await testPool.close();
|
|
67
|
+
} catch (error) {
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async function connect(config) {
|
|
72
|
+
await disconnect();
|
|
73
|
+
const connectionConfig = typeof config === "string" ? parseConnectionString(config) : config;
|
|
74
|
+
const poolConfig = {
|
|
75
|
+
...connectionConfig,
|
|
76
|
+
connectionTimeout: 3e4,
|
|
77
|
+
// 30 seconds for connection
|
|
78
|
+
pool: {
|
|
79
|
+
max: 10,
|
|
80
|
+
min: 0,
|
|
81
|
+
idleTimeoutMillis: 3e4,
|
|
82
|
+
acquireTimeoutMillis: 3e4
|
|
83
|
+
},
|
|
84
|
+
options: {
|
|
85
|
+
...connectionConfig.options,
|
|
86
|
+
requestTimeout: 18e5
|
|
87
|
+
// 30 minutes for queries
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
pool = new sql.ConnectionPool(poolConfig);
|
|
91
|
+
try {
|
|
92
|
+
await pool.connect();
|
|
93
|
+
} catch (error) {
|
|
94
|
+
pool = null;
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async function disconnect() {
|
|
99
|
+
if (pool) {
|
|
100
|
+
try {
|
|
101
|
+
await pool.close();
|
|
102
|
+
} catch (error) {
|
|
103
|
+
}
|
|
104
|
+
pool = null;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function getConnection() {
|
|
108
|
+
return pool;
|
|
109
|
+
}
|
|
110
|
+
async function executeQuery(query, parameters, queryId) {
|
|
111
|
+
if (!pool || !pool.connected) {
|
|
112
|
+
throw new Error("Not connected to database");
|
|
113
|
+
}
|
|
114
|
+
const request = pool.request();
|
|
115
|
+
request.timeout = 18e5;
|
|
116
|
+
if (queryId) {
|
|
117
|
+
const { registerQuery, unregisterQuery } = await import("./queryCancellation-4CMKYTFU.js");
|
|
118
|
+
registerQuery(queryId, () => {
|
|
119
|
+
try {
|
|
120
|
+
request.cancel();
|
|
121
|
+
} catch (e) {
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
if (parameters) {
|
|
126
|
+
for (const param of parameters) {
|
|
127
|
+
if (param.type) {
|
|
128
|
+
request.input(param.name, param.type, param.value);
|
|
129
|
+
} else {
|
|
130
|
+
request.input(param.name, param.value);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
const result = await request.query(query);
|
|
136
|
+
if (queryId) {
|
|
137
|
+
const { unregisterQuery } = await import("./queryCancellation-4CMKYTFU.js");
|
|
138
|
+
unregisterQuery(queryId);
|
|
139
|
+
}
|
|
140
|
+
return result.recordset || [];
|
|
141
|
+
} catch (error) {
|
|
142
|
+
if (queryId) {
|
|
143
|
+
const { unregisterQuery } = await import("./queryCancellation-4CMKYTFU.js");
|
|
144
|
+
unregisterQuery(queryId);
|
|
145
|
+
}
|
|
146
|
+
if (error.code === "ECANCEL" || error.message?.includes("cancel")) {
|
|
147
|
+
const cancelError = new Error("Query was cancelled by user");
|
|
148
|
+
cancelError.code = "ECANCEL";
|
|
149
|
+
cancelError.cancelled = true;
|
|
150
|
+
throw cancelError;
|
|
151
|
+
}
|
|
152
|
+
if (error.code === "ETIMEOUT" || error.code === "ESOCKET" || error.message?.includes("timeout") || error.message?.includes("ETIMEDOUT")) {
|
|
153
|
+
const timeoutError = new Error("Query execution timeout. The query took too long to execute. Try disabling foreign key displays or reducing the page size.");
|
|
154
|
+
timeoutError.code = "ETIMEOUT";
|
|
155
|
+
timeoutError.originalError = error;
|
|
156
|
+
throw timeoutError;
|
|
157
|
+
}
|
|
158
|
+
throw error;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
async function executeQueryMultiple(query, parameters, queryId) {
|
|
162
|
+
if (!pool || !pool.connected) {
|
|
163
|
+
throw new Error("Not connected to database");
|
|
164
|
+
}
|
|
165
|
+
const request = pool.request();
|
|
166
|
+
request.timeout = 18e5;
|
|
167
|
+
if (queryId) {
|
|
168
|
+
const { registerQuery, unregisterQuery } = await import("./queryCancellation-4CMKYTFU.js");
|
|
169
|
+
registerQuery(queryId, () => {
|
|
170
|
+
try {
|
|
171
|
+
request.cancel();
|
|
172
|
+
} catch (e) {
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
if (parameters) {
|
|
177
|
+
for (const param of parameters) {
|
|
178
|
+
if (param.type) {
|
|
179
|
+
request.input(param.name, param.type, param.value);
|
|
180
|
+
} else {
|
|
181
|
+
request.input(param.name, param.value);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
try {
|
|
186
|
+
const result = await request.query(query);
|
|
187
|
+
const recordsets = result.recordsets || [];
|
|
188
|
+
const columnMetadata = [];
|
|
189
|
+
if (recordsets.length > 0) {
|
|
190
|
+
for (let index = 0; index < recordsets.length; index++) {
|
|
191
|
+
const recordset = recordsets[index];
|
|
192
|
+
if (recordset.length === 0) {
|
|
193
|
+
let columns = [];
|
|
194
|
+
const resultSet = index === 0 ? result.recordset : result.recordsets?.[index] || null;
|
|
195
|
+
if (resultSet) {
|
|
196
|
+
try {
|
|
197
|
+
const recordsetObj = resultSet;
|
|
198
|
+
if (recordsetObj.columns && typeof recordsetObj.columns === "object") {
|
|
199
|
+
columns = Object.keys(recordsetObj.columns);
|
|
200
|
+
} else if (recordsetObj.recordset && recordsetObj.recordset.columns) {
|
|
201
|
+
columns = Object.keys(recordsetObj.recordset.columns);
|
|
202
|
+
}
|
|
203
|
+
if (columns.length === 0 && result.recordset) {
|
|
204
|
+
if (index === 0 && result.recordset.columns) {
|
|
205
|
+
columns = Object.keys(result.recordset.columns);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
} catch (e) {
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (columns.length === 0) {
|
|
212
|
+
try {
|
|
213
|
+
const trimmedQuery = query.trim().toUpperCase();
|
|
214
|
+
if (trimmedQuery.startsWith("SELECT")) {
|
|
215
|
+
const metadataRequest = pool.request();
|
|
216
|
+
metadataRequest.timeout = 18e5;
|
|
217
|
+
let metadataQuery = query;
|
|
218
|
+
if (!trimmedQuery.match(/\bTOP\s+\d+/i)) {
|
|
219
|
+
metadataQuery = query.replace(/^(\s*SELECT\s+)(.*)$/i, "$1TOP 0 $2");
|
|
220
|
+
} else {
|
|
221
|
+
metadataQuery = query.replace(/\bTOP\s+\d+/i, "TOP 0");
|
|
222
|
+
}
|
|
223
|
+
const metadataResult = await metadataRequest.query(metadataQuery);
|
|
224
|
+
if (metadataResult.recordset) {
|
|
225
|
+
const metadataRecordset = metadataResult.recordset;
|
|
226
|
+
if (metadataRecordset.columns) {
|
|
227
|
+
columns = Object.keys(metadataRecordset.columns);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
} catch (metadataError) {
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
if (columns.length > 0) {
|
|
235
|
+
columnMetadata.push({ resultSetIndex: index, columns });
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
if (queryId) {
|
|
241
|
+
const { unregisterQuery } = await import("./queryCancellation-4CMKYTFU.js");
|
|
242
|
+
unregisterQuery(queryId);
|
|
243
|
+
}
|
|
244
|
+
return { recordsets, columnMetadata: columnMetadata.length > 0 ? columnMetadata : void 0 };
|
|
245
|
+
} catch (error) {
|
|
246
|
+
if (queryId) {
|
|
247
|
+
const { unregisterQuery } = await import("./queryCancellation-4CMKYTFU.js");
|
|
248
|
+
unregisterQuery(queryId);
|
|
249
|
+
}
|
|
250
|
+
if (error.code === "ECANCEL" || error.message?.includes("cancel")) {
|
|
251
|
+
const cancelError = new Error("Query was cancelled by user");
|
|
252
|
+
cancelError.code = "ECANCEL";
|
|
253
|
+
cancelError.cancelled = true;
|
|
254
|
+
throw cancelError;
|
|
255
|
+
}
|
|
256
|
+
if (error.code === "ETIMEOUT" || error.code === "ESOCKET" || error.message?.includes("timeout") || error.message?.includes("ETIMEDOUT")) {
|
|
257
|
+
const timeoutError = new Error("Query execution timeout. The query took too long to execute. Try simplifying your query or reducing the result set size.");
|
|
258
|
+
timeoutError.code = "ETIMEOUT";
|
|
259
|
+
timeoutError.originalError = error;
|
|
260
|
+
throw timeoutError;
|
|
261
|
+
}
|
|
262
|
+
throw error;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// src/server/db/postgres.ts
|
|
267
|
+
import { Pool } from "pg";
|
|
268
|
+
var pool2 = null;
|
|
269
|
+
function parseConnectionString2(connectionString) {
|
|
270
|
+
const config = {
|
|
271
|
+
server: "",
|
|
272
|
+
database: "",
|
|
273
|
+
options: {
|
|
274
|
+
ssl: false
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
if (connectionString.startsWith("postgresql://") || connectionString.startsWith("postgres://")) {
|
|
278
|
+
try {
|
|
279
|
+
const url = new URL(connectionString);
|
|
280
|
+
config.server = url.hostname;
|
|
281
|
+
config.database = url.pathname.slice(1);
|
|
282
|
+
config.user = url.username || void 0;
|
|
283
|
+
config.password = url.password || void 0;
|
|
284
|
+
config.port = url.port ? parseInt(url.port, 10) : 5432;
|
|
285
|
+
const sslMode = url.searchParams.get("sslmode");
|
|
286
|
+
if (sslMode === "require" || sslMode === "prefer") {
|
|
287
|
+
config.options.ssl = true;
|
|
288
|
+
} else if (sslMode === "disable") {
|
|
289
|
+
config.options.ssl = false;
|
|
290
|
+
}
|
|
291
|
+
return config;
|
|
292
|
+
} catch (error) {
|
|
293
|
+
throw new Error(`Invalid PostgreSQL connection string: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
const parts = connectionString.split(";");
|
|
297
|
+
for (const part of parts) {
|
|
298
|
+
const [key, ...valueParts] = part.split("=");
|
|
299
|
+
const value = valueParts.join("=").trim();
|
|
300
|
+
const keyLower = key.trim().toLowerCase();
|
|
301
|
+
switch (keyLower) {
|
|
302
|
+
case "host":
|
|
303
|
+
case "server":
|
|
304
|
+
case "data source":
|
|
305
|
+
config.server = value;
|
|
306
|
+
break;
|
|
307
|
+
case "database":
|
|
308
|
+
case "dbname":
|
|
309
|
+
config.database = value;
|
|
310
|
+
break;
|
|
311
|
+
case "user id":
|
|
312
|
+
case "userid":
|
|
313
|
+
case "uid":
|
|
314
|
+
case "user":
|
|
315
|
+
config.user = value;
|
|
316
|
+
break;
|
|
317
|
+
case "password":
|
|
318
|
+
case "pwd":
|
|
319
|
+
config.password = value;
|
|
320
|
+
break;
|
|
321
|
+
case "port":
|
|
322
|
+
config.port = parseInt(value, 10);
|
|
323
|
+
break;
|
|
324
|
+
case "sslmode":
|
|
325
|
+
case "ssl mode":
|
|
326
|
+
if (value.toLowerCase() === "require" || value.toLowerCase() === "prefer") {
|
|
327
|
+
config.options.ssl = true;
|
|
328
|
+
} else if (value.toLowerCase() === "disable") {
|
|
329
|
+
config.options.ssl = false;
|
|
330
|
+
}
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
return config;
|
|
335
|
+
}
|
|
336
|
+
async function testConnection2(config) {
|
|
337
|
+
const connectionConfig = typeof config === "string" ? parseConnectionString2(config) : config;
|
|
338
|
+
const testPool = new Pool({
|
|
339
|
+
host: connectionConfig.server,
|
|
340
|
+
port: connectionConfig.port || 5432,
|
|
341
|
+
database: connectionConfig.database,
|
|
342
|
+
user: connectionConfig.user,
|
|
343
|
+
password: connectionConfig.password,
|
|
344
|
+
ssl: connectionConfig.options?.ssl,
|
|
345
|
+
connectionTimeoutMillis: 1e4
|
|
346
|
+
});
|
|
347
|
+
try {
|
|
348
|
+
const client = await testPool.connect();
|
|
349
|
+
await client.release();
|
|
350
|
+
await testPool.end();
|
|
351
|
+
} catch (error) {
|
|
352
|
+
await testPool.end().catch(() => {
|
|
353
|
+
});
|
|
354
|
+
throw error;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
async function connect2(config) {
|
|
358
|
+
await disconnect2();
|
|
359
|
+
const connectionConfig = typeof config === "string" ? parseConnectionString2(config) : config;
|
|
360
|
+
pool2 = new Pool({
|
|
361
|
+
host: connectionConfig.server,
|
|
362
|
+
port: connectionConfig.port || 5432,
|
|
363
|
+
database: connectionConfig.database,
|
|
364
|
+
user: connectionConfig.user,
|
|
365
|
+
password: connectionConfig.password,
|
|
366
|
+
ssl: connectionConfig.options?.ssl,
|
|
367
|
+
max: 10,
|
|
368
|
+
idleTimeoutMillis: 3e4,
|
|
369
|
+
connectionTimeoutMillis: 3e4,
|
|
370
|
+
statement_timeout: 12e4
|
|
371
|
+
// 2 minutes for queries
|
|
372
|
+
});
|
|
373
|
+
try {
|
|
374
|
+
const client = await pool2.connect();
|
|
375
|
+
await client.release();
|
|
376
|
+
} catch (error) {
|
|
377
|
+
await pool2.end().catch(() => {
|
|
378
|
+
});
|
|
379
|
+
pool2 = null;
|
|
380
|
+
throw error;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
async function disconnect2() {
|
|
384
|
+
if (pool2) {
|
|
385
|
+
try {
|
|
386
|
+
await pool2.end();
|
|
387
|
+
} catch (error) {
|
|
388
|
+
}
|
|
389
|
+
pool2 = null;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
function getConnection2() {
|
|
393
|
+
return pool2;
|
|
394
|
+
}
|
|
395
|
+
function convertNamedParamsToPositional(query, parameters) {
|
|
396
|
+
if (!parameters || parameters.length === 0) {
|
|
397
|
+
return { query, values: [] };
|
|
398
|
+
}
|
|
399
|
+
const paramMap = /* @__PURE__ */ new Map();
|
|
400
|
+
parameters.forEach((param, index) => {
|
|
401
|
+
paramMap.set(param.name, { value: param.value, index: index + 1 });
|
|
402
|
+
});
|
|
403
|
+
const values = [];
|
|
404
|
+
let paramIndex = 1;
|
|
405
|
+
const convertedQuery = query.replace(/@(\w+)/g, (match, paramName) => {
|
|
406
|
+
const param = paramMap.get(paramName);
|
|
407
|
+
if (param) {
|
|
408
|
+
if (values[param.index - 1] === void 0) {
|
|
409
|
+
values[param.index - 1] = param.value;
|
|
410
|
+
}
|
|
411
|
+
return `$${param.index}`;
|
|
412
|
+
}
|
|
413
|
+
const newIndex = paramIndex++;
|
|
414
|
+
values[newIndex - 1] = void 0;
|
|
415
|
+
return `$${newIndex}`;
|
|
416
|
+
});
|
|
417
|
+
for (let i = 0; i < values.length; i++) {
|
|
418
|
+
if (values[i] === void 0) {
|
|
419
|
+
const param = parameters[i];
|
|
420
|
+
if (param) {
|
|
421
|
+
values[i] = param.value;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
return { query: convertedQuery, values };
|
|
426
|
+
}
|
|
427
|
+
async function executeQuery2(query, parameters) {
|
|
428
|
+
if (!pool2) {
|
|
429
|
+
throw new Error("Not connected to database");
|
|
430
|
+
}
|
|
431
|
+
try {
|
|
432
|
+
const { query: convertedQuery, values } = convertNamedParamsToPositional(query, parameters || []);
|
|
433
|
+
const result = await pool2.query(convertedQuery, values);
|
|
434
|
+
return result.rows || [];
|
|
435
|
+
} catch (error) {
|
|
436
|
+
if (error.code === "ETIMEOUT" || error.code === "57014" || error.message?.includes("timeout") || error.message?.includes("canceling statement")) {
|
|
437
|
+
const timeoutError = new Error("Query execution timeout. The query took too long to execute. Try disabling foreign key displays or reducing the page size.");
|
|
438
|
+
timeoutError.code = "ETIMEOUT";
|
|
439
|
+
timeoutError.originalError = error;
|
|
440
|
+
throw timeoutError;
|
|
441
|
+
}
|
|
442
|
+
throw error;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
async function executeQueryMultiple2(query, parameters) {
|
|
446
|
+
if (!pool2) {
|
|
447
|
+
throw new Error("Not connected to database");
|
|
448
|
+
}
|
|
449
|
+
try {
|
|
450
|
+
const queries = query.split(";").map((q) => q.trim()).filter((q) => q.length > 0);
|
|
451
|
+
if (queries.length === 0) {
|
|
452
|
+
return { recordsets: [], columnMetadata: void 0 };
|
|
453
|
+
}
|
|
454
|
+
const { query: convertedQuery, values } = convertNamedParamsToPositional(queries[0], parameters || []);
|
|
455
|
+
const result = await pool2.query(convertedQuery, values);
|
|
456
|
+
const recordsets = [result.rows || []];
|
|
457
|
+
const columnMetadata = [];
|
|
458
|
+
if (result.rows.length === 0 && result.fields) {
|
|
459
|
+
const columns = result.fields.map((field) => field.name);
|
|
460
|
+
if (columns.length > 0) {
|
|
461
|
+
columnMetadata.push({ resultSetIndex: 0, columns });
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
return {
|
|
465
|
+
recordsets,
|
|
466
|
+
columnMetadata: columnMetadata.length > 0 ? columnMetadata : void 0
|
|
467
|
+
};
|
|
468
|
+
} catch (error) {
|
|
469
|
+
if (error.code === "ETIMEOUT" || error.code === "57014" || error.message?.includes("timeout") || error.message?.includes("canceling statement")) {
|
|
470
|
+
const timeoutError = new Error("Query execution timeout. The query took too long to execute. Try simplifying your query or reducing the result set size.");
|
|
471
|
+
timeoutError.code = "ETIMEOUT";
|
|
472
|
+
timeoutError.originalError = error;
|
|
473
|
+
throw timeoutError;
|
|
474
|
+
}
|
|
475
|
+
throw error;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
// src/server/db/index.ts
|
|
480
|
+
var currentDbType = "mssql";
|
|
481
|
+
function detectDbType(connectionString) {
|
|
482
|
+
if (!connectionString) {
|
|
483
|
+
return "mssql";
|
|
484
|
+
}
|
|
485
|
+
const trimmed = connectionString.trim();
|
|
486
|
+
if (trimmed.startsWith("postgresql://") || trimmed.startsWith("postgres://")) {
|
|
487
|
+
return "postgres";
|
|
488
|
+
}
|
|
489
|
+
return "mssql";
|
|
490
|
+
}
|
|
491
|
+
function getDbType() {
|
|
492
|
+
return currentDbType;
|
|
493
|
+
}
|
|
494
|
+
function setDbType(type) {
|
|
495
|
+
currentDbType = type;
|
|
496
|
+
}
|
|
497
|
+
var mssqlDialect = {
|
|
498
|
+
quoteId(name) {
|
|
499
|
+
return `[${name}]`;
|
|
500
|
+
},
|
|
501
|
+
param(index) {
|
|
502
|
+
return `@p${index}`;
|
|
503
|
+
},
|
|
504
|
+
limitOffset(offset, limit) {
|
|
505
|
+
return `OFFSET ${offset} ROWS FETCH NEXT ${limit} ROWS ONLY`;
|
|
506
|
+
},
|
|
507
|
+
topN(n) {
|
|
508
|
+
return `TOP ${n}`;
|
|
509
|
+
},
|
|
510
|
+
currentDbQuery() {
|
|
511
|
+
return `SELECT DB_NAME() as databaseName`;
|
|
512
|
+
},
|
|
513
|
+
castToDate(expr) {
|
|
514
|
+
return `CAST(${expr} AS DATE)`;
|
|
515
|
+
},
|
|
516
|
+
tryCastToNVarChar(expr) {
|
|
517
|
+
return `TRY_CAST(${expr} AS NVARCHAR(4000))`;
|
|
518
|
+
}
|
|
519
|
+
};
|
|
520
|
+
var postgresDialect = {
|
|
521
|
+
quoteId(name) {
|
|
522
|
+
return `"${name}"`;
|
|
523
|
+
},
|
|
524
|
+
param(index) {
|
|
525
|
+
return `@p${index}`;
|
|
526
|
+
},
|
|
527
|
+
limitOffset(offset, limit) {
|
|
528
|
+
return `LIMIT ${limit} OFFSET ${offset}`;
|
|
529
|
+
},
|
|
530
|
+
topN(n) {
|
|
531
|
+
return "";
|
|
532
|
+
},
|
|
533
|
+
currentDbQuery() {
|
|
534
|
+
return `SELECT current_database() as "databaseName"`;
|
|
535
|
+
},
|
|
536
|
+
castToDate(expr) {
|
|
537
|
+
return `CAST(${expr} AS DATE)`;
|
|
538
|
+
},
|
|
539
|
+
tryCastToNVarChar(expr) {
|
|
540
|
+
return `CAST(${expr} AS TEXT)`;
|
|
541
|
+
}
|
|
542
|
+
};
|
|
543
|
+
function getDialect() {
|
|
544
|
+
return currentDbType === "postgres" ? postgresDialect : mssqlDialect;
|
|
545
|
+
}
|
|
546
|
+
async function testConnection3(config) {
|
|
547
|
+
if (typeof config === "string") {
|
|
548
|
+
const dbType = detectDbType(config);
|
|
549
|
+
if (dbType === "postgres") {
|
|
550
|
+
return testConnection2(config);
|
|
551
|
+
} else {
|
|
552
|
+
return testConnection(config);
|
|
553
|
+
}
|
|
554
|
+
} else {
|
|
555
|
+
if (currentDbType === "postgres") {
|
|
556
|
+
return testConnection2(config);
|
|
557
|
+
} else {
|
|
558
|
+
return testConnection(config);
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
async function connect3(config) {
|
|
563
|
+
if (typeof config === "string") {
|
|
564
|
+
const dbType = detectDbType(config);
|
|
565
|
+
setDbType(dbType);
|
|
566
|
+
if (dbType === "postgres") {
|
|
567
|
+
return connect2(config);
|
|
568
|
+
} else {
|
|
569
|
+
return connect(config);
|
|
570
|
+
}
|
|
571
|
+
} else {
|
|
572
|
+
if (currentDbType === "postgres") {
|
|
573
|
+
return connect2(config);
|
|
574
|
+
} else {
|
|
575
|
+
return connect(config);
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
async function disconnect3() {
|
|
580
|
+
if (currentDbType === "postgres") {
|
|
581
|
+
return disconnect2();
|
|
582
|
+
} else {
|
|
583
|
+
return disconnect();
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
function getConnection3() {
|
|
587
|
+
if (currentDbType === "postgres") {
|
|
588
|
+
return getConnection2();
|
|
589
|
+
} else {
|
|
590
|
+
return getConnection();
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
async function executeQuery3(query, parameters) {
|
|
594
|
+
if (currentDbType === "postgres") {
|
|
595
|
+
return executeQuery2(query, parameters);
|
|
596
|
+
} else {
|
|
597
|
+
return executeQuery(query, parameters);
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
async function executeQueryMultiple3(query, parameters) {
|
|
601
|
+
if (currentDbType === "postgres") {
|
|
602
|
+
return executeQueryMultiple2(query, parameters);
|
|
603
|
+
} else {
|
|
604
|
+
return executeQueryMultiple(query, parameters);
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
function parseConnectionString3(connectionString) {
|
|
608
|
+
const dbType = detectDbType(connectionString);
|
|
609
|
+
if (dbType === "postgres") {
|
|
610
|
+
return parseConnectionString2(connectionString);
|
|
611
|
+
} else {
|
|
612
|
+
return parseConnectionString(connectionString);
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
export {
|
|
617
|
+
detectDbType,
|
|
618
|
+
getDbType,
|
|
619
|
+
setDbType,
|
|
620
|
+
getDialect,
|
|
621
|
+
testConnection3 as testConnection,
|
|
622
|
+
connect3 as connect,
|
|
623
|
+
disconnect3 as disconnect,
|
|
624
|
+
getConnection3 as getConnection,
|
|
625
|
+
executeQuery3 as executeQuery,
|
|
626
|
+
executeQueryMultiple3 as executeQueryMultiple,
|
|
627
|
+
parseConnectionString3 as parseConnectionString
|
|
628
|
+
};
|