cgraphx 1.3.1 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.claude-template/skills/db-query/SKILL.md +75 -42
- package/dist/.claude-template/skills/db-query/agent-prompt.md +12 -13
- package/dist/.claude-template/skills/export-table-ddl/SKILL.md +167 -0
- package/dist/.claude-template/skills/export-table-ddl/closed-loop.html +163 -0
- package/dist/.claude-template/skills/export-table-ddl/evals/evals.json +26 -0
- package/dist/.claude-template/skills/export-table-ddl/scripts/export-ddl.mjs +163 -0
- package/dist/dbquery/cli.d.ts.map +1 -1
- package/dist/dbquery/cli.js +20 -3
- package/dist/dbquery/cli.js.map +1 -1
- package/dist/dbquery/executor.d.ts.map +1 -1
- package/dist/dbquery/executor.js +15 -23
- package/dist/dbquery/executor.js.map +1 -1
- package/dist/dbquery/format.d.ts +15 -1
- package/dist/dbquery/format.d.ts.map +1 -1
- package/dist/dbquery/format.js +86 -23
- package/dist/dbquery/format.js.map +1 -1
- package/dist/dbquery/identifiers.d.ts +19 -0
- package/dist/dbquery/identifiers.d.ts.map +1 -0
- package/dist/dbquery/identifiers.js +37 -0
- package/dist/dbquery/identifiers.js.map +1 -0
- package/dist/dbquery/index.d.ts +1 -1
- package/dist/dbquery/index.d.ts.map +1 -1
- package/dist/dbquery/index.js.map +1 -1
- package/dist/dbquery/queries.d.ts +23 -3
- package/dist/dbquery/queries.d.ts.map +1 -1
- package/dist/dbquery/queries.js +46 -27
- package/dist/dbquery/queries.js.map +1 -1
- package/dist/dbquery/types.d.ts +2 -15
- package/dist/dbquery/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* export-ddl.mjs — 批量导出项目表的 DDL 到可检索目录。
|
|
4
|
+
*
|
|
5
|
+
* 流程:
|
|
6
|
+
* 1. `cgraphx db schema --mode=tables --profile=P` 拿全表 + 表注释(1 次调用)
|
|
7
|
+
* 2. 过滤到请求的表清单(--tables all 时跳过过滤)
|
|
8
|
+
* 3. 对每张表 `cgraphx db schema --mode=ddl --table=X --profile=P` 拿 DDL 文本(N 次调用)
|
|
9
|
+
* 4. 写 <out>/<project>/INDEX.md(表名 + 注释 + DDL 链接)+ <out>/<project>/ddl/<table>.sql
|
|
10
|
+
*
|
|
11
|
+
* 用法:
|
|
12
|
+
* node export-ddl.mjs \
|
|
13
|
+
* --profile zqassis \
|
|
14
|
+
* --tables ./tables.txt \ # 或 --tables all(全库导出)
|
|
15
|
+
* --out ./schema-dump \
|
|
16
|
+
* --project customer-svc
|
|
17
|
+
*
|
|
18
|
+
* tables 文件格式:每行一个表名,# 开头注释行忽略;或 JSON 数组 ["t1","t2"]。
|
|
19
|
+
*/
|
|
20
|
+
import { execFileSync } from 'node:child_process';
|
|
21
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
|
|
22
|
+
import { resolve, join } from 'node:path';
|
|
23
|
+
|
|
24
|
+
function parseArgs(argv) {
|
|
25
|
+
const args = {};
|
|
26
|
+
for (let i = 0; i < argv.length; i++) {
|
|
27
|
+
const k = argv[i];
|
|
28
|
+
if (k.startsWith('--')) {
|
|
29
|
+
const v = argv[i + 1] && !argv[i + 1].startsWith('--') ? argv[++i] : 'true';
|
|
30
|
+
args[k.slice(2)] = v;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return args;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function readTableList(spec) {
|
|
37
|
+
if (spec === 'all') return null; // null = 不过滤
|
|
38
|
+
const raw = readFileSync(spec, 'utf8');
|
|
39
|
+
const trimmed = raw.trim();
|
|
40
|
+
if (trimmed.startsWith('[')) {
|
|
41
|
+
return JSON.parse(trimmed);
|
|
42
|
+
}
|
|
43
|
+
return trimmed
|
|
44
|
+
.split('\n')
|
|
45
|
+
.map(l => l.trim())
|
|
46
|
+
.filter(l => l && !l.startsWith('#'));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function runCgraphx(cmdArgs, { expectJson = false } = {}) {
|
|
50
|
+
const env = { ...process.env, CGRAPHX_WASM_RELAUNCHED: '1' };
|
|
51
|
+
const bin = process.env.CGRAPHX_BIN || 'cgraphx';
|
|
52
|
+
const out = execFileSync(bin, ['db', ...cmdArgs], {
|
|
53
|
+
encoding: 'utf8',
|
|
54
|
+
env,
|
|
55
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
56
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
57
|
+
});
|
|
58
|
+
if (expectJson) return JSON.parse(out);
|
|
59
|
+
return out;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* 提取 db-query 探索补充的 DISCOVERED 块(含起止标记行),供重 dump 时保留。
|
|
64
|
+
* 块格式见 db-query/SKILL.md。无块返回 null。
|
|
65
|
+
*/
|
|
66
|
+
function extractDiscoveredBlock(content) {
|
|
67
|
+
const start = content.indexOf('-- === DISCOVERED');
|
|
68
|
+
if (start === -1) return null;
|
|
69
|
+
const endMarker = '-- === END DISCOVERED ===';
|
|
70
|
+
const end = content.indexOf(endMarker, start);
|
|
71
|
+
if (end === -1) return content.slice(start).replace(/\n*$/, '\n');
|
|
72
|
+
return content.slice(start, end + endMarker.length).replace(/\n*$/, '\n');
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function main() {
|
|
76
|
+
const args = parseArgs(process.argv.slice(2));
|
|
77
|
+
const profile = args.profile;
|
|
78
|
+
const tablesSpec = args.tables;
|
|
79
|
+
const outDir = args.out;
|
|
80
|
+
const project = args.project;
|
|
81
|
+
if (!profile || !tablesSpec || !outDir || !project) {
|
|
82
|
+
process.stderr.write(
|
|
83
|
+
'Usage: export-ddl.mjs --profile <name> --tables <file|all> --out <dir> --project <name>\n',
|
|
84
|
+
);
|
|
85
|
+
process.exit(5);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// 1. 拿全表 + 注释
|
|
89
|
+
process.stderr.write(`[export-ddl] 拉取 ${profile} 的表清单...\n`);
|
|
90
|
+
const tablesResult = runCgraphx(
|
|
91
|
+
['schema', '--mode=tables', `--profile=${profile}`, '--format=json'],
|
|
92
|
+
{ expectJson: true },
|
|
93
|
+
);
|
|
94
|
+
const allTables = new Map(tablesResult.tables.map(t => [t.name, t.comment ?? '']));
|
|
95
|
+
|
|
96
|
+
// 2. 过滤
|
|
97
|
+
const requested = readTableList(tablesSpec);
|
|
98
|
+
const targets = requested === null
|
|
99
|
+
? [...allTables.keys()]
|
|
100
|
+
: requested.filter(Boolean);
|
|
101
|
+
process.stderr.write(`[export-ddl] 共 ${targets.length} 张表待导出。\n`);
|
|
102
|
+
|
|
103
|
+
// 3. 逐表拉 DDL
|
|
104
|
+
const projectDir = resolve(outDir, project);
|
|
105
|
+
const ddlDir = join(projectDir, 'ddl');
|
|
106
|
+
mkdirSync(ddlDir, { recursive: true });
|
|
107
|
+
|
|
108
|
+
const indexRows = [];
|
|
109
|
+
let ok = 0, missing = 0, failed = 0, preserved = 0;
|
|
110
|
+
for (const table of targets) {
|
|
111
|
+
const comment = allTables.get(table);
|
|
112
|
+
if (comment === undefined) {
|
|
113
|
+
indexRows.push({ table, comment: '(表中不存在)', status: 'missing' });
|
|
114
|
+
missing++;
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
const ddl = runCgraphx(
|
|
119
|
+
['schema', '--mode=ddl', `--table=${table}`, `--profile=${profile}`],
|
|
120
|
+
);
|
|
121
|
+
const filePath = join(ddlDir, `${table}.sql`);
|
|
122
|
+
// 重 dump 时保留 db-query 探索补充的 -- === DISCOVERED === 块
|
|
123
|
+
let out = ddl;
|
|
124
|
+
if (existsSync(filePath)) {
|
|
125
|
+
const old = readFileSync(filePath, 'utf8');
|
|
126
|
+
const discovered = extractDiscoveredBlock(old);
|
|
127
|
+
if (discovered) {
|
|
128
|
+
out = ddl.replace(/\n*$/, '\n') + '\n' + discovered;
|
|
129
|
+
preserved++;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
writeFileSync(filePath, out);
|
|
133
|
+
indexRows.push({ table, comment, status: 'ok' });
|
|
134
|
+
ok++;
|
|
135
|
+
} catch (err) {
|
|
136
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
137
|
+
process.stderr.write(`[export-ddl] ${table} 失败: ${msg}\n`);
|
|
138
|
+
indexRows.push({ table, comment, status: `failed: ${msg.split('\n')[0]}` });
|
|
139
|
+
failed++;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// 4. 写 INDEX.md
|
|
144
|
+
const lines = [
|
|
145
|
+
`# ${project} 表清单`,
|
|
146
|
+
'',
|
|
147
|
+
`共 ${targets.length} 张表(成功 ${ok} / 缺失 ${missing} / 失败 ${failed}),DDL 见 \`ddl/\` 目录。${preserved > 0 ? ` 保留 ${preserved} 张表的 DISCOVERED 补充。` : ''}`,
|
|
148
|
+
'',
|
|
149
|
+
'| 表名 | 注释 | 状态 |',
|
|
150
|
+
'|---|---|---|',
|
|
151
|
+
];
|
|
152
|
+
for (const r of indexRows) {
|
|
153
|
+
const status = r.status === 'ok' ? '✓' : r.status;
|
|
154
|
+
lines.push(`| \`${r.table}\` | ${r.comment || ''} | ${status} |`);
|
|
155
|
+
}
|
|
156
|
+
writeFileSync(join(projectDir, 'INDEX.md'), lines.join('\n') + '\n');
|
|
157
|
+
|
|
158
|
+
process.stderr.write(
|
|
159
|
+
`[export-ddl] 完成 → ${projectDir}/ (成功 ${ok} / 缺失 ${missing} / 失败 ${failed})\n`,
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
main();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/dbquery/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/dbquery/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyHzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4GzD"}
|
package/dist/dbquery/cli.js
CHANGED
|
@@ -21,6 +21,7 @@ exports.registerDbCommands = registerDbCommands;
|
|
|
21
21
|
const node_path_1 = __importDefault(require("node:path"));
|
|
22
22
|
const index_1 = require("./index");
|
|
23
23
|
const init_1 = require("./init");
|
|
24
|
+
const identifiers_1 = require("./identifiers");
|
|
24
25
|
function parseFormat(s) {
|
|
25
26
|
if (!s || s === 'json')
|
|
26
27
|
return 'json';
|
|
@@ -75,8 +76,16 @@ function outputQueryResult(result, format) {
|
|
|
75
76
|
}
|
|
76
77
|
}
|
|
77
78
|
}
|
|
78
|
-
function outputSchemaResult(result, format) {
|
|
79
|
-
|
|
79
|
+
function outputSchemaResult(result, mode, format) {
|
|
80
|
+
if (mode === 'ddl' && 'ddl' in result) {
|
|
81
|
+
// ddl emits the raw CREATE TABLE DDL text, not JSON.
|
|
82
|
+
if (format !== 'json') {
|
|
83
|
+
process.stderr.write(`[db-query] --format=${format} ignored for ddl output (always DDL text).\n`);
|
|
84
|
+
}
|
|
85
|
+
process.stdout.write(result.ddl + '\n');
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
// For other schema results, json is the only first-class format; table/csv
|
|
80
89
|
// fall back to json because the shape varies per mode.
|
|
81
90
|
if (format !== 'json') {
|
|
82
91
|
process.stderr.write(`[db-query] --format=${format} not supported for schema output; using json.\n`);
|
|
@@ -151,8 +160,16 @@ function registerDbCommands(program) {
|
|
|
151
160
|
const projectRoot = process.cwd();
|
|
152
161
|
try {
|
|
153
162
|
const format = parseFormat(options.format);
|
|
163
|
+
if (mode === 'ddl' && options.table) {
|
|
164
|
+
try {
|
|
165
|
+
(0, identifiers_1.validateIdentifier)(options.table, 'table');
|
|
166
|
+
}
|
|
167
|
+
catch (e) {
|
|
168
|
+
throw new ArgError(e instanceof Error ? e.message : String(e));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
154
171
|
const result = await (0, index_1.runSchema)({ mode, table: options.table, profile: options.profile }, projectRoot);
|
|
155
|
-
outputSchemaResult(result, format);
|
|
172
|
+
outputSchemaResult(result, mode, format);
|
|
156
173
|
}
|
|
157
174
|
catch (err) {
|
|
158
175
|
renderErrorAndExit(err);
|
package/dist/dbquery/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/dbquery/cli.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;;;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/dbquery/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/dbquery/executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,OAAO,EAGL,oBAAoB,EAErB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,WAAW,EACX,YAAY,
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/dbquery/executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,OAAO,EAGL,oBAAoB,EAErB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,WAAW,EACX,YAAY,EAEZ,aAAa,EACb,cAAc,EAKf,MAAM,SAAS,CAAC;AAqDjB;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAoD3F;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAmG9F;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAuBrG;AAGD,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC;AAClG,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
|
package/dist/dbquery/executor.js
CHANGED
|
@@ -148,40 +148,32 @@ async function runSchema(input, projectRoot) {
|
|
|
148
148
|
? await (0, mysql_1.createMysqlConnection)(profile)
|
|
149
149
|
: await (0, postgres_1.createPostgresConnection)(profile);
|
|
150
150
|
try {
|
|
151
|
-
//
|
|
151
|
+
// ddl: MySQL uses SHOW CREATE TABLE (single query, server-rendered DDL);
|
|
152
|
+
// PG assembles from column query + pg_get_constraintdef + table comment.
|
|
152
153
|
if (mode === 'ddl') {
|
|
153
|
-
let
|
|
154
|
+
let result;
|
|
154
155
|
if (profile.type === 'mysql') {
|
|
155
|
-
const
|
|
156
|
-
const
|
|
157
|
-
|
|
158
|
-
colsRaw = await driver.execute(colsQ.sql, constants_1.QUERY_TIMEOUT_MS, colsQ.params);
|
|
159
|
-
pkRaw = await driver.execute(pkQ.sql, constants_1.QUERY_TIMEOUT_MS, pkQ.params);
|
|
160
|
-
consRaw = await driver.execute(consQ.sql, constants_1.QUERY_TIMEOUT_MS, consQ.params);
|
|
156
|
+
const showQ = (0, queries_1.mysqlSchemaQuery)('ddl', table, profile.database);
|
|
157
|
+
const raw = await driver.execute(showQ.sql, constants_1.QUERY_TIMEOUT_MS, showQ.params);
|
|
158
|
+
result = (0, format_1.extractMysqlDdl)(raw, table, profile.name, elapsedMs(start));
|
|
161
159
|
}
|
|
162
160
|
else {
|
|
163
|
-
|
|
164
|
-
colsRaw = await driver.execute(parametrized.sql, constants_1.QUERY_TIMEOUT_MS, parametrized.params);
|
|
165
|
-
const
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
'WHEN c.contype = \'u\' THEN \'UNIQUE\' ' +
|
|
173
|
-
'WHEN c.contype = \'f\' THEN \'FOREIGN KEY\' ' +
|
|
174
|
-
'WHEN c.contype = \'c\' THEN \'CHECK\' ELSE c.contype::text END AS type ' +
|
|
175
|
-
'FROM pg_constraint c WHERE c.conrelid = $1::regclass ORDER BY c.conname', constants_1.QUERY_TIMEOUT_MS, [regclass]);
|
|
161
|
+
const schema = profile.schema ?? 'public';
|
|
162
|
+
const colsRaw = await driver.execute(parametrized.sql, constants_1.QUERY_TIMEOUT_MS, parametrized.params);
|
|
163
|
+
const consQ = (0, queries_1.postgresConstraintDefsSql)(table, schema);
|
|
164
|
+
const consRaw = await driver.execute(consQ.sql, constants_1.QUERY_TIMEOUT_MS, consQ.params);
|
|
165
|
+
const idxQ = (0, queries_1.postgresIndexDefsSql)(table, schema);
|
|
166
|
+
const idxRaw = await driver.execute(idxQ.sql, constants_1.QUERY_TIMEOUT_MS, idxQ.params);
|
|
167
|
+
const tcQ = (0, queries_1.postgresTableCommentSql)(table, schema);
|
|
168
|
+
const tcRaw = await driver.execute(tcQ.sql, constants_1.QUERY_TIMEOUT_MS, tcQ.params);
|
|
169
|
+
result = (0, format_1.renderPostgresDdl)(colsRaw, consRaw, idxRaw, tcRaw, table, schema, profile.name, elapsedMs(start));
|
|
176
170
|
}
|
|
177
|
-
const result = (0, format_1.formatDdlResult)(colsRaw, pkRaw, consRaw, table, profile.name, elapsedMs(start));
|
|
178
171
|
(0, logging_1.logQuery)(projectRoot, {
|
|
179
172
|
timestamp: nowIso(),
|
|
180
173
|
profile: profile.name,
|
|
181
174
|
mode,
|
|
182
175
|
sql: parametrized.sql,
|
|
183
176
|
durationMs: elapsedMs(start),
|
|
184
|
-
rowCount: result.columns.length,
|
|
185
177
|
status: 'ok',
|
|
186
178
|
});
|
|
187
179
|
return result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/dbquery/executor.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/dbquery/executor.ts"],"names":[],"mappings":"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"}
|
package/dist/dbquery/format.d.ts
CHANGED
|
@@ -8,7 +8,21 @@
|
|
|
8
8
|
import type { ProfilesConfig, ProfilesResult, QueryResult, RawResult, TablesResult, DdlResult, IndexesResult, TableCommentResult } from './types';
|
|
9
9
|
export declare function formatQueryResult(raw: RawResult, profileName: string, durationMs: number, truncated: boolean): QueryResult;
|
|
10
10
|
export declare function formatTablesResult(raw: RawResult, profileName: string, durationMs: number): TablesResult;
|
|
11
|
-
|
|
11
|
+
/**
|
|
12
|
+
* MySQL DDL — extract the `Create Table` column from `SHOW CREATE TABLE`
|
|
13
|
+
* output. `SHOW CREATE TABLE` returns two columns: `Table` (name) and
|
|
14
|
+
* `Create Table` (the DDL). Access by position to be version-safe (the
|
|
15
|
+
* second column's name varies across MySQL/MariaDB versions).
|
|
16
|
+
*/
|
|
17
|
+
export declare function extractMysqlDdl(raw: RawResult, table: string, profileName: string, durationMs: number): DdlResult;
|
|
18
|
+
/**
|
|
19
|
+
* PostgreSQL DDL — assemble `CREATE TABLE "schema"."tbl" (...)` from the
|
|
20
|
+
* column query + `pg_get_constraintdef` rows + optional table comment.
|
|
21
|
+
* Column comments emit `COMMENT ON COLUMN` statements after the CREATE TABLE
|
|
22
|
+
* (PG comments cannot go inline in CREATE TABLE). Secondary indexes
|
|
23
|
+
* (non-constraint-backed) emit as `CREATE INDEX ...` statements last.
|
|
24
|
+
*/
|
|
25
|
+
export declare function renderPostgresDdl(columnRows: RawResult, constraintDefRows: RawResult, indexDefRows: RawResult, tableCommentRows: RawResult, table: string, schema: string, profileName: string, durationMs: number): DdlResult;
|
|
12
26
|
export declare function formatIndexesResult(raw: RawResult, table: string, profileName: string, durationMs: number): IndexesResult;
|
|
13
27
|
export declare function formatTableCommentResult(raw: RawResult, table: string, profileName: string, durationMs: number): TableCommentResult;
|
|
14
28
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/dbquery/format.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,WAAW,EACX,SAAS,EACT,YAAY,EACZ,SAAS,EACT,aAAa,EACb,kBAAkB,
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/dbquery/format.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,WAAW,EACX,SAAS,EACT,YAAY,EACZ,SAAS,EACT,aAAa,EACb,kBAAkB,EAEnB,MAAM,SAAS,CAAC;AAyCjB,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,SAAS,EACd,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,OAAO,GACjB,WAAW,CAUb;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,SAAS,EACd,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,YAAY,CAQd;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,SAAS,CAWX;AAYD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,SAAS,EACrB,iBAAiB,EAAE,SAAS,EAC5B,YAAY,EAAE,SAAS,EACvB,gBAAgB,EAAE,SAAS,EAC3B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,SAAS,CA4DX;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,aAAa,CA0Cf;AAED,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,kBAAkB,CAMpB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAe3E"}
|
package/dist/dbquery/format.js
CHANGED
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.formatQueryResult = formatQueryResult;
|
|
11
11
|
exports.formatTablesResult = formatTablesResult;
|
|
12
|
-
exports.
|
|
12
|
+
exports.extractMysqlDdl = extractMysqlDdl;
|
|
13
|
+
exports.renderPostgresDdl = renderPostgresDdl;
|
|
13
14
|
exports.formatIndexesResult = formatIndexesResult;
|
|
14
15
|
exports.formatTableCommentResult = formatTableCommentResult;
|
|
15
16
|
exports.formatProfilesResult = formatProfilesResult;
|
|
@@ -78,30 +79,92 @@ function formatTablesResult(raw, profileName, durationMs) {
|
|
|
78
79
|
}));
|
|
79
80
|
return { tables, profile: profileName, durationMs };
|
|
80
81
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
82
|
+
/**
|
|
83
|
+
* MySQL DDL — extract the `Create Table` column from `SHOW CREATE TABLE`
|
|
84
|
+
* output. `SHOW CREATE TABLE` returns two columns: `Table` (name) and
|
|
85
|
+
* `Create Table` (the DDL). Access by position to be version-safe (the
|
|
86
|
+
* second column's name varies across MySQL/MariaDB versions).
|
|
87
|
+
*/
|
|
88
|
+
function extractMysqlDdl(raw, table, profileName, durationMs) {
|
|
89
|
+
const row = raw.rows[0];
|
|
90
|
+
if (!row) {
|
|
91
|
+
throw new Error(`SHOW CREATE TABLE returned no rows for table "${table}".`);
|
|
92
|
+
}
|
|
93
|
+
const values = Object.values(row);
|
|
94
|
+
const ddl = String(values[1] ?? '');
|
|
95
|
+
if (!ddl) {
|
|
96
|
+
throw new Error(`SHOW CREATE TABLE returned empty DDL for table "${table}".`);
|
|
97
|
+
}
|
|
98
|
+
return { table, ddl: ddl.endsWith(';') ? ddl : ddl + ';', profile: profileName, durationMs };
|
|
99
|
+
}
|
|
100
|
+
/** Quote a PostgreSQL identifier with double quotes, doubling embedded ones. */
|
|
101
|
+
function quotePgIdent(name) {
|
|
102
|
+
return '"' + String(name).replace(/"/g, '""') + '"';
|
|
103
|
+
}
|
|
104
|
+
/** Escape a string literal body (single-quote, doubling embedded quotes). */
|
|
105
|
+
function quotePgLiteral(s) {
|
|
106
|
+
return "'" + String(s).replace(/'/g, "''") + "'";
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* PostgreSQL DDL — assemble `CREATE TABLE "schema"."tbl" (...)` from the
|
|
110
|
+
* column query + `pg_get_constraintdef` rows + optional table comment.
|
|
111
|
+
* Column comments emit `COMMENT ON COLUMN` statements after the CREATE TABLE
|
|
112
|
+
* (PG comments cannot go inline in CREATE TABLE). Secondary indexes
|
|
113
|
+
* (non-constraint-backed) emit as `CREATE INDEX ...` statements last.
|
|
114
|
+
*/
|
|
115
|
+
function renderPostgresDdl(columnRows, constraintDefRows, indexDefRows, tableCommentRows, table, schema, profileName, durationMs) {
|
|
116
|
+
const qualifiedTable = `${quotePgIdent(schema)}.${quotePgIdent(table)}`;
|
|
117
|
+
const columnLines = [];
|
|
118
|
+
const columnComments = [];
|
|
119
|
+
for (const row of columnRows.rows) {
|
|
120
|
+
const colName = quotePgIdent(String(row.name ?? ''));
|
|
121
|
+
const dataType = String(row.data_type ?? '');
|
|
122
|
+
const nullable = row.nullable === true || row.nullable === 't' || row.nullable === 1 ||
|
|
123
|
+
String(row.nullable ?? '').toUpperCase() === 'YES';
|
|
124
|
+
const defaultValue = row.default_value !== null && row.default_value !== undefined
|
|
88
125
|
? String(row.default_value)
|
|
89
|
-
: undefined
|
|
90
|
-
comment
|
|
126
|
+
: undefined;
|
|
127
|
+
const comment = row.comment !== undefined && row.comment !== null && row.comment !== ''
|
|
91
128
|
? String(row.comment)
|
|
92
|
-
: undefined
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
.
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
|
|
129
|
+
: undefined;
|
|
130
|
+
let line = ` ${colName} ${dataType}`;
|
|
131
|
+
if (!nullable)
|
|
132
|
+
line += ' NOT NULL';
|
|
133
|
+
if (defaultValue)
|
|
134
|
+
line += ` DEFAULT ${defaultValue}`;
|
|
135
|
+
columnLines.push(line);
|
|
136
|
+
if (comment) {
|
|
137
|
+
columnComments.push(`COMMENT ON COLUMN ${qualifiedTable}.${colName} IS ${quotePgLiteral(comment)};`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
for (const row of constraintDefRows.rows) {
|
|
141
|
+
const def = String(row.def ?? '').trim();
|
|
142
|
+
if (def)
|
|
143
|
+
columnLines.push(` ${def}`);
|
|
144
|
+
}
|
|
145
|
+
const body = columnLines.join(',\n');
|
|
146
|
+
let ddl = `CREATE TABLE ${qualifiedTable} (\n${body}\n);`;
|
|
147
|
+
if (columnComments.length > 0) {
|
|
148
|
+
ddl += '\n' + columnComments.join('\n');
|
|
149
|
+
}
|
|
150
|
+
const tableCommentRow = tableCommentRows.rows[0];
|
|
151
|
+
const tableComment = tableCommentRow && tableCommentRow.comment !== undefined &&
|
|
152
|
+
tableCommentRow.comment !== null && tableCommentRow.comment !== ''
|
|
153
|
+
? String(tableCommentRow.comment)
|
|
154
|
+
: null;
|
|
155
|
+
if (tableComment) {
|
|
156
|
+
ddl += `\nCOMMENT ON TABLE ${qualifiedTable} IS ${quotePgLiteral(tableComment)};`;
|
|
157
|
+
}
|
|
158
|
+
const indexLines = [];
|
|
159
|
+
for (const row of indexDefRows.rows) {
|
|
160
|
+
const def = String(row.def ?? '').trim();
|
|
161
|
+
if (def)
|
|
162
|
+
indexLines.push(def.endsWith(';') ? def : def + ';');
|
|
163
|
+
}
|
|
164
|
+
if (indexLines.length > 0) {
|
|
165
|
+
ddl += '\n' + indexLines.join('\n');
|
|
166
|
+
}
|
|
167
|
+
return { table, ddl, profile: profileName, durationMs };
|
|
105
168
|
}
|
|
106
169
|
function formatIndexesResult(raw, table, profileName, durationMs) {
|
|
107
170
|
// For MySQL: rows come as one-per-column per index. Group by index name.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/dbquery/format.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/dbquery/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identifier validation for SQL identifiers interpolated into schema
|
|
3
|
+
* introspection queries (e.g. `SHOW CREATE TABLE \`db\`.\`tbl\``).
|
|
4
|
+
*
|
|
5
|
+
* The dbquery safety layer (`safety.ts`) only gates user-supplied SQL in
|
|
6
|
+
* `runQuery`; `runSchema` builds its own SQL from CLI-provided identifiers
|
|
7
|
+
* and bypasses safety. This module is the boundary check for those
|
|
8
|
+
* identifiers — rejects anything that could break out of the quoted context
|
|
9
|
+
* or inject a statement. Identifiers come from `--table` / `--profile` /
|
|
10
|
+
* `--schema`, not from user SQL, so this is input validation, not the
|
|
11
|
+
* primary SQL-injection defense.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Reject identifiers that are empty, too long, or contain characters that
|
|
15
|
+
* could break out of a backtick/double-quote context or terminate the
|
|
16
|
+
* statement. Throws on invalid input; returns void on valid.
|
|
17
|
+
*/
|
|
18
|
+
export declare function validateIdentifier(name: string, field: string): void;
|
|
19
|
+
//# sourceMappingURL=identifiers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identifiers.d.ts","sourceRoot":"","sources":["../../src/dbquery/identifiers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAapE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Identifier validation for SQL identifiers interpolated into schema
|
|
4
|
+
* introspection queries (e.g. `SHOW CREATE TABLE \`db\`.\`tbl\``).
|
|
5
|
+
*
|
|
6
|
+
* The dbquery safety layer (`safety.ts`) only gates user-supplied SQL in
|
|
7
|
+
* `runQuery`; `runSchema` builds its own SQL from CLI-provided identifiers
|
|
8
|
+
* and bypasses safety. This module is the boundary check for those
|
|
9
|
+
* identifiers — rejects anything that could break out of the quoted context
|
|
10
|
+
* or inject a statement. Identifiers come from `--table` / `--profile` /
|
|
11
|
+
* `--schema`, not from user SQL, so this is input validation, not the
|
|
12
|
+
* primary SQL-injection defense.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.validateIdentifier = validateIdentifier;
|
|
16
|
+
/** MySQL/PG identifiers are at most 64 bytes. */
|
|
17
|
+
const MAX_IDENTIFIER_LENGTH = 64;
|
|
18
|
+
/**
|
|
19
|
+
* Reject identifiers that are empty, too long, or contain characters that
|
|
20
|
+
* could break out of a backtick/double-quote context or terminate the
|
|
21
|
+
* statement. Throws on invalid input; returns void on valid.
|
|
22
|
+
*/
|
|
23
|
+
function validateIdentifier(name, field) {
|
|
24
|
+
if (typeof name !== 'string' || name.length === 0) {
|
|
25
|
+
throw new Error(`Invalid ${field}: must be a non-empty string.`);
|
|
26
|
+
}
|
|
27
|
+
if (name.length > MAX_IDENTIFIER_LENGTH) {
|
|
28
|
+
throw new Error(`Invalid ${field}: exceeds ${MAX_IDENTIFIER_LENGTH} characters.`);
|
|
29
|
+
}
|
|
30
|
+
// Reject any character that could escape the quoting context or inject SQL.
|
|
31
|
+
// Backtick (MySQL quote), double-quote (PG quote), single-quote (string
|
|
32
|
+
// literal), semicolon (statement terminator), null byte, and control chars.
|
|
33
|
+
if (/[`"';\0\r\n\t]/.test(name) || /[\x00-\x1f]/.test(name)) {
|
|
34
|
+
throw new Error(`Invalid ${field}: contains forbidden characters.`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=identifiers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identifiers.js","sourceRoot":"","sources":["../../src/dbquery/identifiers.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;AAUH,gDAaC;AArBD,iDAAiD;AACjD,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAEjC;;;;GAIG;AACH,SAAgB,kBAAkB,CAAC,IAAY,EAAE,KAAa;IAC5D,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,+BAA+B,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,GAAG,qBAAqB,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,aAAa,qBAAqB,cAAc,CAAC,CAAC;IACpF,CAAC;IACD,4EAA4E;IAC5E,wEAAwE;IACxE,4EAA4E;IAC5E,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,kCAAkC,CAAC,CAAC;IACtE,CAAC;AACH,CAAC"}
|