datapeek 0.1.15 → 0.1.17

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 (50) hide show
  1. package/dist/cli/chunk-25W7DLJU.js +763 -0
  2. package/dist/cli/chunk-4ZTTGN4K.js +772 -0
  3. package/dist/cli/chunk-ACJCJE4M.js +728 -0
  4. package/dist/cli/chunk-AZZM4KI4.js +748 -0
  5. package/dist/cli/chunk-B5ENJPHN.js +726 -0
  6. package/dist/cli/chunk-D6TUHXVK.js +726 -0
  7. package/dist/cli/chunk-N4ZN35TN.js +753 -0
  8. package/dist/cli/chunk-NT7RKOGB.js +736 -0
  9. package/dist/cli/chunk-Q3ZM5P6B.js +713 -0
  10. package/dist/cli/chunk-TYOF4OPP.js +725 -0
  11. package/dist/cli/db-2XNNFT6D.js +36 -0
  12. package/dist/cli/db-DF2EYIGH.js +36 -0
  13. package/dist/cli/db-DUN4MAAS.js +36 -0
  14. package/dist/cli/db-ETWHJA2O.js +36 -0
  15. package/dist/cli/db-G3OUYANY.js +36 -0
  16. package/dist/cli/db-GII5HVII.js +36 -0
  17. package/dist/cli/db-J26NBD6Q.js +34 -0
  18. package/dist/cli/db-PLHJBMIE.js +36 -0
  19. package/dist/cli/db-PQSXQQER.js +36 -0
  20. package/dist/cli/db-UXHWQZEH.js +36 -0
  21. package/dist/cli/dev.js +61 -13
  22. package/dist/cli/index.js +61 -13
  23. package/dist/client/assets/index-BvCSgDQI.css +1 -0
  24. package/dist/client/assets/index-k-JqbRd3.js +395 -0
  25. package/dist/client/index.html +2 -2
  26. package/dist/server/chunk-AMDULVT7.js +723 -0
  27. package/dist/server/chunk-FUD3HYYO.js +750 -0
  28. package/dist/server/chunk-ICJJTM6H.js +745 -0
  29. package/dist/server/chunk-IFTGVLYX.js +760 -0
  30. package/dist/server/chunk-J4S2WZCU.js +733 -0
  31. package/dist/server/chunk-MS2MQHXD.js +723 -0
  32. package/dist/server/chunk-N6J45PJ6.js +710 -0
  33. package/dist/server/chunk-U3PBIJYP.js +725 -0
  34. package/dist/server/chunk-VTBMBBQX.js +769 -0
  35. package/dist/server/chunk-ZMTC5GW4.js +722 -0
  36. package/dist/server/db-737AZNBF.js +34 -0
  37. package/dist/server/db-AASKOPPI.js +32 -0
  38. package/dist/server/db-ELL5GJQG.js +34 -0
  39. package/dist/server/db-GM7OCOES.js +34 -0
  40. package/dist/server/db-P6KUHD2Z.js +34 -0
  41. package/dist/server/db-QCCVQUMG.js +34 -0
  42. package/dist/server/db-SHAIVNT5.js +34 -0
  43. package/dist/server/db-T5GG3OX4.js +34 -0
  44. package/dist/server/db-TN4IWAPG.js +34 -0
  45. package/dist/server/db-ZEV3LCJM.js +34 -0
  46. package/dist/server/dev.js +61 -13
  47. package/dist/server/index.js +61 -13
  48. package/package.json +1 -1
  49. package/dist/client/assets/index-C0Gnjc5g.css +0 -1
  50. package/dist/client/assets/index-CPRX2vzW.js +0 -390
@@ -0,0 +1,763 @@
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-E5O4FBUY.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-E5O4FBUY.js");
138
+ unregisterQuery(queryId);
139
+ }
140
+ return result.recordset || [];
141
+ } catch (error) {
142
+ if (queryId) {
143
+ const { unregisterQuery } = await import("./queryCancellation-E5O4FBUY.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
+ const messages = [];
167
+ request.timeout = 18e5;
168
+ request.on("info", (info) => {
169
+ const message = typeof info?.message === "string" ? info.message : String(info ?? "");
170
+ if (!message.trim()) return;
171
+ messages.push({ type: "info", message });
172
+ });
173
+ if (queryId) {
174
+ const { registerQuery, unregisterQuery } = await import("./queryCancellation-E5O4FBUY.js");
175
+ registerQuery(queryId, () => {
176
+ try {
177
+ request.cancel();
178
+ } catch (e) {
179
+ }
180
+ });
181
+ }
182
+ if (parameters) {
183
+ for (const param of parameters) {
184
+ if (param.type) {
185
+ request.input(param.name, param.type, param.value);
186
+ } else {
187
+ request.input(param.name, param.value);
188
+ }
189
+ }
190
+ }
191
+ try {
192
+ const result = await request.query(query);
193
+ const recordsets = result.recordsets || [];
194
+ const rowsAffected = Array.isArray(result.rowsAffected) ? result.rowsAffected : [];
195
+ const columnMetadata = [];
196
+ if (recordsets.length > 0) {
197
+ for (let index = 0; index < recordsets.length; index++) {
198
+ const recordset = recordsets[index];
199
+ if (recordset.length === 0) {
200
+ let columns = [];
201
+ const resultSet = index === 0 ? result.recordset : result.recordsets?.[index] || null;
202
+ if (resultSet) {
203
+ try {
204
+ const recordsetObj = resultSet;
205
+ if (recordsetObj.columns && typeof recordsetObj.columns === "object") {
206
+ columns = Object.keys(recordsetObj.columns);
207
+ } else if (recordsetObj.recordset && recordsetObj.recordset.columns) {
208
+ columns = Object.keys(recordsetObj.recordset.columns);
209
+ }
210
+ if (columns.length === 0 && result.recordset) {
211
+ if (index === 0 && result.recordset.columns) {
212
+ columns = Object.keys(result.recordset.columns);
213
+ }
214
+ }
215
+ } catch (e) {
216
+ }
217
+ }
218
+ if (columns.length === 0) {
219
+ try {
220
+ const trimmedQuery = query.trim().toUpperCase();
221
+ if (trimmedQuery.startsWith("SELECT")) {
222
+ const metadataRequest = pool.request();
223
+ metadataRequest.timeout = 18e5;
224
+ let metadataQuery = query;
225
+ if (!trimmedQuery.match(/\bTOP\s+\d+/i)) {
226
+ metadataQuery = query.replace(/^(\s*SELECT\s+)(.*)$/i, "$1TOP 0 $2");
227
+ } else {
228
+ metadataQuery = query.replace(/\bTOP\s+\d+/i, "TOP 0");
229
+ }
230
+ const metadataResult = await metadataRequest.query(metadataQuery);
231
+ if (metadataResult.recordset) {
232
+ const metadataRecordset = metadataResult.recordset;
233
+ if (metadataRecordset.columns) {
234
+ columns = Object.keys(metadataRecordset.columns);
235
+ }
236
+ }
237
+ }
238
+ } catch (metadataError) {
239
+ }
240
+ }
241
+ if (columns.length > 0) {
242
+ columnMetadata.push({ resultSetIndex: index, columns });
243
+ }
244
+ }
245
+ }
246
+ }
247
+ if (queryId) {
248
+ const { unregisterQuery } = await import("./queryCancellation-E5O4FBUY.js");
249
+ unregisterQuery(queryId);
250
+ }
251
+ const rowCountMessages = rowsAffected.map((count) => ({
252
+ type: "info",
253
+ message: `(${count} ${count === 1 ? "row" : "rows"} affected)`
254
+ }));
255
+ const combinedMessages = [...messages, ...rowCountMessages];
256
+ return {
257
+ recordsets,
258
+ columnMetadata: columnMetadata.length > 0 ? columnMetadata : void 0,
259
+ messages: combinedMessages.length > 0 ? combinedMessages : void 0
260
+ };
261
+ } catch (error) {
262
+ if (messages.length > 0) {
263
+ error.messages = messages;
264
+ }
265
+ if (queryId) {
266
+ const { unregisterQuery } = await import("./queryCancellation-E5O4FBUY.js");
267
+ unregisterQuery(queryId);
268
+ }
269
+ if (error.code === "ECANCEL" || error.message?.includes("cancel")) {
270
+ const cancelError = new Error("Query was cancelled by user");
271
+ cancelError.code = "ECANCEL";
272
+ cancelError.cancelled = true;
273
+ if (messages.length > 0) {
274
+ cancelError.messages = messages;
275
+ }
276
+ throw cancelError;
277
+ }
278
+ if (error.code === "ETIMEOUT" || error.code === "ESOCKET" || error.message?.includes("timeout") || error.message?.includes("ETIMEDOUT")) {
279
+ const timeoutError = new Error("Query execution timeout. The query took too long to execute. Try simplifying your query or reducing the result set size.");
280
+ timeoutError.code = "ETIMEOUT";
281
+ timeoutError.originalError = error;
282
+ if (messages.length > 0) {
283
+ timeoutError.messages = messages;
284
+ }
285
+ throw timeoutError;
286
+ }
287
+ throw error;
288
+ }
289
+ }
290
+
291
+ // src/server/db/postgres.ts
292
+ import { Pool } from "pg";
293
+ var pool2 = null;
294
+ function parseConnectionString2(connectionString) {
295
+ const config = {
296
+ server: "",
297
+ database: "",
298
+ options: {
299
+ ssl: false
300
+ }
301
+ };
302
+ if (connectionString.startsWith("postgresql://") || connectionString.startsWith("postgres://")) {
303
+ try {
304
+ const url = new URL(connectionString);
305
+ config.server = url.hostname;
306
+ config.database = url.pathname.slice(1);
307
+ config.user = url.username || void 0;
308
+ config.password = url.password || void 0;
309
+ config.port = url.port ? parseInt(url.port, 10) : 5432;
310
+ const sslMode = url.searchParams.get("sslmode");
311
+ if (sslMode === "require" || sslMode === "prefer") {
312
+ config.options.ssl = true;
313
+ } else if (sslMode === "disable") {
314
+ config.options.ssl = false;
315
+ }
316
+ return config;
317
+ } catch (error) {
318
+ throw new Error(`Invalid PostgreSQL connection string: ${error instanceof Error ? error.message : "Unknown error"}`);
319
+ }
320
+ }
321
+ const parts = connectionString.split(";");
322
+ for (const part of parts) {
323
+ const [key, ...valueParts] = part.split("=");
324
+ const value = valueParts.join("=").trim();
325
+ const keyLower = key.trim().toLowerCase();
326
+ switch (keyLower) {
327
+ case "host":
328
+ case "server":
329
+ case "data source":
330
+ config.server = value;
331
+ break;
332
+ case "database":
333
+ case "dbname":
334
+ config.database = value;
335
+ break;
336
+ case "user id":
337
+ case "userid":
338
+ case "uid":
339
+ case "user":
340
+ config.user = value;
341
+ break;
342
+ case "password":
343
+ case "pwd":
344
+ config.password = value;
345
+ break;
346
+ case "port":
347
+ config.port = parseInt(value, 10);
348
+ break;
349
+ case "sslmode":
350
+ case "ssl mode":
351
+ if (value.toLowerCase() === "require" || value.toLowerCase() === "prefer") {
352
+ config.options.ssl = true;
353
+ } else if (value.toLowerCase() === "disable") {
354
+ config.options.ssl = false;
355
+ }
356
+ break;
357
+ }
358
+ }
359
+ return config;
360
+ }
361
+ async function testConnection2(config) {
362
+ const connectionConfig = typeof config === "string" ? parseConnectionString2(config) : config;
363
+ const testPool = new Pool({
364
+ host: connectionConfig.server,
365
+ port: connectionConfig.port || 5432,
366
+ database: connectionConfig.database,
367
+ user: connectionConfig.user,
368
+ password: connectionConfig.password,
369
+ ssl: connectionConfig.options?.ssl,
370
+ connectionTimeoutMillis: 3e4
371
+ });
372
+ try {
373
+ const client = await testPool.connect();
374
+ await client.release();
375
+ await testPool.end();
376
+ } catch (error) {
377
+ await testPool.end().catch(() => {
378
+ });
379
+ throw error;
380
+ }
381
+ }
382
+ async function connect2(config) {
383
+ await disconnect2();
384
+ const connectionConfig = typeof config === "string" ? parseConnectionString2(config) : config;
385
+ pool2 = new Pool({
386
+ host: connectionConfig.server,
387
+ port: connectionConfig.port || 5432,
388
+ database: connectionConfig.database,
389
+ user: connectionConfig.user,
390
+ password: connectionConfig.password,
391
+ ssl: connectionConfig.options?.ssl,
392
+ max: 10,
393
+ idleTimeoutMillis: 3e4,
394
+ connectionTimeoutMillis: 3e4,
395
+ statement_timeout: 18e5
396
+ // 30 minutes for queries
397
+ });
398
+ try {
399
+ const client = await pool2.connect();
400
+ await client.release();
401
+ } catch (error) {
402
+ await pool2.end().catch(() => {
403
+ });
404
+ pool2 = null;
405
+ throw error;
406
+ }
407
+ }
408
+ async function disconnect2() {
409
+ if (pool2) {
410
+ try {
411
+ await pool2.end();
412
+ } catch (error) {
413
+ }
414
+ pool2 = null;
415
+ }
416
+ }
417
+ function getConnection2() {
418
+ return pool2;
419
+ }
420
+ function convertNamedParamsToPositional(query, parameters) {
421
+ if (!parameters || parameters.length === 0) {
422
+ return { query, values: [] };
423
+ }
424
+ const paramMap = /* @__PURE__ */ new Map();
425
+ parameters.forEach((param, index) => {
426
+ paramMap.set(param.name, { value: param.value, index: index + 1 });
427
+ });
428
+ const values = [];
429
+ let paramIndex = 1;
430
+ const convertedQuery = query.replace(/@(\w+)/g, (match, paramName) => {
431
+ const param = paramMap.get(paramName);
432
+ if (param) {
433
+ if (values[param.index - 1] === void 0) {
434
+ values[param.index - 1] = param.value;
435
+ }
436
+ return `$${param.index}`;
437
+ }
438
+ const newIndex = paramIndex++;
439
+ values[newIndex - 1] = void 0;
440
+ return `$${newIndex}`;
441
+ });
442
+ for (let i = 0; i < values.length; i++) {
443
+ if (values[i] === void 0) {
444
+ const param = parameters[i];
445
+ if (param) {
446
+ values[i] = param.value;
447
+ }
448
+ }
449
+ }
450
+ return { query: convertedQuery, values };
451
+ }
452
+ async function executeQuery2(query, parameters, queryId) {
453
+ if (!pool2) {
454
+ throw new Error("Not connected to database");
455
+ }
456
+ let client = null;
457
+ try {
458
+ if (queryId) {
459
+ client = await pool2.connect();
460
+ }
461
+ const { query: convertedQuery, values } = convertNamedParamsToPositional(query, parameters || []);
462
+ let cancelClient = null;
463
+ if (queryId && client) {
464
+ const { registerQuery, unregisterQuery } = await import("./queryCancellation-E5O4FBUY.js");
465
+ cancelClient = await pool2.connect();
466
+ registerQuery(queryId, async () => {
467
+ try {
468
+ if (cancelClient && client) {
469
+ const pidResult = await client.query("SELECT pg_backend_pid() as pid");
470
+ const pid = pidResult.rows[0]?.pid;
471
+ if (pid) {
472
+ await cancelClient.query(`SELECT pg_cancel_backend(${pid})`);
473
+ }
474
+ }
475
+ } catch (e) {
476
+ }
477
+ });
478
+ }
479
+ const queryPromise = client ? client.query(convertedQuery, values) : pool2.query(convertedQuery, values);
480
+ const result = await queryPromise;
481
+ if (cancelClient) {
482
+ cancelClient.release();
483
+ }
484
+ if (queryId) {
485
+ const { unregisterQuery } = await import("./queryCancellation-E5O4FBUY.js");
486
+ unregisterQuery(queryId);
487
+ }
488
+ return result.rows || [];
489
+ } catch (error) {
490
+ if (queryId) {
491
+ const { unregisterQuery } = await import("./queryCancellation-E5O4FBUY.js");
492
+ unregisterQuery(queryId);
493
+ }
494
+ if (error.code === "57014" || error.message?.includes("canceling statement") || error.message?.includes("cancelled")) {
495
+ const cancelError = new Error("Query was cancelled by user");
496
+ cancelError.code = "ECANCEL";
497
+ cancelError.cancelled = true;
498
+ throw cancelError;
499
+ }
500
+ if (error.code === "ETIMEOUT" || error.code === "57014" || error.message?.includes("timeout") || error.message?.includes("canceling statement")) {
501
+ const timeoutError = new Error("Query execution timeout. The query took too long to execute. Try disabling foreign key displays or reducing the page size.");
502
+ timeoutError.code = "ETIMEOUT";
503
+ timeoutError.originalError = error;
504
+ throw timeoutError;
505
+ }
506
+ throw error;
507
+ } finally {
508
+ if (client) {
509
+ client.release();
510
+ }
511
+ }
512
+ }
513
+ async function executeQueryMultiple2(query, parameters, queryId) {
514
+ if (!pool2) {
515
+ throw new Error("Not connected to database");
516
+ }
517
+ let client = null;
518
+ let noticeHandler = null;
519
+ const messages = [];
520
+ try {
521
+ client = await pool2.connect();
522
+ noticeHandler = (notice) => {
523
+ const message = typeof notice?.message === "string" ? notice.message : String(notice ?? "");
524
+ if (!message.trim()) return;
525
+ const severity = String(notice?.severity || "").toUpperCase();
526
+ const type = severity.includes("ERROR") ? "error" : severity.includes("WARNING") ? "warning" : "info";
527
+ messages.push({ type, message });
528
+ };
529
+ client.on("notice", noticeHandler);
530
+ const queries = query.split(";").map((q) => q.trim()).filter((q) => q.length > 0);
531
+ if (queries.length === 0) {
532
+ return { recordsets: [], columnMetadata: void 0 };
533
+ }
534
+ const { query: convertedQuery, values } = convertNamedParamsToPositional(queries[0], parameters || []);
535
+ let cancelClient = null;
536
+ if (queryId && client) {
537
+ const { registerQuery, unregisterQuery } = await import("./queryCancellation-E5O4FBUY.js");
538
+ cancelClient = await pool2.connect();
539
+ registerQuery(queryId, async () => {
540
+ try {
541
+ if (cancelClient && client) {
542
+ const pidResult = await client.query("SELECT pg_backend_pid() as pid");
543
+ const pid = pidResult.rows[0]?.pid;
544
+ if (pid) {
545
+ await cancelClient.query(`SELECT pg_cancel_backend(${pid})`);
546
+ }
547
+ }
548
+ } catch (e) {
549
+ }
550
+ });
551
+ }
552
+ const result = await client.query(convertedQuery, values);
553
+ if (cancelClient) {
554
+ cancelClient.release();
555
+ }
556
+ if (queryId) {
557
+ const { unregisterQuery } = await import("./queryCancellation-E5O4FBUY.js");
558
+ unregisterQuery(queryId);
559
+ }
560
+ const recordsets = [result.rows || []];
561
+ const columnMetadata = [];
562
+ if (result.rows.length === 0 && result.fields) {
563
+ const columns = result.fields.map((field) => field.name);
564
+ if (columns.length > 0) {
565
+ columnMetadata.push({ resultSetIndex: 0, columns });
566
+ }
567
+ }
568
+ return {
569
+ recordsets,
570
+ columnMetadata: columnMetadata.length > 0 ? columnMetadata : void 0,
571
+ messages: messages.length > 0 ? messages : void 0
572
+ };
573
+ } catch (error) {
574
+ if (queryId) {
575
+ const { unregisterQuery } = await import("./queryCancellation-E5O4FBUY.js");
576
+ unregisterQuery(queryId);
577
+ }
578
+ if (error.code === "57014" || error.message?.includes("canceling statement") || error.message?.includes("cancelled")) {
579
+ const cancelError = new Error("Query was cancelled by user");
580
+ cancelError.code = "ECANCEL";
581
+ cancelError.cancelled = true;
582
+ throw cancelError;
583
+ }
584
+ if (error.code === "ETIMEOUT" || error.code === "57014" || error.message?.includes("timeout") || error.message?.includes("canceling statement")) {
585
+ const timeoutError = new Error("Query execution timeout. The query took too long to execute. Try simplifying your query or reducing the result set size.");
586
+ timeoutError.code = "ETIMEOUT";
587
+ timeoutError.originalError = error;
588
+ throw timeoutError;
589
+ }
590
+ throw error;
591
+ } finally {
592
+ if (client) {
593
+ if (noticeHandler) {
594
+ client.off("notice", noticeHandler);
595
+ }
596
+ client.release();
597
+ }
598
+ }
599
+ }
600
+
601
+ // src/server/db/index.ts
602
+ var currentDbType = "mssql";
603
+ var currentConnectionConfig = null;
604
+ function detectDbType(connectionString) {
605
+ if (!connectionString) {
606
+ return "mssql";
607
+ }
608
+ const trimmed = connectionString.trim();
609
+ if (trimmed.startsWith("postgresql://") || trimmed.startsWith("postgres://")) {
610
+ return "postgres";
611
+ }
612
+ return "mssql";
613
+ }
614
+ function getDbType() {
615
+ return currentDbType;
616
+ }
617
+ function setDbType(type) {
618
+ currentDbType = type;
619
+ }
620
+ var mssqlDialect = {
621
+ quoteId(name) {
622
+ return `[${name}]`;
623
+ },
624
+ param(index) {
625
+ return `@p${index}`;
626
+ },
627
+ limitOffset(offset, limit) {
628
+ return `OFFSET ${offset} ROWS FETCH NEXT ${limit} ROWS ONLY`;
629
+ },
630
+ topN(n) {
631
+ return `TOP ${n}`;
632
+ },
633
+ currentDbQuery() {
634
+ return `SELECT DB_NAME() as databaseName`;
635
+ },
636
+ castToDate(expr) {
637
+ return `CAST(${expr} AS DATE)`;
638
+ },
639
+ tryCastToNVarChar(expr) {
640
+ return `TRY_CAST(${expr} AS NVARCHAR(4000))`;
641
+ }
642
+ };
643
+ var postgresDialect = {
644
+ quoteId(name) {
645
+ return `"${name}"`;
646
+ },
647
+ param(index) {
648
+ return `@p${index}`;
649
+ },
650
+ limitOffset(offset, limit) {
651
+ return `LIMIT ${limit} OFFSET ${offset}`;
652
+ },
653
+ topN(n) {
654
+ return "";
655
+ },
656
+ currentDbQuery() {
657
+ return `SELECT current_database() as "databaseName"`;
658
+ },
659
+ castToDate(expr) {
660
+ return `CAST(${expr} AS DATE)`;
661
+ },
662
+ tryCastToNVarChar(expr) {
663
+ return `CAST(${expr} AS TEXT)`;
664
+ }
665
+ };
666
+ function getDialect() {
667
+ return currentDbType === "postgres" ? postgresDialect : mssqlDialect;
668
+ }
669
+ async function testConnection3(config) {
670
+ if (typeof config === "string") {
671
+ const dbType = detectDbType(config);
672
+ if (dbType === "postgres") {
673
+ return testConnection2(config);
674
+ } else {
675
+ return testConnection(config);
676
+ }
677
+ } else {
678
+ if (currentDbType === "postgres") {
679
+ return testConnection2(config);
680
+ } else {
681
+ return testConnection(config);
682
+ }
683
+ }
684
+ }
685
+ async function connect3(config) {
686
+ const connectionConfig = typeof config === "string" ? parseConnectionString3(config) : config;
687
+ const dbType = typeof config === "string" ? detectDbType(config) : config.dbType || currentDbType;
688
+ if (typeof config === "string") {
689
+ setDbType(dbType);
690
+ if (dbType === "postgres") {
691
+ await connect2(config);
692
+ } else {
693
+ await connect(config);
694
+ }
695
+ } else {
696
+ if (config.dbType) setDbType(config.dbType);
697
+ if (currentDbType === "postgres") {
698
+ await connect2(config);
699
+ } else {
700
+ await connect(config);
701
+ }
702
+ }
703
+ currentConnectionConfig = {
704
+ server: connectionConfig.server,
705
+ database: connectionConfig.database,
706
+ dbType: currentDbType
707
+ };
708
+ }
709
+ function getConnectionConfig() {
710
+ return currentConnectionConfig;
711
+ }
712
+ async function disconnect3() {
713
+ currentConnectionConfig = null;
714
+ if (currentDbType === "postgres") {
715
+ return disconnect2();
716
+ } else {
717
+ return disconnect();
718
+ }
719
+ }
720
+ function getConnection3() {
721
+ if (currentDbType === "postgres") {
722
+ return getConnection2();
723
+ } else {
724
+ return getConnection();
725
+ }
726
+ }
727
+ async function executeQuery3(query, parameters, queryId) {
728
+ if (currentDbType === "postgres") {
729
+ return executeQuery2(query, parameters, queryId);
730
+ } else {
731
+ return executeQuery(query, parameters, queryId);
732
+ }
733
+ }
734
+ async function executeQueryMultiple3(query, parameters, queryId) {
735
+ if (currentDbType === "postgres") {
736
+ return executeQueryMultiple2(query, parameters, queryId);
737
+ } else {
738
+ return executeQueryMultiple(query, parameters, queryId);
739
+ }
740
+ }
741
+ function parseConnectionString3(connectionString) {
742
+ const dbType = detectDbType(connectionString);
743
+ if (dbType === "postgres") {
744
+ return parseConnectionString2(connectionString);
745
+ } else {
746
+ return parseConnectionString(connectionString);
747
+ }
748
+ }
749
+
750
+ export {
751
+ detectDbType,
752
+ getDbType,
753
+ setDbType,
754
+ getDialect,
755
+ testConnection3 as testConnection,
756
+ connect3 as connect,
757
+ getConnectionConfig,
758
+ disconnect3 as disconnect,
759
+ getConnection3 as getConnection,
760
+ executeQuery3 as executeQuery,
761
+ executeQueryMultiple3 as executeQueryMultiple,
762
+ parseConnectionString3 as parseConnectionString
763
+ };