@pilat/mcp-datalink 1.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.
- package/README.md +442 -0
- package/databases.example.json +18 -0
- package/dist/__integration__/global-setup.d.ts +8 -0
- package/dist/__integration__/global-setup.d.ts.map +1 -0
- package/dist/__integration__/global-setup.js +34 -0
- package/dist/__integration__/global-setup.js.map +1 -0
- package/dist/__integration__/global-teardown.d.ts +8 -0
- package/dist/__integration__/global-teardown.d.ts.map +1 -0
- package/dist/__integration__/global-teardown.js +17 -0
- package/dist/__integration__/global-teardown.js.map +1 -0
- package/dist/__integration__/helpers.d.ts +58 -0
- package/dist/__integration__/helpers.d.ts.map +1 -0
- package/dist/__integration__/helpers.js +568 -0
- package/dist/__integration__/helpers.js.map +1 -0
- package/dist/__integration__/setup.d.ts +79 -0
- package/dist/__integration__/setup.d.ts.map +1 -0
- package/dist/__integration__/setup.js +230 -0
- package/dist/__integration__/setup.js.map +1 -0
- package/dist/adapters/factory.d.ts +40 -0
- package/dist/adapters/factory.d.ts.map +1 -0
- package/dist/adapters/factory.js +114 -0
- package/dist/adapters/factory.js.map +1 -0
- package/dist/adapters/index.d.ts +31 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +34 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/mysql/adapter.d.ts +61 -0
- package/dist/adapters/mysql/adapter.d.ts.map +1 -0
- package/dist/adapters/mysql/adapter.js +567 -0
- package/dist/adapters/mysql/adapter.js.map +1 -0
- package/dist/adapters/postgresql/adapter.d.ts +52 -0
- package/dist/adapters/postgresql/adapter.d.ts.map +1 -0
- package/dist/adapters/postgresql/adapter.js +429 -0
- package/dist/adapters/postgresql/adapter.js.map +1 -0
- package/dist/adapters/sqlite/adapter.d.ts +56 -0
- package/dist/adapters/sqlite/adapter.d.ts.map +1 -0
- package/dist/adapters/sqlite/adapter.js +582 -0
- package/dist/adapters/sqlite/adapter.js.map +1 -0
- package/dist/adapters/types.d.ts +155 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +7 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/config/loader.d.ts +11 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +127 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +21 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +191 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/describe-table.d.ts +11 -0
- package/dist/tools/describe-table.d.ts.map +1 -0
- package/dist/tools/describe-table.js +23 -0
- package/dist/tools/describe-table.js.map +1 -0
- package/dist/tools/execute.d.ts +22 -0
- package/dist/tools/execute.d.ts.map +1 -0
- package/dist/tools/execute.js +48 -0
- package/dist/tools/execute.js.map +1 -0
- package/dist/tools/explain.d.ts +25 -0
- package/dist/tools/explain.d.ts.map +1 -0
- package/dist/tools/explain.js +81 -0
- package/dist/tools/explain.js.map +1 -0
- package/dist/tools/list-databases.d.ts +18 -0
- package/dist/tools/list-databases.d.ts.map +1 -0
- package/dist/tools/list-databases.js +17 -0
- package/dist/tools/list-databases.js.map +1 -0
- package/dist/tools/list-tables.d.ts +22 -0
- package/dist/tools/list-tables.d.ts.map +1 -0
- package/dist/tools/list-tables.js +43 -0
- package/dist/tools/list-tables.js.map +1 -0
- package/dist/tools/query.d.ts +25 -0
- package/dist/tools/query.d.ts.map +1 -0
- package/dist/tools/query.js +109 -0
- package/dist/tools/query.js.map +1 -0
- package/dist/types.d.ts +93 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/errors.d.ts +22 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +41 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/formatter.d.ts +13 -0
- package/dist/utils/formatter.d.ts.map +1 -0
- package/dist/utils/formatter.js +56 -0
- package/dist/utils/formatter.js.map +1 -0
- package/dist/utils/truncate.d.ts +37 -0
- package/dist/utils/truncate.d.ts.map +1 -0
- package/dist/utils/truncate.js +91 -0
- package/dist/utils/truncate.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL Database Adapter
|
|
3
|
+
*
|
|
4
|
+
* Implements DatabaseAdapter interface for PostgreSQL databases.
|
|
5
|
+
* Uses node-postgres (pg) driver with per-request connection recycling.
|
|
6
|
+
*/
|
|
7
|
+
import pg from 'pg';
|
|
8
|
+
import { parse, toSql } from 'pgsql-ast-parser';
|
|
9
|
+
import { DbMcpError, ErrorCode } from '../../utils/errors.js';
|
|
10
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
11
|
+
// SQL Dialect helpers (formerly in dialect.ts)
|
|
12
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
13
|
+
/**
|
|
14
|
+
* Prefixes that indicate dangerous SQL operations
|
|
15
|
+
* pgsql-ast-parser returns types like "drop table", "alter table", etc.
|
|
16
|
+
*/
|
|
17
|
+
const DANGEROUS_PREFIXES = [
|
|
18
|
+
'drop',
|
|
19
|
+
'truncate',
|
|
20
|
+
'alter',
|
|
21
|
+
'create',
|
|
22
|
+
'grant',
|
|
23
|
+
'revoke',
|
|
24
|
+
];
|
|
25
|
+
/**
|
|
26
|
+
* Maps pgsql-ast-parser statement types to our QueryType
|
|
27
|
+
*/
|
|
28
|
+
function getQueryType(statement) {
|
|
29
|
+
switch (statement.type) {
|
|
30
|
+
case 'select':
|
|
31
|
+
return 'select';
|
|
32
|
+
case 'insert':
|
|
33
|
+
return 'insert';
|
|
34
|
+
case 'update':
|
|
35
|
+
return 'update';
|
|
36
|
+
case 'delete':
|
|
37
|
+
return 'delete';
|
|
38
|
+
default:
|
|
39
|
+
return 'other';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Check if a statement type is dangerous
|
|
44
|
+
* Handles compound types from pgsql-ast-parser like "drop table", "alter table"
|
|
45
|
+
*/
|
|
46
|
+
function checkDangerous(statement) {
|
|
47
|
+
const stmtType = statement.type.toLowerCase();
|
|
48
|
+
for (const prefix of DANGEROUS_PREFIXES) {
|
|
49
|
+
if (stmtType === prefix || stmtType.startsWith(prefix + ' ')) {
|
|
50
|
+
const operation = prefix.toUpperCase();
|
|
51
|
+
return {
|
|
52
|
+
isDangerous: true,
|
|
53
|
+
reason: operation + ' statements are not allowed',
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return { isDangerous: false };
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Type guard to check if a statement is a SelectFromStatement
|
|
61
|
+
*/
|
|
62
|
+
function isSelectFromStatement(statement) {
|
|
63
|
+
return statement.type === 'select' && 'columns' in statement;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Check if a SELECT statement has a LIMIT clause
|
|
67
|
+
*/
|
|
68
|
+
function hasLimitClause(statement) {
|
|
69
|
+
if (!isSelectFromStatement(statement)) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
return statement.limit !== undefined && statement.limit !== null;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* PostgreSQL database adapter
|
|
76
|
+
*
|
|
77
|
+
* Creates new connections for each request to prevent session state attacks.
|
|
78
|
+
*/
|
|
79
|
+
export class PostgreSqlAdapter {
|
|
80
|
+
type = 'postgresql';
|
|
81
|
+
connectionUrl;
|
|
82
|
+
timeout;
|
|
83
|
+
constructor(config) {
|
|
84
|
+
this.connectionUrl = config.database.url;
|
|
85
|
+
this.timeout = config.defaults.timeout;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get the default schema name for PostgreSQL
|
|
89
|
+
*/
|
|
90
|
+
getDefaultSchema() {
|
|
91
|
+
return 'public';
|
|
92
|
+
}
|
|
93
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
94
|
+
// SQL Dialect methods
|
|
95
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
96
|
+
/**
|
|
97
|
+
* Parse and validate a SQL query
|
|
98
|
+
*/
|
|
99
|
+
parseQuery(sql) {
|
|
100
|
+
let statements;
|
|
101
|
+
try {
|
|
102
|
+
statements = parse(sql);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
const message = error instanceof Error ? error.message : 'Unknown parse error';
|
|
106
|
+
throw new DbMcpError(ErrorCode.INVALID_SQL, 'Failed to parse SQL: ' + message, { sql });
|
|
107
|
+
}
|
|
108
|
+
// Filter out empty statements (trailing semicolons create these)
|
|
109
|
+
const nonEmptyStatements = statements.filter((stmt) => stmt.type !== 'empty' && stmt.type !== undefined);
|
|
110
|
+
if (nonEmptyStatements.length === 0) {
|
|
111
|
+
throw new DbMcpError(ErrorCode.INVALID_SQL, 'No valid SQL statement found', { sql });
|
|
112
|
+
}
|
|
113
|
+
if (nonEmptyStatements.length > 1) {
|
|
114
|
+
throw new DbMcpError(ErrorCode.MULTI_STATEMENT, 'Multiple SQL statements are not allowed. Please provide a single statement.', { sql, statementCount: nonEmptyStatements.length });
|
|
115
|
+
}
|
|
116
|
+
const statement = nonEmptyStatements[0];
|
|
117
|
+
const queryType = getQueryType(statement);
|
|
118
|
+
const { isDangerous, reason } = checkDangerous(statement);
|
|
119
|
+
return {
|
|
120
|
+
type: queryType,
|
|
121
|
+
hasLimit: hasLimitClause(statement),
|
|
122
|
+
isDangerous,
|
|
123
|
+
dangerousReason: reason,
|
|
124
|
+
sql,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Inject a LIMIT clause into a SELECT query if it doesn't have one
|
|
129
|
+
*/
|
|
130
|
+
injectLimit(sql, limit) {
|
|
131
|
+
let statements;
|
|
132
|
+
try {
|
|
133
|
+
statements = parse(sql);
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
return sql;
|
|
137
|
+
}
|
|
138
|
+
const nonEmptyStatements = statements.filter((stmt) => stmt.type !== 'empty' && stmt.type !== undefined);
|
|
139
|
+
if (nonEmptyStatements.length !== 1) {
|
|
140
|
+
return sql;
|
|
141
|
+
}
|
|
142
|
+
const statement = nonEmptyStatements[0];
|
|
143
|
+
if (!isSelectFromStatement(statement)) {
|
|
144
|
+
return sql;
|
|
145
|
+
}
|
|
146
|
+
if (statement.limit !== undefined && statement.limit !== null) {
|
|
147
|
+
return sql;
|
|
148
|
+
}
|
|
149
|
+
statement.limit = {
|
|
150
|
+
limit: { type: 'integer', value: limit },
|
|
151
|
+
};
|
|
152
|
+
return toSql.statement(statement);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Validate that a SQL query is appropriate for a specific tool
|
|
156
|
+
*/
|
|
157
|
+
validateQueryForTool(sql, tool) {
|
|
158
|
+
const parsed = this.parseQuery(sql);
|
|
159
|
+
if (tool === 'query') {
|
|
160
|
+
if (parsed.type !== 'select') {
|
|
161
|
+
throw new DbMcpError(ErrorCode.QUERY_BLOCKED, 'The query tool only accepts SELECT statements. Use the execute tool for ' +
|
|
162
|
+
parsed.type.toUpperCase() +
|
|
163
|
+
' statements.', { sql, queryType: parsed.type, tool });
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
else if (tool === 'execute') {
|
|
167
|
+
if (parsed.type === 'select') {
|
|
168
|
+
throw new DbMcpError(ErrorCode.QUERY_BLOCKED, 'The execute tool does not accept SELECT statements. Use the query tool instead.', { sql, queryType: parsed.type, tool });
|
|
169
|
+
}
|
|
170
|
+
if (parsed.isDangerous) {
|
|
171
|
+
throw new DbMcpError(ErrorCode.QUERY_BLOCKED, parsed.dangerousReason ?? 'This operation is not allowed', { sql, queryType: parsed.type, tool });
|
|
172
|
+
}
|
|
173
|
+
const allowedTypes = ['insert', 'update', 'delete'];
|
|
174
|
+
if (!allowedTypes.includes(parsed.type)) {
|
|
175
|
+
throw new DbMcpError(ErrorCode.QUERY_BLOCKED, 'The execute tool only accepts INSERT, UPDATE, or DELETE statements.', { sql, queryType: parsed.type, tool });
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get the EXPLAIN prefix for PostgreSQL
|
|
181
|
+
*/
|
|
182
|
+
getExplainPrefix(analyze) {
|
|
183
|
+
return analyze ? 'EXPLAIN ANALYZE ' : 'EXPLAIN ';
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Convert placeholders - no-op for PostgreSQL (already uses $1, $2, $3)
|
|
187
|
+
*/
|
|
188
|
+
convertPlaceholders(sql) {
|
|
189
|
+
return sql;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Execute a function with a managed PostgreSQL connection
|
|
193
|
+
*/
|
|
194
|
+
async withConnection(fn) {
|
|
195
|
+
const client = new pg.Client({
|
|
196
|
+
connectionString: this.connectionUrl,
|
|
197
|
+
});
|
|
198
|
+
try {
|
|
199
|
+
// Connect to database
|
|
200
|
+
try {
|
|
201
|
+
await client.connect();
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
throw new DbMcpError(ErrorCode.CONNECTION_FAILED, 'Failed to connect to PostgreSQL database', {
|
|
205
|
+
cause: error instanceof Error ? error.message : String(error),
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
// SET command doesn't support parameterized queries, so validate timeout first
|
|
209
|
+
if (!Number.isInteger(this.timeout) || this.timeout < 0) {
|
|
210
|
+
throw new DbMcpError(ErrorCode.CONNECTION_FAILED, `Invalid timeout value: ${this.timeout}`);
|
|
211
|
+
}
|
|
212
|
+
await client.query(`SET statement_timeout = ${this.timeout}`);
|
|
213
|
+
// Create connection wrapper and execute user function
|
|
214
|
+
const connection = new PostgreSqlConnection(client);
|
|
215
|
+
return await fn(connection);
|
|
216
|
+
}
|
|
217
|
+
finally {
|
|
218
|
+
await client.end();
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Clean up resources (no persistent resources in this adapter)
|
|
223
|
+
*/
|
|
224
|
+
async dispose() {
|
|
225
|
+
// No persistent resources to clean up
|
|
226
|
+
// Each connection is created and destroyed per request
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* PostgreSQL connection wrapper
|
|
231
|
+
*
|
|
232
|
+
* Provides AdapterConnection interface over pg.Client.
|
|
233
|
+
* Handles PostgreSQL-specific query execution and metadata retrieval.
|
|
234
|
+
*/
|
|
235
|
+
class PostgreSqlConnection {
|
|
236
|
+
client;
|
|
237
|
+
constructor(client) {
|
|
238
|
+
this.client = client;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Execute a parameterized query
|
|
242
|
+
*
|
|
243
|
+
* SECURITY: All user SQL MUST go through this method with parameters.
|
|
244
|
+
* Uses pg's parameterized query support ($1, $2, etc.)
|
|
245
|
+
*/
|
|
246
|
+
async query(sql, params) {
|
|
247
|
+
const result = await this.client.query({
|
|
248
|
+
text: sql,
|
|
249
|
+
values: params ?? [],
|
|
250
|
+
rowMode: 'array',
|
|
251
|
+
});
|
|
252
|
+
return {
|
|
253
|
+
fields: result.fields.map((f) => ({ name: f.name })),
|
|
254
|
+
rows: result.rows,
|
|
255
|
+
rowCount: result.rowCount ?? 0,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Execute a raw SQL statement (for BEGIN, COMMIT, ROLLBACK)
|
|
260
|
+
*/
|
|
261
|
+
async execute(sql) {
|
|
262
|
+
await this.client.query(sql);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* List tables in a PostgreSQL schema
|
|
266
|
+
*
|
|
267
|
+
* Uses information_schema and pg_class for table metadata.
|
|
268
|
+
* Note: maxTables is accepted for interface compatibility but filtering
|
|
269
|
+
* is done at the caller level to report accurate totalAvailable count.
|
|
270
|
+
*/
|
|
271
|
+
async listTables(schema, _maxTables) {
|
|
272
|
+
const sql = `
|
|
273
|
+
SELECT
|
|
274
|
+
t.table_name as name,
|
|
275
|
+
t.table_schema as schema,
|
|
276
|
+
CASE WHEN t.table_type = 'BASE TABLE' THEN 'table' ELSE 'view' END as type,
|
|
277
|
+
c.reltuples::bigint as rows_estimate
|
|
278
|
+
FROM information_schema.tables t
|
|
279
|
+
LEFT JOIN pg_class c ON c.relname = t.table_name
|
|
280
|
+
AND c.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = t.table_schema)
|
|
281
|
+
WHERE t.table_schema = $1
|
|
282
|
+
ORDER BY t.table_name
|
|
283
|
+
`;
|
|
284
|
+
const result = await this.client.query(sql, [schema]);
|
|
285
|
+
const tables = result.rows.map((row) => ({
|
|
286
|
+
name: row.name,
|
|
287
|
+
schema: row.schema,
|
|
288
|
+
type: row.type,
|
|
289
|
+
rows_estimate: row.rows_estimate !== null ? Number(row.rows_estimate) : null,
|
|
290
|
+
}));
|
|
291
|
+
return {
|
|
292
|
+
tables,
|
|
293
|
+
totalAvailable: tables.length,
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Describe a PostgreSQL table
|
|
298
|
+
*
|
|
299
|
+
* Retrieves columns, indexes, and foreign keys from information_schema and pg_* catalogs.
|
|
300
|
+
*/
|
|
301
|
+
async describeTable(table, schema, limits) {
|
|
302
|
+
// Query 1: Get columns
|
|
303
|
+
const columnsQuery = `
|
|
304
|
+
SELECT
|
|
305
|
+
column_name as name,
|
|
306
|
+
data_type || COALESCE('(' || character_maximum_length || ')', '') as type,
|
|
307
|
+
is_nullable = 'YES' as nullable,
|
|
308
|
+
column_default as default
|
|
309
|
+
FROM information_schema.columns
|
|
310
|
+
WHERE table_schema = $1 AND table_name = $2
|
|
311
|
+
ORDER BY ordinal_position
|
|
312
|
+
`;
|
|
313
|
+
// Query 2: Get primary key columns
|
|
314
|
+
const primaryKeyQuery = `
|
|
315
|
+
SELECT a.attname as column_name
|
|
316
|
+
FROM pg_index i
|
|
317
|
+
JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)
|
|
318
|
+
WHERE i.indrelid = ($1 || '.' || $2)::regclass AND i.indisprimary
|
|
319
|
+
`;
|
|
320
|
+
// Query 3: Get indexes
|
|
321
|
+
const indexesQuery = `
|
|
322
|
+
SELECT
|
|
323
|
+
indexname as name,
|
|
324
|
+
indexdef
|
|
325
|
+
FROM pg_indexes
|
|
326
|
+
WHERE schemaname = $1 AND tablename = $2
|
|
327
|
+
`;
|
|
328
|
+
// Query 4: Get foreign keys
|
|
329
|
+
const foreignKeysQuery = `
|
|
330
|
+
SELECT
|
|
331
|
+
kcu.column_name as column,
|
|
332
|
+
ccu.table_name as ref_table,
|
|
333
|
+
ccu.column_name as ref_column
|
|
334
|
+
FROM information_schema.table_constraints tc
|
|
335
|
+
JOIN information_schema.key_column_usage kcu
|
|
336
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
337
|
+
AND tc.table_schema = kcu.table_schema
|
|
338
|
+
JOIN information_schema.constraint_column_usage ccu
|
|
339
|
+
ON tc.constraint_name = ccu.constraint_name
|
|
340
|
+
AND tc.table_schema = ccu.table_schema
|
|
341
|
+
WHERE tc.constraint_type = 'FOREIGN KEY'
|
|
342
|
+
AND tc.table_schema = $1
|
|
343
|
+
AND tc.table_name = $2
|
|
344
|
+
`;
|
|
345
|
+
// Execute all queries in parallel
|
|
346
|
+
const [columnsResult, primaryKeyResult, indexesResult, foreignKeysResult] = await Promise.all([
|
|
347
|
+
this.client.query(columnsQuery, [schema, table]),
|
|
348
|
+
this.client.query(primaryKeyQuery, [schema, table]),
|
|
349
|
+
this.client.query(indexesQuery, [schema, table]),
|
|
350
|
+
this.client.query(foreignKeysQuery, [schema, table]),
|
|
351
|
+
]);
|
|
352
|
+
// Build set of primary key columns for quick lookup
|
|
353
|
+
const primaryKeyColumns = new Set(primaryKeyResult.rows.map((row) => row.column_name));
|
|
354
|
+
// Build columns array with primaryKey flag
|
|
355
|
+
const allColumns = columnsResult.rows.map((row) => ({
|
|
356
|
+
name: row.name,
|
|
357
|
+
type: row.type,
|
|
358
|
+
nullable: row.nullable,
|
|
359
|
+
default: row.default,
|
|
360
|
+
primaryKey: primaryKeyColumns.has(row.name),
|
|
361
|
+
}));
|
|
362
|
+
// Build indexes array
|
|
363
|
+
const allIndexes = indexesResult.rows.map((row) => {
|
|
364
|
+
const { columns, unique } = parseIndexDef(row.indexdef);
|
|
365
|
+
// An index is primary if all its columns are in the primary key
|
|
366
|
+
const primary = columns.length > 0 &&
|
|
367
|
+
columns.every((col) => primaryKeyColumns.has(col)) &&
|
|
368
|
+
columns.length === primaryKeyColumns.size;
|
|
369
|
+
return {
|
|
370
|
+
name: row.name,
|
|
371
|
+
columns,
|
|
372
|
+
unique,
|
|
373
|
+
primary,
|
|
374
|
+
};
|
|
375
|
+
});
|
|
376
|
+
// Build foreign keys array
|
|
377
|
+
const foreignKeys = foreignKeysResult.rows.map((row) => ({
|
|
378
|
+
column: row.column,
|
|
379
|
+
references: {
|
|
380
|
+
table: row.ref_table,
|
|
381
|
+
column: row.ref_column,
|
|
382
|
+
},
|
|
383
|
+
}));
|
|
384
|
+
// Apply limits and track truncation
|
|
385
|
+
let truncated = false;
|
|
386
|
+
const truncationReasons = [];
|
|
387
|
+
const columns = allColumns.length > limits.maxColumns
|
|
388
|
+
? ((truncated = true),
|
|
389
|
+
truncationReasons.push(`columns (${allColumns.length} > ${limits.maxColumns})`),
|
|
390
|
+
allColumns.slice(0, limits.maxColumns))
|
|
391
|
+
: allColumns;
|
|
392
|
+
const indexes = allIndexes.length > limits.maxIndexes
|
|
393
|
+
? ((truncated = true),
|
|
394
|
+
truncationReasons.push(`indexes (${allIndexes.length} > ${limits.maxIndexes})`),
|
|
395
|
+
allIndexes.slice(0, limits.maxIndexes))
|
|
396
|
+
: allIndexes;
|
|
397
|
+
return {
|
|
398
|
+
table,
|
|
399
|
+
schema,
|
|
400
|
+
columns,
|
|
401
|
+
indexes,
|
|
402
|
+
foreignKeys,
|
|
403
|
+
truncated,
|
|
404
|
+
...(truncated && { truncationReason: truncationReasons.join(', ') }),
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Parse index definition to extract columns and unique flag
|
|
410
|
+
*
|
|
411
|
+
* Example indexdef:
|
|
412
|
+
* `CREATE UNIQUE INDEX users_email_idx ON public.users USING btree (email)`
|
|
413
|
+
* `CREATE INDEX users_name_idx ON public.users USING btree (first_name, last_name)`
|
|
414
|
+
*/
|
|
415
|
+
function parseIndexDef(indexdef) {
|
|
416
|
+
const unique = indexdef.toUpperCase().includes('UNIQUE');
|
|
417
|
+
// Extract columns from parentheses after USING method (btree, hash, etc.)
|
|
418
|
+
const columnsMatch = indexdef.match(/\(([^)]+)\)\s*$/);
|
|
419
|
+
if (!columnsMatch) {
|
|
420
|
+
return { columns: [], unique };
|
|
421
|
+
}
|
|
422
|
+
// Split by comma and clean up column names (remove ASC/DESC, NULLS FIRST/LAST, etc.)
|
|
423
|
+
const columns = columnsMatch[1]
|
|
424
|
+
.split(',')
|
|
425
|
+
.map((col) => col.trim().split(/\s+/)[0])
|
|
426
|
+
.filter(Boolean);
|
|
427
|
+
return { columns, unique };
|
|
428
|
+
}
|
|
429
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/adapters/postgresql/adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,KAAK,EAAa,KAAK,EAAuB,MAAM,kBAAkB,CAAC;AAiBhF,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAE9D,gFAAgF;AAChF,+CAA+C;AAC/C,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,kBAAkB,GAA0B;IAChD,MAAM;IACN,UAAU;IACV,OAAO;IACP,QAAQ;IACR,OAAO;IACP,QAAQ;CACT,CAAC;AAEF;;GAEG;AACH,SAAS,YAAY,CAAC,SAAoB;IACxC,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACvB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB;YACE,OAAO,OAAO,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,SAAoB;IAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAE9C,KAAK,MAAM,MAAM,IAAI,kBAAkB,EAAE,CAAC;QACxC,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC;YAC7D,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;YACvC,OAAO;gBACL,WAAW,EAAE,IAAI;gBACjB,MAAM,EAAE,SAAS,GAAG,6BAA6B;aAClD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,SAAoB;IACjD,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ,IAAI,SAAS,IAAI,SAAS,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,SAAoB;IAC1C,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,SAAS,CAAC,KAAK,KAAK,SAAS,IAAI,SAAS,CAAC,KAAK,KAAK,IAAI,CAAC;AACnE,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IACnB,IAAI,GAAG,YAAqB,CAAC;IAErB,aAAa,CAAS;IACtB,OAAO,CAAS;IAEjC,YAAY,MAAqB;QAC/B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,gFAAgF;IAChF,sBAAsB;IACtB,gFAAgF;IAEhF;;OAEG;IACH,UAAU,CAAC,GAAW;QACpB,IAAI,UAAuB,CAAC;QAE5B,IAAI,CAAC;YACH,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;YAC/E,MAAM,IAAI,UAAU,CAClB,SAAS,CAAC,WAAW,EACrB,uBAAuB,GAAG,OAAO,EACjC,EAAE,GAAG,EAAE,CACR,CAAC;QACJ,CAAC;QAED,iEAAiE;QACjE,MAAM,kBAAkB,GAAG,UAAU,CAAC,MAAM,CAC1C,CAAC,IAAI,EAAE,EAAE,CAAE,IAAI,CAAC,IAAgB,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,CACxE,CAAC;QAEF,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,UAAU,CAClB,SAAS,CAAC,WAAW,EACrB,8BAA8B,EAC9B,EAAE,GAAG,EAAE,CACR,CAAC;QACJ,CAAC;QAED,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,UAAU,CAClB,SAAS,CAAC,eAAe,EACzB,6EAA6E,EAC7E,EAAE,GAAG,EAAE,cAAc,EAAE,kBAAkB,CAAC,MAAM,EAAE,CACnD,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QAE1D,OAAO;YACL,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,cAAc,CAAC,SAAS,CAAC;YACnC,WAAW;YACX,eAAe,EAAE,MAAM;YACvB,GAAG;SACJ,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,GAAW,EAAE,KAAa;QACpC,IAAI,UAAuB,CAAC;QAE5B,IAAI,CAAC;YACH,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,CAAC;QACb,CAAC;QAED,MAAM,kBAAkB,GAAG,UAAU,CAAC,MAAM,CAC1C,CAAC,IAAI,EAAE,EAAE,CAAE,IAAI,CAAC,IAAgB,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,CACxE,CAAC;QAEF,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO,GAAG,CAAC;QACb,CAAC;QAED,MAAM,SAAS,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAExC,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,EAAE,CAAC;YACtC,OAAO,GAAG,CAAC;QACb,CAAC;QAED,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS,IAAI,SAAS,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YAC9D,OAAO,GAAG,CAAC;QACb,CAAC;QAED,SAAS,CAAC,KAAK,GAAG;YAChB,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE;SACzC,CAAC;QAEF,OAAO,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,GAAW,EAAE,IAAyB;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAEpC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,MAAM,IAAI,UAAU,CAClB,SAAS,CAAC,aAAa,EACvB,0EAA0E;oBACxE,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE;oBACzB,cAAc,EAChB,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CACtC,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,MAAM,IAAI,UAAU,CAClB,SAAS,CAAC,aAAa,EACvB,iFAAiF,EACjF,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CACtC,CAAC;YACJ,CAAC;YAED,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBACvB,MAAM,IAAI,UAAU,CAClB,SAAS,CAAC,aAAa,EACvB,MAAM,CAAC,eAAe,IAAI,+BAA+B,EACzD,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CACtC,CAAC;YACJ,CAAC;YAED,MAAM,YAAY,GAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACjE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,MAAM,IAAI,UAAU,CAClB,SAAS,CAAC,aAAa,EACvB,qEAAqE,EACrE,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CACtC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,OAAgB;QAC/B,OAAO,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,UAAU,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,GAAW;QAC7B,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAI,EAA2C;QACjE,MAAM,MAAM,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC;YAC3B,gBAAgB,EAAE,IAAI,CAAC,aAAa;SACrC,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,sBAAsB;YACtB,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YACzB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,UAAU,CAClB,SAAS,CAAC,iBAAiB,EAC3B,0CAA0C,EAC1C;oBACE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC9D,CACF,CAAC;YACJ,CAAC;YAED,+EAA+E;YAC/E,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;gBACxD,MAAM,IAAI,UAAU,CAClB,SAAS,CAAC,iBAAiB,EAC3B,0BAA0B,IAAI,CAAC,OAAO,EAAE,CACzC,CAAC;YACJ,CAAC;YACD,MAAM,MAAM,CAAC,KAAK,CAAC,2BAA2B,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YAE9D,sDAAsD;YACtD,MAAM,UAAU,GAAG,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC;YACpD,OAAO,MAAM,EAAE,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,sCAAsC;QACtC,uDAAuD;IACzD,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,oBAAoB;IACK;IAA7B,YAA6B,MAAiB;QAAjB,WAAM,GAAN,MAAM,CAAW;IAAG,CAAC;IAElD;;;;;OAKG;IACH,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,MAAkB;QACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YACrC,IAAI,EAAE,GAAG;YACT,MAAM,EAAE,MAAM,IAAI,EAAE;YACpB,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QAEH,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACpD,IAAI,EAAE,MAAM,CAAC,IAAmB;YAChC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,CAAC;SAC/B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,GAAW;QACvB,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,UAAkB;QACjD,MAAM,GAAG,GAAG;;;;;;;;;;;KAWX,CAAC;QASF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAW,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QAEhE,MAAM,MAAM,GAAgB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACpD,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,aAAa,EAAE,GAAG,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI;SAC7E,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,MAAM;YACN,cAAc,EAAE,MAAM,CAAC,MAAM;SAC9B,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,aAAa,CACjB,KAAa,EACb,MAAc,EACd,MAAkD;QAwBlD,uBAAuB;QACvB,MAAM,YAAY,GAAG;;;;;;;;;KASpB,CAAC;QAEF,mCAAmC;QACnC,MAAM,eAAe,GAAG;;;;;KAKvB,CAAC;QAEF,uBAAuB;QACvB,MAAM,YAAY,GAAG;;;;;;KAMpB,CAAC;QAEF,4BAA4B;QAC5B,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;KAexB,CAAC;QAEF,kCAAkC;QAClC,MAAM,CAAC,aAAa,EAAE,gBAAgB,EAAE,aAAa,EAAE,iBAAiB,CAAC,GACvE,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAY,YAAY,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC3D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAgB,eAAe,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAClE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAW,YAAY,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC1D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAgB,gBAAgB,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;SACpE,CAAC,CAAC;QAEL,oDAAoD;QACpD,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAC/B,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CACpD,CAAC;QAEF,2CAA2C;QAC3C,MAAM,UAAU,GAAiB,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAChE,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,UAAU,EAAE,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;SAC5C,CAAC,CAAC,CAAC;QAEJ,sBAAsB;QACtB,MAAM,UAAU,GAAgB,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAC7D,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxD,gEAAgE;YAChE,MAAM,OAAO,GACX,OAAO,CAAC,MAAM,GAAG,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAClD,OAAO,CAAC,MAAM,KAAK,iBAAiB,CAAC,IAAI,CAAC;YAE5C,OAAO;gBACL,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,OAAO;gBACP,MAAM;gBACN,OAAO;aACR,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,2BAA2B;QAC3B,MAAM,WAAW,GAAqB,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACzE,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,UAAU,EAAE;gBACV,KAAK,EAAE,GAAG,CAAC,SAAS;gBACpB,MAAM,EAAE,GAAG,CAAC,UAAU;aACvB;SACF,CAAC,CAAC,CAAC;QAEJ,oCAAoC;QACpC,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,MAAM,iBAAiB,GAAa,EAAE,CAAC;QAEvC,MAAM,OAAO,GACX,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,UAAU;YACnC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC;gBACnB,iBAAiB,CAAC,IAAI,CACpB,YAAY,UAAU,CAAC,MAAM,MAAM,MAAM,CAAC,UAAU,GAAG,CACxD;gBACD,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YACzC,CAAC,CAAC,UAAU,CAAC;QAEjB,MAAM,OAAO,GACX,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,UAAU;YACnC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC;gBACnB,iBAAiB,CAAC,IAAI,CACpB,YAAY,UAAU,CAAC,MAAM,MAAM,MAAM,CAAC,UAAU,GAAG,CACxD;gBACD,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YACzC,CAAC,CAAC,UAAU,CAAC;QAEjB,OAAO;YACL,KAAK;YACL,MAAM;YACN,OAAO;YACP,OAAO;YACP,WAAW;YACX,SAAS;YACT,GAAG,CAAC,SAAS,IAAI,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;SACrE,CAAC;IACJ,CAAC;CACF;AAED;;;;;;GAMG;AACH,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEzD,0EAA0E;IAC1E,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;IACjC,CAAC;IAED,qFAAqF;IACrF,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC;SAC5B,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;SACxC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEnB,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite Database Adapter
|
|
3
|
+
*
|
|
4
|
+
* Implements DatabaseAdapter interface for SQLite databases.
|
|
5
|
+
* Uses better-sqlite3 library for synchronous database access.
|
|
6
|
+
*/
|
|
7
|
+
import type { DatabaseAdapter, AdapterConnection, AdapterConfig } from '../types.js';
|
|
8
|
+
import type { ParsedQuery } from '../../types.js';
|
|
9
|
+
/**
|
|
10
|
+
* SQLite database adapter
|
|
11
|
+
*
|
|
12
|
+
* Creates new database handles for each request.
|
|
13
|
+
*
|
|
14
|
+
* Note: better-sqlite3 is synchronous, but we wrap in async for interface
|
|
15
|
+
* compatibility with other adapters.
|
|
16
|
+
*/
|
|
17
|
+
export declare class SqliteAdapter implements DatabaseAdapter {
|
|
18
|
+
readonly type: "sqlite";
|
|
19
|
+
private readonly dbPath;
|
|
20
|
+
private readonly timeout;
|
|
21
|
+
private readonly readonly;
|
|
22
|
+
constructor(config: AdapterConfig);
|
|
23
|
+
/**
|
|
24
|
+
* Get the default schema name for SQLite
|
|
25
|
+
*/
|
|
26
|
+
getDefaultSchema(): string;
|
|
27
|
+
/**
|
|
28
|
+
* Parse and validate a SQLite SQL query
|
|
29
|
+
*/
|
|
30
|
+
parseQuery(sql: string): ParsedQuery;
|
|
31
|
+
/**
|
|
32
|
+
* Inject a LIMIT clause into a SELECT query if it doesn't have one
|
|
33
|
+
*/
|
|
34
|
+
injectLimit(sql: string, limit: number): string;
|
|
35
|
+
/**
|
|
36
|
+
* Validate that a SQL query is appropriate for a specific tool
|
|
37
|
+
*/
|
|
38
|
+
validateQueryForTool(sql: string, tool: 'query' | 'execute'): void;
|
|
39
|
+
/**
|
|
40
|
+
* Get the EXPLAIN prefix for SQLite
|
|
41
|
+
*/
|
|
42
|
+
getExplainPrefix(_analyze: boolean): string;
|
|
43
|
+
/**
|
|
44
|
+
* Convert $1, $2 style placeholders to ? style for SQLite
|
|
45
|
+
*/
|
|
46
|
+
convertPlaceholders(sql: string): string;
|
|
47
|
+
/**
|
|
48
|
+
* Execute a function with a managed SQLite connection
|
|
49
|
+
*/
|
|
50
|
+
withConnection<T>(fn: (conn: AdapterConnection) => Promise<T>): Promise<T>;
|
|
51
|
+
/**
|
|
52
|
+
* Clean up resources (no persistent resources in this adapter)
|
|
53
|
+
*/
|
|
54
|
+
dispose(): Promise<void>;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/sqlite/adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EAEjB,aAAa,EAEd,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,WAAW,EAOZ,MAAM,gBAAgB,CAAC;AAsRxB;;;;;;;GAOG;AACH,qBAAa,aAAc,YAAW,eAAe;IACnD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAElC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;gBAEvB,MAAM,EAAE,aAAa;IAOjC;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAQ1B;;OAEG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW;IAgCpC;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAQ/C;;OAEG;IACH,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI;IAyClE;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM;IAI3C;;OAEG;IACH,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IA+CxC;;OAEG;IACG,cAAc,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAiBhF;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAI/B"}
|