@adminiumjs/adapter-mysql 0.1.0-rc.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/LICENSE +661 -0
- package/dist/errors.d.ts +11 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +94 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +250 -0
- package/dist/index.js.map +1 -0
- package/dist/introspect.d.ts +92 -0
- package/dist/introspect.d.ts.map +1 -0
- package/dist/introspect.js +620 -0
- package/dist/introspect.js.map +1 -0
- package/dist/query-engine.d.ts +10 -0
- package/dist/query-engine.d.ts.map +1 -0
- package/dist/query-engine.js +59 -0
- package/dist/query-engine.js.map +1 -0
- package/dist/serialization.d.ts +30 -0
- package/dist/serialization.d.ts.map +1 -0
- package/dist/serialization.js +59 -0
- package/dist/serialization.js.map +1 -0
- package/dist/stats.d.ts +21 -0
- package/dist/stats.d.ts.map +1 -0
- package/dist/stats.js +142 -0
- package/dist/stats.js.map +1 -0
- package/dist/type-map.d.ts +50 -0
- package/dist/type-map.d.ts.map +1 -0
- package/dist/type-map.js +193 -0
- package/dist/type-map.js.map +1 -0
- package/package.json +30 -0
|
@@ -0,0 +1,620 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MySQL/MariaDB introspection — 05-introspection-engine.md §4.2.
|
|
3
|
+
*
|
|
4
|
+
* Reads `information_schema` scoped `WHERE TABLE_SCHEMA = <db>`: a FIXED set
|
|
5
|
+
* of set-based queries regardless of table count (≤ 10 statements — 05 §10),
|
|
6
|
+
* joined in memory. This module is executor-agnostic — `introspectMysql`
|
|
7
|
+
* takes a `CatalogExecutor` (any `sql → rows` function) so the assembly
|
|
8
|
+
* logic is testable without the `mysql2` driver; `src/index.ts` wires it to
|
|
9
|
+
* the pool. Mirrors the postgres reference adapter file for file.
|
|
10
|
+
*
|
|
11
|
+
* THE "SCHEMA ONLY" INVARIANT (05 §10): every statement here references
|
|
12
|
+
* `information_schema.*` exclusively — no user table is ever touched during
|
|
13
|
+
* setup (asserted offline by test/introspect.offline.test.ts).
|
|
14
|
+
*/
|
|
15
|
+
import { AdapterError, ENGINE_CAPABILITY_MATRIX, } from '@adminium/engine/adapter';
|
|
16
|
+
import { classifyMysqlDefault, mapMysqlType, parseEnumValues } from './type-map.js';
|
|
17
|
+
/**
|
|
18
|
+
* Static dialect capabilities — 05 §2.1 (probe refines per-connection).
|
|
19
|
+
* Canonical values live in the engine's capability matrix (M9-T04) so the
|
|
20
|
+
* wizard's degradation copy and the adapter never disagree.
|
|
21
|
+
*/
|
|
22
|
+
export const MYSQL_CAPABILITIES = {
|
|
23
|
+
...ENGINE_CAPABILITY_MATRIX.mysql,
|
|
24
|
+
};
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Probe (test / read-only / version gate)
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
/**
|
|
29
|
+
* Session probe. `@@read_only` covers replica/`--read-only` servers; the
|
|
30
|
+
* grants probe (`SHOW GRANTS`) refines per-user write access — 05 §4.2.
|
|
31
|
+
*/
|
|
32
|
+
export const PROBE_SQL = `
|
|
33
|
+
SELECT VERSION() AS server_version,
|
|
34
|
+
CURRENT_USER() AS role_name,
|
|
35
|
+
DATABASE() AS database_name,
|
|
36
|
+
@@read_only AS read_only`;
|
|
37
|
+
/** Grants probe — parsed by {@link interpretGrants}. */
|
|
38
|
+
export const GRANTS_SQL = 'SHOW GRANTS';
|
|
39
|
+
/** TLS probe (guarded — may be absent on stripped-down servers). */
|
|
40
|
+
export const SSL_SQL = "SHOW SESSION STATUS LIKE 'Ssl_cipher'";
|
|
41
|
+
/**
|
|
42
|
+
* Feature-detect the server flavor and version from `VERSION()` output.
|
|
43
|
+
* Handles MariaDB's replication-compat prefix (`5.5.5-10.6.14-MariaDB`).
|
|
44
|
+
*/
|
|
45
|
+
export function detectServerFlavor(version) {
|
|
46
|
+
let text = version.trim();
|
|
47
|
+
const isMariaDb = /mariadb/i.test(text);
|
|
48
|
+
if (isMariaDb)
|
|
49
|
+
text = text.replace(/^5\.5\.5-/, '');
|
|
50
|
+
const match = /^(\d+)\.(\d+)/.exec(text);
|
|
51
|
+
const major = Number.parseInt(match?.[1] ?? '0', 10);
|
|
52
|
+
const minor = Number.parseInt(match?.[2] ?? '0', 10);
|
|
53
|
+
const supported = isMariaDb ? major > 10 || (major === 10 && minor >= 5) : major >= 8;
|
|
54
|
+
return { flavor: isMariaDb ? 'mariadb' : 'mysql', major, minor, supported };
|
|
55
|
+
}
|
|
56
|
+
/** Interpret one {@link PROBE_SQL} row (executor-agnostic, pure). */
|
|
57
|
+
export function interpretProbe(row) {
|
|
58
|
+
const serverVersion = String(row['server_version'] ?? '');
|
|
59
|
+
const readOnlyRaw = row['read_only'];
|
|
60
|
+
return {
|
|
61
|
+
serverVersion,
|
|
62
|
+
flavor: detectServerFlavor(serverVersion),
|
|
63
|
+
roleName: String(row['role_name'] ?? ''),
|
|
64
|
+
databaseName: str(row['database_name']),
|
|
65
|
+
readOnly: readOnlyRaw === 1 || readOnlyRaw === '1' || readOnlyRaw === 'ON',
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Parse `SHOW GRANTS` rows (each row is one `GRANT … ON scope TO user`
|
|
70
|
+
* string) into privilege booleans for `databaseName` — pure, unit-testable.
|
|
71
|
+
*/
|
|
72
|
+
export function interpretGrants(rows, databaseName) {
|
|
73
|
+
const result = { canSelect: false, canWrite: false, canDDL: false };
|
|
74
|
+
for (const row of rows) {
|
|
75
|
+
const line = String(Object.values(row)[0] ?? '');
|
|
76
|
+
const match = /^GRANT\s+(.+?)\s+ON\s+(\S+)\s+TO\s/i.exec(line);
|
|
77
|
+
if (match?.[1] === undefined || match[2] === undefined)
|
|
78
|
+
continue;
|
|
79
|
+
const scope = match[2].replaceAll('`', '').replaceAll('"', '');
|
|
80
|
+
const scopeDb = scope.split('.')[0] ?? '';
|
|
81
|
+
if (scopeDb !== '*' && scopeDb.toLowerCase() !== databaseName.toLowerCase())
|
|
82
|
+
continue;
|
|
83
|
+
const privileges = match[1].toUpperCase();
|
|
84
|
+
const all = privileges.includes('ALL PRIVILEGES') || privileges.trim() === 'ALL';
|
|
85
|
+
if (all || /\bSELECT\b/.test(privileges))
|
|
86
|
+
result.canSelect = true;
|
|
87
|
+
if (all || /\b(INSERT|UPDATE|DELETE)\b/.test(privileges))
|
|
88
|
+
result.canWrite = true;
|
|
89
|
+
if (all || /\b(CREATE|ALTER|DROP)\b/.test(privileges))
|
|
90
|
+
result.canDDL = true;
|
|
91
|
+
}
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
/** Migration/meta tables hidden behind "show system tables" — 05 §8.2. */
|
|
95
|
+
const SYSTEM_TABLE_PATTERN = /^(adminium_|knex_migrations)|^(_prisma_migrations|schema_migrations|ar_internal_metadata|django_migrations|sqlite_sequence)$/;
|
|
96
|
+
/** Enum values are capped at 256 with a warning — 05 §10. */
|
|
97
|
+
const ENUM_VALUE_CAP = 256;
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
// Catalog SQL (fixed set — offline tests assert information_schema-only)
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
function quoteLiteral(value) {
|
|
102
|
+
return `'${value.replaceAll('\\', '\\\\').replaceAll("'", "''")}'`;
|
|
103
|
+
}
|
|
104
|
+
export function tablesSql(schema) {
|
|
105
|
+
return `
|
|
106
|
+
SELECT TABLE_NAME AS table_name,
|
|
107
|
+
TABLE_TYPE AS table_type,
|
|
108
|
+
ENGINE AS engine,
|
|
109
|
+
TABLE_ROWS AS table_rows,
|
|
110
|
+
(COALESCE(DATA_LENGTH, 0) + COALESCE(INDEX_LENGTH, 0)) AS size_bytes,
|
|
111
|
+
TABLE_COMMENT AS table_comment
|
|
112
|
+
FROM information_schema.TABLES
|
|
113
|
+
WHERE TABLE_SCHEMA = ${quoteLiteral(schema)}
|
|
114
|
+
ORDER BY TABLE_NAME`;
|
|
115
|
+
}
|
|
116
|
+
export function columnsSql(schema) {
|
|
117
|
+
return `
|
|
118
|
+
SELECT TABLE_NAME AS table_name,
|
|
119
|
+
COLUMN_NAME AS column_name,
|
|
120
|
+
ORDINAL_POSITION AS ordinal,
|
|
121
|
+
COLUMN_TYPE AS column_type,
|
|
122
|
+
DATA_TYPE AS data_type,
|
|
123
|
+
IS_NULLABLE AS is_nullable,
|
|
124
|
+
COLUMN_DEFAULT AS default_value,
|
|
125
|
+
EXTRA AS extra,
|
|
126
|
+
COLUMN_COMMENT AS column_comment,
|
|
127
|
+
CHARACTER_MAXIMUM_LENGTH AS char_max_length,
|
|
128
|
+
NUMERIC_PRECISION AS numeric_precision,
|
|
129
|
+
NUMERIC_SCALE AS numeric_scale
|
|
130
|
+
FROM information_schema.COLUMNS
|
|
131
|
+
WHERE TABLE_SCHEMA = ${quoteLiteral(schema)}
|
|
132
|
+
ORDER BY TABLE_NAME, ORDINAL_POSITION`;
|
|
133
|
+
}
|
|
134
|
+
export function statisticsSql(schema) {
|
|
135
|
+
return `
|
|
136
|
+
SELECT TABLE_NAME AS table_name,
|
|
137
|
+
INDEX_NAME AS index_name,
|
|
138
|
+
NON_UNIQUE AS non_unique,
|
|
139
|
+
SEQ_IN_INDEX AS seq_in_index,
|
|
140
|
+
COLUMN_NAME AS column_name,
|
|
141
|
+
INDEX_TYPE AS index_type
|
|
142
|
+
FROM information_schema.STATISTICS
|
|
143
|
+
WHERE TABLE_SCHEMA = ${quoteLiteral(schema)}
|
|
144
|
+
ORDER BY TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX`;
|
|
145
|
+
}
|
|
146
|
+
export function foreignKeysSql(schema) {
|
|
147
|
+
return `
|
|
148
|
+
SELECT k.TABLE_NAME AS table_name,
|
|
149
|
+
k.CONSTRAINT_NAME AS constraint_name,
|
|
150
|
+
k.COLUMN_NAME AS column_name,
|
|
151
|
+
k.ORDINAL_POSITION AS ordinal,
|
|
152
|
+
k.REFERENCED_TABLE_SCHEMA AS ref_schema,
|
|
153
|
+
k.REFERENCED_TABLE_NAME AS ref_table,
|
|
154
|
+
k.REFERENCED_COLUMN_NAME AS ref_column,
|
|
155
|
+
r.UPDATE_RULE AS on_update,
|
|
156
|
+
r.DELETE_RULE AS on_delete
|
|
157
|
+
FROM information_schema.KEY_COLUMN_USAGE k
|
|
158
|
+
JOIN information_schema.REFERENTIAL_CONSTRAINTS r
|
|
159
|
+
ON r.CONSTRAINT_SCHEMA = k.CONSTRAINT_SCHEMA
|
|
160
|
+
AND r.CONSTRAINT_NAME = k.CONSTRAINT_NAME
|
|
161
|
+
AND r.TABLE_NAME = k.TABLE_NAME
|
|
162
|
+
WHERE k.TABLE_SCHEMA = ${quoteLiteral(schema)}
|
|
163
|
+
AND k.REFERENCED_TABLE_NAME IS NOT NULL
|
|
164
|
+
ORDER BY k.TABLE_NAME, k.CONSTRAINT_NAME, k.ORDINAL_POSITION`;
|
|
165
|
+
}
|
|
166
|
+
export function tableConstraintsSql(schema) {
|
|
167
|
+
return `
|
|
168
|
+
SELECT TABLE_NAME AS table_name,
|
|
169
|
+
CONSTRAINT_NAME AS constraint_name,
|
|
170
|
+
CONSTRAINT_TYPE AS constraint_type
|
|
171
|
+
FROM information_schema.TABLE_CONSTRAINTS
|
|
172
|
+
WHERE TABLE_SCHEMA = ${quoteLiteral(schema)}
|
|
173
|
+
ORDER BY TABLE_NAME, CONSTRAINT_NAME`;
|
|
174
|
+
}
|
|
175
|
+
/** Guarded: the view exists on MySQL ≥ 8.0.16 / MariaDB ≥ 10.2 only. */
|
|
176
|
+
export function checkConstraintsSql(schema) {
|
|
177
|
+
return `
|
|
178
|
+
SELECT CONSTRAINT_NAME AS constraint_name,
|
|
179
|
+
CHECK_CLAUSE AS check_clause
|
|
180
|
+
FROM information_schema.CHECK_CONSTRAINTS
|
|
181
|
+
WHERE CONSTRAINT_SCHEMA = ${quoteLiteral(schema)}
|
|
182
|
+
ORDER BY CONSTRAINT_NAME`;
|
|
183
|
+
}
|
|
184
|
+
/** The fixed introspection statement set (6 + the probe = 7 — 05 §4.2). */
|
|
185
|
+
export function introspectionStatements(schema) {
|
|
186
|
+
return [
|
|
187
|
+
tablesSql(schema),
|
|
188
|
+
columnsSql(schema),
|
|
189
|
+
statisticsSql(schema),
|
|
190
|
+
foreignKeysSql(schema),
|
|
191
|
+
tableConstraintsSql(schema),
|
|
192
|
+
checkConstraintsSql(schema),
|
|
193
|
+
];
|
|
194
|
+
}
|
|
195
|
+
// ---------------------------------------------------------------------------
|
|
196
|
+
// Row coercion (mysql2 returns numbers/strings depending on column and flags)
|
|
197
|
+
// ---------------------------------------------------------------------------
|
|
198
|
+
function num(value) {
|
|
199
|
+
if (value === null || value === undefined)
|
|
200
|
+
return null;
|
|
201
|
+
const n = Number(value);
|
|
202
|
+
return Number.isFinite(n) ? n : null;
|
|
203
|
+
}
|
|
204
|
+
function str(value) {
|
|
205
|
+
return typeof value === 'string' && value.length > 0 ? value : null;
|
|
206
|
+
}
|
|
207
|
+
// ---------------------------------------------------------------------------
|
|
208
|
+
// CHECK (col IN (...)) → EnumDef synthesis — same approach as the postgres
|
|
209
|
+
// adapter's parseCheckEnum, duplicated by design (adapters never import each
|
|
210
|
+
// other), flavored for MySQL's backticked identifiers, charset introducers
|
|
211
|
+
// (_utf8mb4'…'), and backslash-escaped quotes in CHECK_CLAUSE.
|
|
212
|
+
// ---------------------------------------------------------------------------
|
|
213
|
+
function normalizeCheckClause(clause) {
|
|
214
|
+
return clause
|
|
215
|
+
.replaceAll("\\'", "'") // MySQL 8 escapes the literal delimiters with backslashes
|
|
216
|
+
.replace(/_[a-z][a-z0-9]*\s*(?=')/gi, ''); // strip charset introducers (_utf8mb4'…')
|
|
217
|
+
}
|
|
218
|
+
const CHECK_IN_PATTERN = /[`"]?([a-zA-Z_][\w$]*)[`"]?\s+in\s+\(([^)]+)\)/i;
|
|
219
|
+
/** Parse a `col IN ('a','b')` check shape into a synthesized enum. */
|
|
220
|
+
export function parseCheckEnum(clause) {
|
|
221
|
+
const normalized = normalizeCheckClause(clause);
|
|
222
|
+
const match = CHECK_IN_PATTERN.exec(normalized);
|
|
223
|
+
if (match?.[1] === undefined || match[2] === undefined)
|
|
224
|
+
return null;
|
|
225
|
+
const values = [];
|
|
226
|
+
for (const literal of match[2].matchAll(/'((?:[^']|'')*)'/g)) {
|
|
227
|
+
values.push((literal[1] ?? '').replaceAll("''", "'"));
|
|
228
|
+
}
|
|
229
|
+
return values.length > 0 ? { column: match[1], values } : null;
|
|
230
|
+
}
|
|
231
|
+
/** Strip one balanced outer paren pair from a check expression, like pg. */
|
|
232
|
+
function checkExpression(clause) {
|
|
233
|
+
let text = normalizeCheckClause(clause).trim();
|
|
234
|
+
while (text.startsWith('(') && text.endsWith(')')) {
|
|
235
|
+
let depth = 0;
|
|
236
|
+
let wraps = true;
|
|
237
|
+
for (let i = 0; i < text.length; i += 1) {
|
|
238
|
+
if (text[i] === '(')
|
|
239
|
+
depth += 1;
|
|
240
|
+
else if (text[i] === ')')
|
|
241
|
+
depth -= 1;
|
|
242
|
+
if (depth === 0 && i < text.length - 1) {
|
|
243
|
+
wraps = false;
|
|
244
|
+
break;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if (!wraps)
|
|
248
|
+
break;
|
|
249
|
+
text = text.slice(1, -1).trim();
|
|
250
|
+
}
|
|
251
|
+
return text;
|
|
252
|
+
}
|
|
253
|
+
// ---------------------------------------------------------------------------
|
|
254
|
+
// Assembly
|
|
255
|
+
// ---------------------------------------------------------------------------
|
|
256
|
+
const FK_ACTION_MAP = {
|
|
257
|
+
CASCADE: 'cascade',
|
|
258
|
+
RESTRICT: 'restrict',
|
|
259
|
+
'SET NULL': 'set-null',
|
|
260
|
+
'SET DEFAULT': 'set-default',
|
|
261
|
+
'NO ACTION': 'no-action',
|
|
262
|
+
};
|
|
263
|
+
function compareBy(key) {
|
|
264
|
+
return (a, b) => {
|
|
265
|
+
const ka = key(a);
|
|
266
|
+
const kb = key(b);
|
|
267
|
+
return ka < kb ? -1 : ka > kb ? 1 : 0;
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
/** char(36)/varchar(36) columns named like a uuid — heuristic flag (05 §2.2). */
|
|
271
|
+
const UUID_NAME_PATTERN = /(^|_)(uuid|guid)(_|$)/i;
|
|
272
|
+
/**
|
|
273
|
+
* Run the fixed catalog query set through `exec` and assemble the
|
|
274
|
+
* `DatabaseModel`. Schema only — never touches user rows.
|
|
275
|
+
*/
|
|
276
|
+
export async function introspectMysql(exec, ctx, opts = {}) {
|
|
277
|
+
const startedAt = Date.now();
|
|
278
|
+
const timeoutMs = opts.timeoutMs ?? 30_000;
|
|
279
|
+
const collectRowEstimates = opts.collectRowEstimates ?? true;
|
|
280
|
+
const warnings = [];
|
|
281
|
+
const schema = ctx.databaseName;
|
|
282
|
+
const guarded = async (sql) => {
|
|
283
|
+
if (Date.now() - startedAt > timeoutMs) {
|
|
284
|
+
throw new AdapterError('TIMEOUT', 'introspection exceeded the total time budget', {
|
|
285
|
+
detail: `timeoutMs=${timeoutMs}`,
|
|
286
|
+
hint: 'raise IntrospectOptions.timeoutMs or narrow the table selection',
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
return exec(sql);
|
|
290
|
+
};
|
|
291
|
+
// 1–5. The unconditional statements ----------------------------------------
|
|
292
|
+
const tableRows = await guarded(tablesSql(schema));
|
|
293
|
+
const columnRows = await guarded(columnsSql(schema));
|
|
294
|
+
const statisticRows = await guarded(statisticsSql(schema));
|
|
295
|
+
const fkRows = await guarded(foreignKeysSql(schema));
|
|
296
|
+
const tcRows = await guarded(tableConstraintsSql(schema));
|
|
297
|
+
// 6. CHECK constraints (feature-detected: view absent before 8.0.16/10.2) --
|
|
298
|
+
let ccRows = [];
|
|
299
|
+
try {
|
|
300
|
+
ccRows = await guarded(checkConstraintsSql(schema));
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
if (error instanceof AdapterError && error.code === 'TIMEOUT')
|
|
304
|
+
throw error;
|
|
305
|
+
warnings.push({
|
|
306
|
+
code: 'checks-unavailable',
|
|
307
|
+
message: 'information_schema.CHECK_CONSTRAINTS is unavailable (MySQL < 8.0.16?) — check constraints omitted',
|
|
308
|
+
tableId: null,
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
// -- tables -----------------------------------------------------------------
|
|
312
|
+
const tables = new Map();
|
|
313
|
+
for (const row of tableRows) {
|
|
314
|
+
const name = str(row['table_name']) ?? '';
|
|
315
|
+
if (opts.tableFilter !== undefined && !opts.tableFilter({ schema, name }))
|
|
316
|
+
continue;
|
|
317
|
+
const kind = str(row['table_type']) === 'VIEW' ? 'view' : 'table';
|
|
318
|
+
const engine = str(row['engine']);
|
|
319
|
+
const estimate = num(row['table_rows']);
|
|
320
|
+
if (kind === 'table' && engine !== null && engine.toUpperCase() === 'MYISAM') {
|
|
321
|
+
warnings.push({
|
|
322
|
+
code: 'myisam-no-fks',
|
|
323
|
+
message: `table "${name}" uses the MyISAM engine — foreign keys are not enforced (relation inference weight raised)`,
|
|
324
|
+
tableId: `${schema}.${name}`,
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
tables.set(name, {
|
|
328
|
+
id: `${schema}.${name}`,
|
|
329
|
+
schema,
|
|
330
|
+
name,
|
|
331
|
+
kind,
|
|
332
|
+
comment: str(row['table_comment']),
|
|
333
|
+
columns: [],
|
|
334
|
+
primaryKey: [],
|
|
335
|
+
uniques: [],
|
|
336
|
+
checks: [],
|
|
337
|
+
indexes: [],
|
|
338
|
+
rowCountEstimate: collectRowEstimates && kind === 'table' && estimate !== null ? estimate : null,
|
|
339
|
+
rowCountExact: false,
|
|
340
|
+
sizeBytes: kind === 'table' ? num(row['size_bytes']) : null,
|
|
341
|
+
activity: null, // pg_stat-style counters have no information_schema equivalent
|
|
342
|
+
rls: null, // Postgres only
|
|
343
|
+
system: SYSTEM_TABLE_PATTERN.test(name),
|
|
344
|
+
semantics: null,
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
// -- columns ----------------------------------------------------------------
|
|
348
|
+
const columnEnums = new Map();
|
|
349
|
+
for (const row of columnRows) {
|
|
350
|
+
const table = tables.get(str(row['table_name']) ?? '');
|
|
351
|
+
if (table === undefined)
|
|
352
|
+
continue;
|
|
353
|
+
const columnName = str(row['column_name']) ?? '';
|
|
354
|
+
const dbType = str(row['column_type']) ?? str(row['data_type']) ?? 'unknown';
|
|
355
|
+
const extra = str(row['extra']) ?? '';
|
|
356
|
+
const generated = /\bgenerated\b/i.test(extra) && !/default_generated/i.test(extra);
|
|
357
|
+
const mapped = mapMysqlType(dbType);
|
|
358
|
+
let { logicalType } = mapped;
|
|
359
|
+
let enumRef = null;
|
|
360
|
+
if (logicalType === 'enum') {
|
|
361
|
+
const id = `${table.id}.${columnName}`;
|
|
362
|
+
let values = parseEnumValues(dbType) ?? [];
|
|
363
|
+
if (values.length > ENUM_VALUE_CAP) {
|
|
364
|
+
warnings.push({
|
|
365
|
+
code: 'enum-capped',
|
|
366
|
+
message: `enum "${id}" has ${values.length} values; capped at ${ENUM_VALUE_CAP}`,
|
|
367
|
+
tableId: table.id,
|
|
368
|
+
});
|
|
369
|
+
values = values.slice(0, ENUM_VALUE_CAP);
|
|
370
|
+
}
|
|
371
|
+
if (values.length > 0) {
|
|
372
|
+
columnEnums.set(id, { id, name: columnName, values, source: 'column-type' });
|
|
373
|
+
enumRef = id;
|
|
374
|
+
}
|
|
375
|
+
else {
|
|
376
|
+
logicalType = 'text';
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
else if (logicalType === 'varchar' &&
|
|
380
|
+
mapped.maxLength === 36 &&
|
|
381
|
+
UUID_NAME_PATTERN.test(columnName)) {
|
|
382
|
+
// char(36) + name heuristic — 05 §2.2 (values are never probed at setup).
|
|
383
|
+
logicalType = 'uuid';
|
|
384
|
+
}
|
|
385
|
+
if (mapped.warning === 'set-as-text') {
|
|
386
|
+
warnings.push({
|
|
387
|
+
code: 'set-as-text',
|
|
388
|
+
message: `column "${table.name}.${columnName}" is a set(...) — mapped to text (05 §4.2)`,
|
|
389
|
+
tableId: table.id,
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
else if (mapped.warning === 'year-as-integer') {
|
|
393
|
+
warnings.push({
|
|
394
|
+
code: 'year-as-integer',
|
|
395
|
+
message: `column "${table.name}.${columnName}" is a year — mapped to integer`,
|
|
396
|
+
tableId: table.id,
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
else if (mapped.warning === 'unsigned-overflow') {
|
|
400
|
+
warnings.push({
|
|
401
|
+
code: 'unsigned-overflow',
|
|
402
|
+
message: `column "${table.name}.${columnName}" is ${dbType} — values may exceed the signed range and travel as strings`,
|
|
403
|
+
tableId: table.id,
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
table.columns.push({
|
|
407
|
+
name: columnName,
|
|
408
|
+
ordinal: num(row['ordinal']) ?? 0,
|
|
409
|
+
dbType,
|
|
410
|
+
logicalType,
|
|
411
|
+
nullable: str(row['is_nullable']) === 'YES',
|
|
412
|
+
default: generated ? null : classifyMysqlDefault(str(row['default_value']), extra),
|
|
413
|
+
isPrimaryKey: false,
|
|
414
|
+
isUnique: false,
|
|
415
|
+
isGenerated: generated,
|
|
416
|
+
enumRef,
|
|
417
|
+
maxLength: mapped.maxLength,
|
|
418
|
+
numericPrecision: mapped.numericPrecision,
|
|
419
|
+
numericScale: mapped.numericScale,
|
|
420
|
+
isArray: false, // MySQL has no array types
|
|
421
|
+
comment: str(row['column_comment']),
|
|
422
|
+
references: null,
|
|
423
|
+
semantics: null,
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
const indexAccumulators = new Map();
|
|
427
|
+
for (const row of statisticRows) {
|
|
428
|
+
const table = tables.get(str(row['table_name']) ?? '');
|
|
429
|
+
if (table === undefined)
|
|
430
|
+
continue;
|
|
431
|
+
const indexName = str(row['index_name']) ?? '';
|
|
432
|
+
const key = `${table.name}\x00${indexName}`;
|
|
433
|
+
let acc = indexAccumulators.get(key);
|
|
434
|
+
if (acc === undefined) {
|
|
435
|
+
acc = {
|
|
436
|
+
table,
|
|
437
|
+
unique: num(row['non_unique']) === 0,
|
|
438
|
+
method: str(row['index_type'])?.toLowerCase() ?? null,
|
|
439
|
+
columns: [],
|
|
440
|
+
};
|
|
441
|
+
indexAccumulators.set(key, acc);
|
|
442
|
+
}
|
|
443
|
+
const columnName = str(row['column_name']);
|
|
444
|
+
if (columnName !== null) {
|
|
445
|
+
acc.columns.push({ seq: num(row['seq_in_index']) ?? 0, name: columnName });
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
for (const [key, acc] of indexAccumulators) {
|
|
449
|
+
const indexName = key.split('\x00')[1] ?? '';
|
|
450
|
+
const columns = acc.columns.sort((a, b) => a.seq - b.seq).map((c) => c.name);
|
|
451
|
+
const primary = indexName === 'PRIMARY';
|
|
452
|
+
acc.table.indexes.push({
|
|
453
|
+
name: indexName,
|
|
454
|
+
columns,
|
|
455
|
+
expression: null, // functional index expressions are not surfaced in v1
|
|
456
|
+
unique: acc.unique,
|
|
457
|
+
primary,
|
|
458
|
+
method: acc.method,
|
|
459
|
+
partial: false,
|
|
460
|
+
});
|
|
461
|
+
if (primary) {
|
|
462
|
+
acc.table.primaryKey = columns;
|
|
463
|
+
for (const column of acc.table.columns) {
|
|
464
|
+
if (columns.includes(column.name))
|
|
465
|
+
column.isPrimaryKey = true;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
else if (acc.unique) {
|
|
469
|
+
acc.table.uniques.push({ name: indexName, columns });
|
|
470
|
+
}
|
|
471
|
+
// Covered by a single-column unique constraint/index (05 §2.1) — the PK
|
|
472
|
+
// index counts, mirroring the pg reference adapter.
|
|
473
|
+
if (acc.unique && columns.length === 1) {
|
|
474
|
+
const column = acc.table.columns.find((c) => c.name === columns[0]);
|
|
475
|
+
if (column !== undefined)
|
|
476
|
+
column.isUnique = true;
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
// -- foreign keys (KEY_COLUMN_USAGE + REFERENTIAL_CONSTRAINTS) --------------
|
|
480
|
+
const relations = [];
|
|
481
|
+
const fkAccumulators = new Map();
|
|
482
|
+
for (const row of fkRows) {
|
|
483
|
+
const table = tables.get(str(row['table_name']) ?? '');
|
|
484
|
+
if (table === undefined)
|
|
485
|
+
continue;
|
|
486
|
+
const constraintName = str(row['constraint_name']) ?? '';
|
|
487
|
+
const key = `${table.name}\x00${constraintName}`;
|
|
488
|
+
let acc = fkAccumulators.get(key);
|
|
489
|
+
if (acc === undefined) {
|
|
490
|
+
acc = {
|
|
491
|
+
table,
|
|
492
|
+
refSchema: str(row['ref_schema']) ?? schema,
|
|
493
|
+
refTable: str(row['ref_table']) ?? '',
|
|
494
|
+
columns: [],
|
|
495
|
+
onUpdate: FK_ACTION_MAP[str(row['on_update']) ?? ''] ?? null,
|
|
496
|
+
onDelete: FK_ACTION_MAP[str(row['on_delete']) ?? ''] ?? null,
|
|
497
|
+
};
|
|
498
|
+
fkAccumulators.set(key, acc);
|
|
499
|
+
}
|
|
500
|
+
acc.columns.push({
|
|
501
|
+
seq: num(row['ordinal']) ?? 0,
|
|
502
|
+
from: str(row['column_name']) ?? '',
|
|
503
|
+
to: str(row['ref_column']) ?? '',
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
for (const [key, acc] of fkAccumulators) {
|
|
507
|
+
const constraintName = key.split('\x00')[1] ?? '';
|
|
508
|
+
const ordered = acc.columns.sort((a, b) => a.seq - b.seq);
|
|
509
|
+
const columns = ordered.map((c) => c.from);
|
|
510
|
+
const refColumns = ordered.map((c) => c.to);
|
|
511
|
+
const toTableId = `${acc.refSchema}.${acc.refTable}`;
|
|
512
|
+
// Cross-database FKs are out of scope v1 (05 §4.2); filtered targets warn.
|
|
513
|
+
if (acc.refSchema !== schema || !tables.has(acc.refTable)) {
|
|
514
|
+
warnings.push({
|
|
515
|
+
code: 'fk-target-excluded',
|
|
516
|
+
message: `foreign key "${constraintName}" references "${toTableId}" which is outside the introspected set`,
|
|
517
|
+
tableId: acc.table.id,
|
|
518
|
+
});
|
|
519
|
+
continue;
|
|
520
|
+
}
|
|
521
|
+
relations.push({
|
|
522
|
+
id: `fk:${acc.table.id}(${columns.join(',')})->${toTableId}(${refColumns.join(',')})`,
|
|
523
|
+
kind: 'declared-fk',
|
|
524
|
+
cardinality: 'one-to-many', // refined below once uniques are known
|
|
525
|
+
from: { tableId: acc.table.id, columns },
|
|
526
|
+
to: { tableId: toTableId, columns: refColumns },
|
|
527
|
+
through: null,
|
|
528
|
+
onDelete: acc.onDelete,
|
|
529
|
+
onUpdate: acc.onUpdate,
|
|
530
|
+
selfReferential: acc.table.id === toTableId,
|
|
531
|
+
confidence: 1,
|
|
532
|
+
});
|
|
533
|
+
// Convenience per-column mirror of the declared FK (05 §2.1).
|
|
534
|
+
columns.forEach((columnName, position) => {
|
|
535
|
+
const column = acc.table.columns.find((c) => c.name === columnName);
|
|
536
|
+
const refColumn = refColumns[position];
|
|
537
|
+
if (column !== undefined && column.references === null && refColumn !== undefined) {
|
|
538
|
+
column.references = { tableId: toTableId, column: refColumn };
|
|
539
|
+
}
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
// -- checks (TABLE_CONSTRAINTS type CHECK + CHECK_CONSTRAINTS clause) -------
|
|
543
|
+
const checkEnums = new Map();
|
|
544
|
+
const clauseByConstraint = new Map();
|
|
545
|
+
for (const row of ccRows) {
|
|
546
|
+
const name = str(row['constraint_name']);
|
|
547
|
+
const clause = str(row['check_clause']);
|
|
548
|
+
if (name !== null && clause !== null)
|
|
549
|
+
clauseByConstraint.set(name, clause);
|
|
550
|
+
}
|
|
551
|
+
for (const row of tcRows) {
|
|
552
|
+
if (str(row['constraint_type']) !== 'CHECK')
|
|
553
|
+
continue;
|
|
554
|
+
const table = tables.get(str(row['table_name']) ?? '');
|
|
555
|
+
const name = str(row['constraint_name']);
|
|
556
|
+
if (table === undefined || name === null)
|
|
557
|
+
continue;
|
|
558
|
+
const clause = clauseByConstraint.get(name);
|
|
559
|
+
if (clause === undefined)
|
|
560
|
+
continue;
|
|
561
|
+
table.checks.push({ name, expression: checkExpression(clause) });
|
|
562
|
+
const parsed = parseCheckEnum(clause);
|
|
563
|
+
if (parsed !== null && table.columns.some((c) => c.name === parsed.column)) {
|
|
564
|
+
const id = `${table.id}.${parsed.column}`;
|
|
565
|
+
const column = table.columns.find((c) => c.name === parsed.column);
|
|
566
|
+
if (column !== undefined && column.enumRef === null) {
|
|
567
|
+
checkEnums.set(id, {
|
|
568
|
+
id,
|
|
569
|
+
name: parsed.column,
|
|
570
|
+
values: parsed.values.slice(0, ENUM_VALUE_CAP),
|
|
571
|
+
source: 'check',
|
|
572
|
+
});
|
|
573
|
+
column.enumRef = id;
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
// -- one-to-one refinement: FK column set covered by a unique key -----------
|
|
578
|
+
for (const relation of relations) {
|
|
579
|
+
const table = [...tables.values()].find((t) => t.id === relation.from.tableId);
|
|
580
|
+
if (table === undefined)
|
|
581
|
+
continue;
|
|
582
|
+
const key = [...relation.from.columns].sort().join(' ');
|
|
583
|
+
const uniqueSets = [table.primaryKey, ...table.uniques.map((u) => u.columns)];
|
|
584
|
+
if (uniqueSets.some((set) => set.length > 0 && [...set].sort().join(' ') === key)) {
|
|
585
|
+
relation.cardinality = 'one-to-one';
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
// -- final assembly ----------------------------------------------------------
|
|
589
|
+
const enums = [...columnEnums.values(), ...checkEnums.values()].sort(compareBy((def) => def.id));
|
|
590
|
+
const sortedTables = [...tables.values()].sort(compareBy((t) => t.id));
|
|
591
|
+
for (const table of sortedTables) {
|
|
592
|
+
table.columns.sort((a, b) => a.ordinal - b.ordinal);
|
|
593
|
+
table.indexes.sort(compareBy((i) => i.name));
|
|
594
|
+
table.uniques.sort(compareBy((u) => u.name ?? ''));
|
|
595
|
+
table.checks.sort(compareBy((c) => c.name ?? ''));
|
|
596
|
+
}
|
|
597
|
+
relations.sort(compareBy((r) => r.id));
|
|
598
|
+
const columnCount = sortedTables.reduce((total, table) => total + table.columns.length, 0);
|
|
599
|
+
return {
|
|
600
|
+
irVersion: 1,
|
|
601
|
+
dialect: 'mysql',
|
|
602
|
+
source: { kind: 'live', connectionId: ctx.connectionId },
|
|
603
|
+
name: ctx.databaseName,
|
|
604
|
+
defaultSchema: schema,
|
|
605
|
+
schemas: [schema],
|
|
606
|
+
tables: sortedTables,
|
|
607
|
+
enums,
|
|
608
|
+
relations,
|
|
609
|
+
capabilities: { ...MYSQL_CAPABILITIES },
|
|
610
|
+
introspectedAt: new Date().toISOString(),
|
|
611
|
+
stats: {
|
|
612
|
+
tableCount: sortedTables.length,
|
|
613
|
+
columnCount,
|
|
614
|
+
relationCount: relations.length,
|
|
615
|
+
durationMs: Date.now() - startedAt,
|
|
616
|
+
},
|
|
617
|
+
warnings,
|
|
618
|
+
};
|
|
619
|
+
}
|
|
620
|
+
//# sourceMappingURL=introspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"introspect.js","sourceRoot":"","sources":["../src/introspect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type DataConnectionConfig, type QueryEngine } from '@adminium/engine/adapter';
|
|
2
|
+
/**
|
|
3
|
+
* Build the CRUD query port for a data-role connection. Accepts a DSN string
|
|
4
|
+
* or the role-branded config (which must carry a `dsn`). Kysely's
|
|
5
|
+
* `MysqlDialect` consumes the callback-flavored mysql2 pool; connections are
|
|
6
|
+
* only opened on first query, and `destroy()` tears the pool down
|
|
7
|
+
* idempotently.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createQueryEngine(config: DataConnectionConfig | string): QueryEngine;
|
|
10
|
+
//# sourceMappingURL=query-engine.d.ts.map
|