mcp-database-inspector 2.0.1

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 (105) hide show
  1. package/README.md +197 -0
  2. package/dist/database/connection.d.ts +13 -0
  3. package/dist/database/connection.d.ts.map +1 -0
  4. package/dist/database/connection.js +155 -0
  5. package/dist/database/connection.js.map +1 -0
  6. package/dist/database/manager.d.ts +28 -0
  7. package/dist/database/manager.d.ts.map +1 -0
  8. package/dist/database/manager.js +621 -0
  9. package/dist/database/manager.js.map +1 -0
  10. package/dist/database/postgres-connection.d.ts +10 -0
  11. package/dist/database/postgres-connection.d.ts.map +1 -0
  12. package/dist/database/postgres-connection.js +113 -0
  13. package/dist/database/postgres-connection.js.map +1 -0
  14. package/dist/database/types.d.ts +84 -0
  15. package/dist/database/types.d.ts.map +1 -0
  16. package/dist/database/types.js +6 -0
  17. package/dist/database/types.js.map +1 -0
  18. package/dist/index.d.ts +2 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +120 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/server.d.ts +14 -0
  23. package/dist/server.d.ts.map +1 -0
  24. package/dist/server.js +186 -0
  25. package/dist/server.js.map +1 -0
  26. package/dist/test-defaults.d.ts +2 -0
  27. package/dist/test-defaults.d.ts.map +1 -0
  28. package/dist/test-defaults.js +57 -0
  29. package/dist/test-defaults.js.map +1 -0
  30. package/dist/tools/analyze-query.d.ts +27 -0
  31. package/dist/tools/analyze-query.d.ts.map +1 -0
  32. package/dist/tools/analyze-query.js +71 -0
  33. package/dist/tools/analyze-query.js.map +1 -0
  34. package/dist/tools/execute-query.d.ts +33 -0
  35. package/dist/tools/execute-query.d.ts.map +1 -0
  36. package/dist/tools/execute-query.js +57 -0
  37. package/dist/tools/execute-query.js.map +1 -0
  38. package/dist/tools/get-foreign-keys.d.ts +38 -0
  39. package/dist/tools/get-foreign-keys.d.ts.map +1 -0
  40. package/dist/tools/get-foreign-keys.js +391 -0
  41. package/dist/tools/get-foreign-keys.js.map +1 -0
  42. package/dist/tools/get-indexes.d.ts +38 -0
  43. package/dist/tools/get-indexes.d.ts.map +1 -0
  44. package/dist/tools/get-indexes.js +472 -0
  45. package/dist/tools/get-indexes.js.map +1 -0
  46. package/dist/tools/information-schema-query.d.ts +33 -0
  47. package/dist/tools/information-schema-query.d.ts.map +1 -0
  48. package/dist/tools/information-schema-query.js +76 -0
  49. package/dist/tools/information-schema-query.js.map +1 -0
  50. package/dist/tools/inspect-table.d.ts +38 -0
  51. package/dist/tools/inspect-table.d.ts.map +1 -0
  52. package/dist/tools/inspect-table.js +351 -0
  53. package/dist/tools/inspect-table.js.map +1 -0
  54. package/dist/tools/list-databases.d.ts +14 -0
  55. package/dist/tools/list-databases.d.ts.map +1 -0
  56. package/dist/tools/list-databases.js +83 -0
  57. package/dist/tools/list-databases.js.map +1 -0
  58. package/dist/tools/list-tables.d.ts +19 -0
  59. package/dist/tools/list-tables.d.ts.map +1 -0
  60. package/dist/tools/list-tables.js +130 -0
  61. package/dist/tools/list-tables.js.map +1 -0
  62. package/dist/utils/errors.d.ts +32 -0
  63. package/dist/utils/errors.d.ts.map +1 -0
  64. package/dist/utils/errors.js +98 -0
  65. package/dist/utils/errors.js.map +1 -0
  66. package/dist/utils/logger.d.ts +28 -0
  67. package/dist/utils/logger.d.ts.map +1 -0
  68. package/dist/utils/logger.js +132 -0
  69. package/dist/utils/logger.js.map +1 -0
  70. package/dist/validators/input-validator.d.ts +76 -0
  71. package/dist/validators/input-validator.d.ts.map +1 -0
  72. package/dist/validators/input-validator.js +295 -0
  73. package/dist/validators/input-validator.js.map +1 -0
  74. package/dist/validators/query-validator.d.ts +19 -0
  75. package/dist/validators/query-validator.d.ts.map +1 -0
  76. package/dist/validators/query-validator.js +229 -0
  77. package/dist/validators/query-validator.js.map +1 -0
  78. package/enhanced_sql_prompt.md +324 -0
  79. package/examples/claude-config.json +23 -0
  80. package/examples/roo-config.json +16 -0
  81. package/package.json +42 -0
  82. package/src/database/connection.ts +165 -0
  83. package/src/database/manager.ts +682 -0
  84. package/src/database/postgres-connection.ts +123 -0
  85. package/src/database/types.ts +93 -0
  86. package/src/index.ts +136 -0
  87. package/src/server.ts +254 -0
  88. package/src/test-defaults.ts +63 -0
  89. package/src/tools/analyze-query.test.ts +100 -0
  90. package/src/tools/analyze-query.ts +112 -0
  91. package/src/tools/execute-query.ts +91 -0
  92. package/src/tools/get-foreign-keys.test.ts +51 -0
  93. package/src/tools/get-foreign-keys.ts +488 -0
  94. package/src/tools/get-indexes.test.ts +51 -0
  95. package/src/tools/get-indexes.ts +570 -0
  96. package/src/tools/information-schema-query.ts +125 -0
  97. package/src/tools/inspect-table.test.ts +59 -0
  98. package/src/tools/inspect-table.ts +440 -0
  99. package/src/tools/list-databases.ts +119 -0
  100. package/src/tools/list-tables.ts +181 -0
  101. package/src/utils/errors.ts +103 -0
  102. package/src/utils/logger.ts +158 -0
  103. package/src/validators/input-validator.ts +318 -0
  104. package/src/validators/query-validator.ts +267 -0
  105. package/tsconfig.json +30 -0
@@ -0,0 +1,621 @@
1
+ import { DatabaseType } from './types.js';
2
+ import { DatabaseConnection } from './connection.js';
3
+ import { QueryValidator } from '../validators/query-validator.js';
4
+ import { Logger } from '../utils/logger.js';
5
+ import { DatabaseError, ValidationError } from '../utils/errors.js';
6
+ export class DatabaseManager {
7
+ databases = new Map();
8
+ connectionTimeout = 30000;
9
+ maxRowLimit = 1000;
10
+ async addDatabase(url, name) {
11
+ try {
12
+ const type = DatabaseConnection.detectDatabaseType(url);
13
+ const connectionOptions = DatabaseConnection.parseConnectionUrl(url);
14
+ const dbName = name || DatabaseConnection.extractDatabaseName(url);
15
+ // Test the connection first
16
+ const isConnectable = await DatabaseConnection.testConnection(connectionOptions);
17
+ if (!isConnectable) {
18
+ throw new DatabaseError(`Cannot connect to database: ${dbName}`);
19
+ }
20
+ const config = {
21
+ name: dbName,
22
+ url,
23
+ type,
24
+ connection: null,
25
+ lastUsed: new Date(),
26
+ host: connectionOptions.host,
27
+ port: connectionOptions.port,
28
+ username: connectionOptions.user,
29
+ password: connectionOptions.password,
30
+ database: connectionOptions.database,
31
+ ssl: connectionOptions.ssl
32
+ };
33
+ this.databases.set(dbName, config);
34
+ Logger.info(`Added ${type} database configuration: ${dbName}`);
35
+ return dbName;
36
+ }
37
+ catch (error) {
38
+ Logger.error(`Failed to add database: ${error instanceof Error ? error.message : 'Unknown error'}`);
39
+ throw error;
40
+ }
41
+ }
42
+ async removeDatabase(name) {
43
+ const config = this.databases.get(name);
44
+ if (!config) {
45
+ throw new DatabaseError(`Database not found: ${name}`);
46
+ }
47
+ if (config.connection) {
48
+ await DatabaseConnection.closeConnection(config.connection, config.type);
49
+ }
50
+ this.databases.delete(name);
51
+ Logger.info(`Removed database: ${name}`);
52
+ }
53
+ listDatabases() {
54
+ return Array.from(this.databases.values()).map(config => ({
55
+ name: config.name,
56
+ type: config.type,
57
+ connected: config.connection !== null,
58
+ lastUsed: config.lastUsed,
59
+ host: config.host,
60
+ database: config.database
61
+ }));
62
+ }
63
+ getDatabaseType(dbName) {
64
+ const config = this.databases.get(dbName);
65
+ if (!config) {
66
+ throw new DatabaseError(`Database not found: ${dbName}`);
67
+ }
68
+ return config.type;
69
+ }
70
+ async getConnection(dbName) {
71
+ const config = this.databases.get(dbName);
72
+ if (!config) {
73
+ throw new DatabaseError(`Database not found: ${dbName}`);
74
+ }
75
+ const connectionOptions = DatabaseConnection.parseConnectionUrl(config.url);
76
+ const connection = await DatabaseConnection.createConnection(connectionOptions);
77
+ config.lastUsed = new Date();
78
+ return connection;
79
+ }
80
+ async executeQuery(dbName, query, params) {
81
+ const config = this.databases.get(dbName);
82
+ if (!config)
83
+ throw new DatabaseError(`Database not found: ${dbName}`);
84
+ // Validate query is read-only
85
+ const validation = QueryValidator.validateQuery(query);
86
+ if (!validation.isValid) {
87
+ throw new ValidationError(`Query validation failed: ${validation.error}`);
88
+ }
89
+ let connection = null;
90
+ try {
91
+ connection = await this.getConnection(dbName);
92
+ // Add row limit to SELECT queries if not already present
93
+ const limitedQuery = this.addRowLimitToQuery(query, config.type);
94
+ const result = await DatabaseConnection.executeQuery(connection, limitedQuery, params, config.type);
95
+ return result;
96
+ }
97
+ finally {
98
+ if (connection) {
99
+ await DatabaseConnection.closeConnection(connection, config.type);
100
+ }
101
+ }
102
+ }
103
+ addRowLimitToQuery(query, type) {
104
+ const trimmedQuery = query.trim().toUpperCase();
105
+ if (trimmedQuery.startsWith('SELECT') && !trimmedQuery.includes('LIMIT')) {
106
+ if (type === DatabaseType.PostgreSQL) {
107
+ return `${query.trim()} LIMIT ${this.maxRowLimit}`;
108
+ }
109
+ return `${query.trim()} LIMIT ${this.maxRowLimit}`;
110
+ }
111
+ return query;
112
+ }
113
+ async getTables(dbName) {
114
+ const config = this.databases.get(dbName);
115
+ if (!config)
116
+ throw new DatabaseError(`Database not found: ${dbName}`);
117
+ if (config.type === DatabaseType.PostgreSQL) {
118
+ return this.getTablesPostgres(dbName);
119
+ }
120
+ const query = `
121
+ SELECT
122
+ TABLE_NAME as tableName,
123
+ TABLE_TYPE as tableType,
124
+ ENGINE as engine,
125
+ TABLE_ROWS as tableRows,
126
+ TABLE_COMMENT as tableComment
127
+ FROM INFORMATION_SCHEMA.TABLES
128
+ WHERE TABLE_SCHEMA = ?
129
+ ORDER BY TABLE_NAME
130
+ `;
131
+ let connection = null;
132
+ try {
133
+ connection = await this.getConnection(dbName);
134
+ const result = await DatabaseConnection.executeQuery(connection, query, [config.database], config.type);
135
+ return result.rows.map(row => ({
136
+ tableName: row.tableName,
137
+ tableType: row.tableType,
138
+ engine: row.engine,
139
+ tableRows: row.tableRows ? parseInt(row.tableRows) : undefined,
140
+ tableComment: row.tableComment || undefined
141
+ }));
142
+ }
143
+ finally {
144
+ if (connection) {
145
+ await DatabaseConnection.closeConnection(connection, config.type);
146
+ }
147
+ }
148
+ }
149
+ async getTablesPostgres(dbName) {
150
+ const config = this.databases.get(dbName);
151
+ const query = `
152
+ SELECT
153
+ table_name as "tableName",
154
+ table_type as "tableType",
155
+ NULL as engine,
156
+ NULL as "tableRows",
157
+ NULL as "tableComment"
158
+ FROM information_schema.tables
159
+ WHERE table_schema = 'public'
160
+ OR table_schema = $1
161
+ ORDER BY table_name
162
+ `;
163
+ let connection = null;
164
+ try {
165
+ connection = await this.getConnection(dbName);
166
+ const result = await DatabaseConnection.executeQuery(connection, query, [config.database], config.type);
167
+ return result.rows.map(row => ({
168
+ tableName: row.tableName,
169
+ tableType: row.tableType,
170
+ engine: undefined,
171
+ tableRows: undefined,
172
+ tableComment: undefined
173
+ }));
174
+ }
175
+ finally {
176
+ if (connection) {
177
+ await DatabaseConnection.closeConnection(connection, config.type);
178
+ }
179
+ }
180
+ }
181
+ async getTableSchema(dbName, tableName) {
182
+ const config = this.databases.get(dbName);
183
+ if (!config)
184
+ throw new DatabaseError(`Database not found: ${dbName}`);
185
+ if (config.type === DatabaseType.PostgreSQL) {
186
+ return this.getTableSchemaPostgres(dbName, tableName);
187
+ }
188
+ const query = `
189
+ SELECT
190
+ c.COLUMN_NAME as columnName,
191
+ c.DATA_TYPE as dataType,
192
+ c.IS_NULLABLE as isNullable,
193
+ c.COLUMN_DEFAULT as columnDefault,
194
+ c.EXTRA as extra,
195
+ c.COLUMN_COMMENT as columnComment,
196
+ c.CHARACTER_MAXIMUM_LENGTH as characterMaximumLength,
197
+ c.NUMERIC_PRECISION as numericPrecision,
198
+ c.NUMERIC_SCALE as numericScale,
199
+ CASE WHEN k.COLUMN_NAME IS NOT NULL THEN true ELSE false END as isPrimaryKey
200
+ FROM INFORMATION_SCHEMA.COLUMNS c
201
+ LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE k
202
+ ON c.TABLE_SCHEMA = k.TABLE_SCHEMA
203
+ AND c.TABLE_NAME = k.TABLE_NAME
204
+ AND c.COLUMN_NAME = k.COLUMN_NAME
205
+ AND k.CONSTRAINT_NAME = 'PRIMARY'
206
+ WHERE c.TABLE_SCHEMA = ? AND c.TABLE_NAME = ?
207
+ ORDER BY c.ORDINAL_POSITION
208
+ `;
209
+ let connection = null;
210
+ try {
211
+ connection = await this.getConnection(dbName);
212
+ const result = await DatabaseConnection.executeQuery(connection, query, [config.database, tableName], config.type);
213
+ return result.rows.map(row => ({
214
+ columnName: row.columnName,
215
+ dataType: row.dataType,
216
+ isNullable: row.isNullable,
217
+ columnDefault: row.columnDefault,
218
+ isPrimaryKey: Boolean(row.isPrimaryKey),
219
+ isAutoIncrement: row.extra && row.extra.toLowerCase().includes('auto_increment'),
220
+ columnComment: row.columnComment || undefined,
221
+ characterMaximumLength: row.characterMaximumLength,
222
+ numericPrecision: row.numericPrecision,
223
+ numericScale: row.numericScale
224
+ }));
225
+ }
226
+ finally {
227
+ if (connection) {
228
+ await DatabaseConnection.closeConnection(connection, config.type);
229
+ }
230
+ }
231
+ }
232
+ async getTableSchemaPostgres(dbName, tableName) {
233
+ const config = this.databases.get(dbName);
234
+ const query = `
235
+ SELECT
236
+ c.column_name as "columnName",
237
+ c.data_type as "dataType",
238
+ c.is_nullable as "isNullable",
239
+ c.column_default as "columnDefault",
240
+ NULL as extra,
241
+ NULL as "columnComment",
242
+ c.character_maximum_length as "characterMaximumLength",
243
+ c.numeric_precision as "numericPrecision",
244
+ c.numeric_scale as "numericScale",
245
+ EXISTS (
246
+ SELECT 1 FROM information_schema.table_constraints tc
247
+ JOIN information_schema.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name
248
+ WHERE tc.constraint_type = 'PRIMARY KEY'
249
+ AND tc.table_name = c.table_name
250
+ AND kcu.column_name = c.column_name
251
+ ) as "isPrimaryKey"
252
+ FROM information_schema.columns c
253
+ WHERE c.table_name = $2 AND (c.table_schema = 'public' OR c.table_schema = $1)
254
+ ORDER BY c.ordinal_position
255
+ `;
256
+ let connection = null;
257
+ try {
258
+ connection = await this.getConnection(dbName);
259
+ const result = await DatabaseConnection.executeQuery(connection, query, [config.database, tableName], config.type);
260
+ return result.rows.map(row => ({
261
+ columnName: row.columnName,
262
+ dataType: row.dataType,
263
+ isNullable: row.isNullable,
264
+ columnDefault: row.columnDefault,
265
+ isPrimaryKey: Boolean(row.isPrimaryKey),
266
+ isAutoIncrement: row.columnDefault && row.columnDefault.includes('nextval'),
267
+ columnComment: undefined,
268
+ characterMaximumLength: row.characterMaximumLength,
269
+ numericPrecision: row.numericPrecision,
270
+ numericScale: row.numericScale
271
+ }));
272
+ }
273
+ finally {
274
+ if (connection) {
275
+ await DatabaseConnection.closeConnection(connection, config.type);
276
+ }
277
+ }
278
+ }
279
+ async getForeignKeys(dbName, tableName) {
280
+ const config = this.databases.get(dbName);
281
+ if (!config)
282
+ throw new DatabaseError(`Database not found: ${dbName}`);
283
+ if (config.type === DatabaseType.PostgreSQL) {
284
+ return this.getForeignKeysPostgres(dbName, tableName);
285
+ }
286
+ let query = `
287
+ SELECT
288
+ rc.CONSTRAINT_NAME as constraintName,
289
+ kcu.TABLE_NAME as tableName,
290
+ kcu.COLUMN_NAME as columnName,
291
+ kcu.REFERENCED_TABLE_NAME as referencedTableName,
292
+ kcu.REFERENCED_COLUMN_NAME as referencedColumnName,
293
+ rc.UPDATE_RULE as updateRule,
294
+ rc.DELETE_RULE as deleteRule
295
+ FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
296
+ JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
297
+ ON rc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
298
+ AND rc.CONSTRAINT_SCHEMA = kcu.CONSTRAINT_SCHEMA
299
+ WHERE rc.CONSTRAINT_SCHEMA = ?
300
+ `;
301
+ const params = [];
302
+ params.push(config.database);
303
+ if (tableName) {
304
+ query += ' AND kcu.TABLE_NAME = ?';
305
+ params.push(tableName);
306
+ }
307
+ query += ' ORDER BY kcu.TABLE_NAME, rc.CONSTRAINT_NAME';
308
+ let connection = null;
309
+ try {
310
+ connection = await this.getConnection(dbName);
311
+ const result = await DatabaseConnection.executeQuery(connection, query, params, config.type);
312
+ return result.rows.map(row => ({
313
+ constraintName: row.constraintName,
314
+ tableName: row.tableName,
315
+ columnName: row.columnName,
316
+ referencedTableName: row.referencedTableName,
317
+ referencedColumnName: row.referencedColumnName,
318
+ updateRule: row.updateRule,
319
+ deleteRule: row.deleteRule
320
+ }));
321
+ }
322
+ finally {
323
+ if (connection) {
324
+ await DatabaseConnection.closeConnection(connection, config.type);
325
+ }
326
+ }
327
+ }
328
+ async getForeignKeysPostgres(dbName, tableName) {
329
+ const config = this.databases.get(dbName);
330
+ let query = `
331
+ SELECT
332
+ tc.constraint_name as "constraintName",
333
+ tc.table_name as "tableName",
334
+ kcu.column_name as "columnName",
335
+ ccu.table_name AS "referencedTableName",
336
+ ccu.column_name AS "referencedColumnName"
337
+ FROM information_schema.table_constraints AS tc
338
+ JOIN information_schema.key_column_usage AS kcu
339
+ ON tc.constraint_name = kcu.constraint_name
340
+ AND tc.table_schema = kcu.table_schema
341
+ JOIN information_schema.constraint_column_usage AS ccu
342
+ ON ccu.constraint_name = tc.constraint_name
343
+ AND ccu.table_schema = tc.table_schema
344
+ WHERE tc.constraint_type = 'FOREIGN KEY'
345
+ AND (tc.table_schema = 'public' OR tc.table_schema = $1)
346
+ `;
347
+ const params = [config.database];
348
+ if (tableName) {
349
+ query += ' AND tc.table_name = $2';
350
+ params.push(tableName);
351
+ }
352
+ let connection = null;
353
+ try {
354
+ connection = await this.getConnection(dbName);
355
+ const result = await DatabaseConnection.executeQuery(connection, query, params, config.type);
356
+ return result.rows.map(row => ({
357
+ constraintName: row.constraintName,
358
+ tableName: row.tableName,
359
+ columnName: row.columnName,
360
+ referencedTableName: row.referencedTableName,
361
+ referencedColumnName: row.referencedColumnName,
362
+ updateRule: undefined,
363
+ deleteRule: undefined
364
+ }));
365
+ }
366
+ finally {
367
+ if (connection) {
368
+ await DatabaseConnection.closeConnection(connection, config.type);
369
+ }
370
+ }
371
+ }
372
+ async getIndexes(dbName, tableName) {
373
+ const config = this.databases.get(dbName);
374
+ if (!config)
375
+ throw new DatabaseError(`Database not found: ${dbName}`);
376
+ if (config.type === DatabaseType.PostgreSQL) {
377
+ return this.getIndexesPostgres(dbName, tableName);
378
+ }
379
+ const query = `
380
+ SELECT
381
+ TABLE_NAME as tableName,
382
+ INDEX_NAME as indexName,
383
+ COLUMN_NAME as columnName,
384
+ NON_UNIQUE as nonUnique,
385
+ INDEX_TYPE as indexType,
386
+ CARDINALITY as cardinality,
387
+ SUB_PART as subPart,
388
+ NULLABLE as nullable
389
+ FROM INFORMATION_SCHEMA.STATISTICS
390
+ WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?
391
+ ORDER BY INDEX_NAME, SEQ_IN_INDEX
392
+ `;
393
+ let connection = null;
394
+ try {
395
+ connection = await this.getConnection(dbName);
396
+ const result = await DatabaseConnection.executeQuery(connection, query, [config.database, tableName], config.type);
397
+ return result.rows.map(row => ({
398
+ tableName: row.tableName,
399
+ indexName: row.indexName,
400
+ columnName: row.columnName,
401
+ nonUnique: Boolean(row.nonUnique),
402
+ indexType: row.indexType,
403
+ cardinality: row.cardinality,
404
+ subPart: row.subPart,
405
+ nullable: row.nullable === 'YES',
406
+ isPrimary: row.indexName === 'PRIMARY'
407
+ }));
408
+ }
409
+ finally {
410
+ if (connection) {
411
+ await DatabaseConnection.closeConnection(connection, config.type);
412
+ }
413
+ }
414
+ }
415
+ async getIndexesPostgres(dbName, tableName) {
416
+ const config = this.databases.get(dbName);
417
+ const query = `
418
+ SELECT
419
+ t.relname as "tableName",
420
+ i.relname as "indexName",
421
+ a.attname as "columnName",
422
+ NOT ix.indisunique as "nonUnique",
423
+ ix.indisprimary as "isPrimary",
424
+ am.amname as "indexType"
425
+ FROM pg_class t
426
+ JOIN pg_index ix ON t.oid = ix.indrelid
427
+ JOIN pg_class i ON i.oid = ix.indexrelid
428
+ JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(ix.indkey)
429
+ JOIN pg_am am ON i.relam = am.oid
430
+ WHERE t.relname = $1
431
+ ORDER BY i.relname
432
+ `;
433
+ let connection = null;
434
+ try {
435
+ connection = await this.getConnection(dbName);
436
+ const result = await DatabaseConnection.executeQuery(connection, query, [tableName], config.type);
437
+ return result.rows.map(row => ({
438
+ tableName: row.tableName,
439
+ indexName: row.indexName,
440
+ columnName: row.columnName,
441
+ nonUnique: Boolean(row.nonUnique),
442
+ indexType: row.indexType,
443
+ cardinality: undefined,
444
+ subPart: undefined,
445
+ nullable: true, // pg_attribute doesn't directly tell us nullable here, but irrelevant for simple index list
446
+ isPrimary: Boolean(row.isPrimary)
447
+ }));
448
+ }
449
+ finally {
450
+ if (connection) {
451
+ await DatabaseConnection.closeConnection(connection, config.type);
452
+ }
453
+ }
454
+ }
455
+ async cleanup() {
456
+ Logger.info('Cleaning up database connections...');
457
+ for (const [name, config] of this.databases) {
458
+ if (config.connection) {
459
+ try {
460
+ await DatabaseConnection.closeConnection(config.connection, config.type);
461
+ }
462
+ catch (error) {
463
+ Logger.warn(`Error closing connection for ${name}: ${error instanceof Error ? error.message : 'Unknown error'}`);
464
+ }
465
+ }
466
+ }
467
+ this.databases.clear();
468
+ Logger.info('Database cleanup completed');
469
+ }
470
+ async queryInformationSchema(dbName, table, filters, limit = 100) {
471
+ const config = this.databases.get(dbName);
472
+ if (!config)
473
+ throw new DatabaseError(`Database not found: ${dbName}`);
474
+ const allowedTables = ['COLUMNS', 'TABLES', 'ROUTINES'];
475
+ if (!allowedTables.includes(table)) {
476
+ throw new ValidationError(`Table '${table}' is not allowed for INFORMATION_SCHEMA queries.`);
477
+ }
478
+ let whereClauses = [];
479
+ let params = [];
480
+ if (filters) {
481
+ for (const [key, value] of Object.entries(filters)) {
482
+ if (!/^[A-Z_]+$/.test(key)) {
483
+ throw new ValidationError(`Invalid filter key: ${key}. Only uppercase letters and underscores allowed.`);
484
+ }
485
+ if (config.type === DatabaseType.PostgreSQL) {
486
+ whereClauses.push(`${key.toLowerCase()} = $${params.length + 1}`);
487
+ }
488
+ else {
489
+ whereClauses.push(`${key} = ?`);
490
+ }
491
+ params.push(value);
492
+ }
493
+ }
494
+ if (config.type === DatabaseType.PostgreSQL) {
495
+ whereClauses.unshift(`table_schema = $${params.length + 1}`);
496
+ params.push('public'); // Default for PG
497
+ }
498
+ else {
499
+ whereClauses.unshift('TABLE_SCHEMA = ?');
500
+ params.unshift(config.database);
501
+ }
502
+ let sql = `SELECT * FROM INFORMATION_SCHEMA.${table}`;
503
+ if (whereClauses.length > 0) {
504
+ sql += ' WHERE ' + whereClauses.join(' AND ');
505
+ }
506
+ sql += ` LIMIT ${Math.min(Math.max(limit, 1), 1000)}`;
507
+ let connection = null;
508
+ try {
509
+ connection = await this.getConnection(dbName);
510
+ const result = await DatabaseConnection.executeQuery(connection, sql, params, config.type);
511
+ return result;
512
+ }
513
+ finally {
514
+ if (connection) {
515
+ await DatabaseConnection.closeConnection(connection, config.type);
516
+ }
517
+ }
518
+ }
519
+ async analyzeQuery(dbName, query) {
520
+ const config = this.databases.get(dbName);
521
+ if (!config)
522
+ throw new DatabaseError(`Database not found: ${dbName}`);
523
+ // Validate query is read-only
524
+ const validation = QueryValidator.validateQuery(query);
525
+ if (!validation.isValid) {
526
+ throw new ValidationError(`Query validation failed: ${validation.error}`);
527
+ }
528
+ let explainQuery;
529
+ if (config.type === DatabaseType.PostgreSQL) {
530
+ explainQuery = `EXPLAIN (FORMAT JSON, VERBOSE, ANALYZE FALSE) ${query}`;
531
+ }
532
+ else {
533
+ explainQuery = `EXPLAIN FORMAT=JSON ${query}`;
534
+ }
535
+ let connection = null;
536
+ try {
537
+ connection = await this.getConnection(dbName);
538
+ const result = await DatabaseConnection.executeQuery(connection, explainQuery, [], config.type);
539
+ let rawPlan;
540
+ if (config.type === DatabaseType.PostgreSQL) {
541
+ // PG returns [{ "QUERY PLAN": [...] }] or similar
542
+ const firstRow = result.rows[0];
543
+ const firstKey = Object.keys(firstRow)[0];
544
+ const val = firstRow[firstKey];
545
+ rawPlan = Array.isArray(val) ? val[0] : val;
546
+ }
547
+ else {
548
+ // MySQL returns [{ EXPLAIN: "json_string" }] or similar
549
+ const firstRow = result.rows[0];
550
+ const firstKey = Object.keys(firstRow)[0];
551
+ try {
552
+ rawPlan = typeof firstRow[firstKey] === 'string' ? JSON.parse(firstRow[firstKey]) : firstRow[firstKey];
553
+ }
554
+ catch (e) {
555
+ rawPlan = firstRow[firstKey];
556
+ }
557
+ }
558
+ return {
559
+ database: dbName,
560
+ type: config.type,
561
+ query,
562
+ plan: rawPlan,
563
+ summary: this.summarizePlan(rawPlan, config.type)
564
+ };
565
+ }
566
+ finally {
567
+ if (connection) {
568
+ await DatabaseConnection.closeConnection(connection, config.type);
569
+ }
570
+ }
571
+ }
572
+ summarizePlan(plan, type) {
573
+ const summary = {
574
+ cost: 0,
575
+ potentialIssues: [],
576
+ operations: []
577
+ };
578
+ if (type === DatabaseType.PostgreSQL) {
579
+ const rootPlan = plan?.Plan || plan?.[0]?.Plan;
580
+ if (rootPlan) {
581
+ summary.cost = rootPlan['Total Cost'];
582
+ this.traversePostgresPlan(rootPlan, summary);
583
+ }
584
+ }
585
+ else {
586
+ // MySQL JSON format is deeply nested under query_block
587
+ const queryBlock = plan?.query_block;
588
+ if (queryBlock) {
589
+ summary.cost = queryBlock.cost_info?.query_cost;
590
+ this.traverseMySQLPlan(queryBlock, summary);
591
+ }
592
+ }
593
+ return summary;
594
+ }
595
+ traversePostgresPlan(plan, summary) {
596
+ const nodeType = plan['Node Type'];
597
+ summary.operations.push(nodeType);
598
+ if (nodeType === 'Seq Scan') {
599
+ summary.potentialIssues.push(`Full table scan on ${plan['Relation Name']}`);
600
+ }
601
+ if (plan.Plans) {
602
+ for (const subPlan of plan.Plans) {
603
+ this.traversePostgresPlan(subPlan, summary);
604
+ }
605
+ }
606
+ }
607
+ traverseMySQLPlan(node, summary) {
608
+ if (node.table) {
609
+ summary.operations.push(node.table.access_type);
610
+ if (node.table.access_type === 'ALL') {
611
+ summary.potentialIssues.push(`Full table scan on ${node.table.table_name}`);
612
+ }
613
+ }
614
+ for (const key in node) {
615
+ if (typeof node[key] === 'object' && node[key] !== null) {
616
+ this.traverseMySQLPlan(node[key], summary);
617
+ }
618
+ }
619
+ }
620
+ }
621
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/database/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import pg from 'pg';
2
+ import { DatabaseConnectionOptions, QueryResult } from './types.js';
3
+ export declare class PostgresConnection {
4
+ static parseConnectionUrl(url: string): DatabaseConnectionOptions;
5
+ static createClient(options: DatabaseConnectionOptions): Promise<pg.Client>;
6
+ static executeQuery(client: pg.Client, query: string, params?: any[]): Promise<QueryResult>;
7
+ static closeConnection(client: pg.Client): Promise<void>;
8
+ static testConnection(options: DatabaseConnectionOptions): Promise<boolean>;
9
+ }
10
+ //# sourceMappingURL=postgres-connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-connection.d.ts","sourceRoot":"","sources":["../../src/database/postgres-connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,EAAE,yBAAyB,EAAE,WAAW,EAAgB,MAAM,YAAY,CAAC;AAIlF,qBAAa,kBAAkB;IAC7B,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,yBAAyB;WAqCpD,YAAY,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC;WA8BpE,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;WAyBpF,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;WASjD,cAAc,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,OAAO,CAAC;CAclF"}