chkit 0.1.2-beta.7 → 0.2.0-beta.12
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 +69 -56
- package/dist/bin/chkit.js +82 -31
- package/dist/bin/chkit.js.map +1 -1
- package/dist/commands/check/output.js +1 -1
- package/dist/commands/check/output.js.map +1 -1
- package/dist/commands/drift/command.d.ts.map +1 -1
- package/dist/commands/drift/command.js +9 -0
- package/dist/commands/drift/command.js.map +1 -1
- package/dist/commands/drift/compare.d.ts +52 -4
- package/dist/commands/drift/compare.d.ts.map +1 -1
- package/dist/commands/drift/compare.js +258 -49
- package/dist/commands/drift/compare.js.map +1 -1
- package/dist/commands/drift/payload.d.ts +1 -0
- package/dist/commands/drift/payload.d.ts.map +1 -1
- package/dist/commands/drift/payload.js +59 -10
- package/dist/commands/drift/payload.js.map +1 -1
- package/dist/commands/generate/command.d.ts.map +1 -1
- package/dist/commands/generate/command.js +73 -33
- package/dist/commands/generate/command.js.map +1 -1
- package/dist/commands/generate/cutover.d.ts +56 -0
- package/dist/commands/generate/cutover.d.ts.map +1 -0
- package/dist/commands/generate/cutover.js +138 -0
- package/dist/commands/generate/cutover.js.map +1 -0
- package/dist/commands/generate/output.d.ts +3 -2
- package/dist/commands/generate/output.d.ts.map +1 -1
- package/dist/commands/generate/output.js +17 -2
- package/dist/commands/generate/output.js.map +1 -1
- package/dist/commands/generate/plan-pipeline.d.ts.map +1 -1
- package/dist/commands/generate/plan-pipeline.js +35 -36
- package/dist/commands/generate/plan-pipeline.js.map +1 -1
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +21 -4
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/migrate/abandon.d.ts +39 -0
- package/dist/commands/migrate/abandon.d.ts.map +1 -0
- package/dist/commands/migrate/abandon.js +76 -0
- package/dist/commands/migrate/abandon.js.map +1 -0
- package/dist/commands/migrate/apply.d.ts +10 -1
- package/dist/commands/migrate/apply.d.ts.map +1 -1
- package/dist/commands/migrate/apply.js +108 -10
- package/dist/commands/migrate/apply.js.map +1 -1
- package/dist/commands/migrate/async-apply.d.ts +11 -3
- package/dist/commands/migrate/async-apply.d.ts.map +1 -1
- package/dist/commands/migrate/async-apply.js +113 -27
- package/dist/commands/migrate/async-apply.js.map +1 -1
- package/dist/commands/migrate/command.d.ts +46 -1
- package/dist/commands/migrate/command.d.ts.map +1 -1
- package/dist/commands/migrate/command.js +159 -35
- package/dist/commands/migrate/command.js.map +1 -1
- package/dist/commands/migrate/empty.d.ts +8 -0
- package/dist/commands/migrate/empty.d.ts.map +1 -0
- package/dist/commands/migrate/empty.js +17 -0
- package/dist/commands/migrate/empty.js.map +1 -0
- package/dist/commands/migrate/errors.d.ts +22 -0
- package/dist/commands/migrate/errors.d.ts.map +1 -0
- package/dist/commands/migrate/errors.js +31 -0
- package/dist/commands/migrate/errors.js.map +1 -0
- package/dist/commands/migrate/output.d.ts +31 -0
- package/dist/commands/migrate/output.d.ts.map +1 -1
- package/dist/commands/migrate/output.js +120 -9
- package/dist/commands/migrate/output.js.map +1 -1
- package/dist/commands/migrate/prompts.d.ts +1 -0
- package/dist/commands/migrate/prompts.d.ts.map +1 -1
- package/dist/commands/migrate/prompts.js +3 -0
- package/dist/commands/migrate/prompts.js.map +1 -1
- package/dist/commands/migrate/recovery.d.ts +90 -0
- package/dist/commands/migrate/recovery.d.ts.map +1 -0
- package/dist/commands/migrate/recovery.js +163 -0
- package/dist/commands/migrate/recovery.js.map +1 -0
- package/dist/commands/migrate/retry.d.ts +37 -0
- package/dist/commands/migrate/retry.d.ts.map +1 -0
- package/dist/commands/migrate/retry.js +46 -0
- package/dist/commands/migrate/retry.js.map +1 -0
- package/dist/commands/migrate/settings.d.ts +8 -0
- package/dist/commands/migrate/settings.d.ts.map +1 -0
- package/dist/commands/migrate/settings.js +40 -0
- package/dist/commands/migrate/settings.js.map +1 -0
- package/dist/commands/plugin.d.ts.map +1 -1
- package/dist/commands/plugin.js +28 -4
- package/dist/commands/plugin.js.map +1 -1
- package/dist/commands/query.d.ts.map +1 -1
- package/dist/commands/query.js +11 -15
- package/dist/commands/query.js.map +1 -1
- package/dist/commands/registry.d.ts +2 -0
- package/dist/commands/registry.d.ts.map +1 -0
- package/dist/commands/registry.js +228 -0
- package/dist/commands/registry.js.map +1 -0
- package/dist/commands/snapshot/command.d.ts +3 -0
- package/dist/commands/snapshot/command.d.ts.map +1 -0
- package/dist/commands/snapshot/command.js +32 -0
- package/dist/commands/snapshot/command.js.map +1 -0
- package/dist/commands/snapshot/output.d.ts +24 -0
- package/dist/commands/snapshot/output.d.ts.map +1 -0
- package/dist/commands/snapshot/output.js +86 -0
- package/dist/commands/snapshot/output.js.map +1 -0
- package/dist/commands/snapshot/rebuild.d.ts +19 -0
- package/dist/commands/snapshot/rebuild.d.ts.map +1 -0
- package/dist/commands/snapshot/rebuild.js +94 -0
- package/dist/commands/snapshot/rebuild.js.map +1 -0
- package/dist/internal-plugins/core/plugin.d.ts.map +1 -1
- package/dist/internal-plugins/core/plugin.js +2 -0
- package/dist/internal-plugins/core/plugin.js.map +1 -1
- package/dist/registry/build.d.ts +17 -0
- package/dist/registry/build.d.ts.map +1 -0
- package/dist/registry/build.js +94 -0
- package/dist/registry/build.js.map +1 -0
- package/dist/registry/dependencies.d.ts +19 -0
- package/dist/registry/dependencies.d.ts.map +1 -0
- package/dist/registry/dependencies.js +105 -0
- package/dist/registry/dependencies.js.map +1 -0
- package/dist/registry/files.d.ts +4 -0
- package/dist/registry/files.d.ts.map +1 -0
- package/dist/registry/files.js +33 -0
- package/dist/registry/files.js.map +1 -0
- package/dist/registry/install.d.ts +55 -0
- package/dist/registry/install.d.ts.map +1 -0
- package/dist/registry/install.js +175 -0
- package/dist/registry/install.js.map +1 -0
- package/dist/registry/model.d.ts +172 -0
- package/dist/registry/model.d.ts.map +1 -0
- package/dist/registry/model.js +161 -0
- package/dist/registry/model.js.map +1 -0
- package/dist/registry/project-config.d.ts +18 -0
- package/dist/registry/project-config.d.ts.map +1 -0
- package/dist/registry/project-config.js +337 -0
- package/dist/registry/project-config.js.map +1 -0
- package/dist/registry/resolve.d.ts +7 -0
- package/dist/registry/resolve.d.ts.map +1 -0
- package/dist/registry/resolve.js +136 -0
- package/dist/registry/resolve.js.map +1 -0
- package/dist/runtime/argv.d.ts +3 -0
- package/dist/runtime/argv.d.ts.map +1 -0
- package/dist/runtime/argv.js +29 -0
- package/dist/runtime/argv.js.map +1 -0
- package/dist/runtime/command-dispatch.d.ts +2 -1
- package/dist/runtime/command-dispatch.d.ts.map +1 -1
- package/dist/runtime/command-dispatch.js +15 -7
- package/dist/runtime/command-dispatch.js.map +1 -1
- package/dist/runtime/config-merge.d.ts.map +1 -1
- package/dist/runtime/config-merge.js +2 -1
- package/dist/runtime/config-merge.js.map +1 -1
- package/dist/runtime/config.d.ts.map +1 -1
- package/dist/runtime/config.js +2 -1
- package/dist/runtime/config.js.map +1 -1
- package/dist/runtime/global-flags.d.ts +4 -0
- package/dist/runtime/global-flags.d.ts.map +1 -1
- package/dist/runtime/global-flags.js +1 -0
- package/dist/runtime/global-flags.js.map +1 -1
- package/dist/runtime/help.d.ts +1 -1
- package/dist/runtime/help.d.ts.map +1 -1
- package/dist/runtime/help.js +13 -4
- package/dist/runtime/help.js.map +1 -1
- package/dist/runtime/journal-store.d.ts.map +1 -1
- package/dist/runtime/journal-store.js +178 -42
- package/dist/runtime/journal-store.js.map +1 -1
- package/dist/runtime/json-output.d.ts +15 -1
- package/dist/runtime/json-output.d.ts.map +1 -1
- package/dist/runtime/json-output.js +43 -2
- package/dist/runtime/json-output.js.map +1 -1
- package/dist/runtime/migration-store.d.ts +1 -1
- package/dist/runtime/migration-store.d.ts.map +1 -1
- package/dist/runtime/migration-store.js +17 -16
- package/dist/runtime/migration-store.js.map +1 -1
- package/dist/runtime/plugin-runtime/executor-debug.d.ts.map +1 -1
- package/dist/runtime/plugin-runtime/executor-debug.js +10 -8
- package/dist/runtime/plugin-runtime/executor-debug.js.map +1 -1
- package/dist/runtime/plugin-runtime/loader.js +1 -1
- package/dist/runtime/plugin-runtime/loader.js.map +1 -1
- package/dist/runtime/safety-markers.d.ts +4 -2
- package/dist/runtime/safety-markers.d.ts.map +1 -1
- package/dist/runtime/safety-markers.js +4 -2
- package/dist/runtime/safety-markers.js.map +1 -1
- package/dist/runtime/schema-loader.d.ts +20 -1
- package/dist/runtime/schema-loader.d.ts.map +1 -1
- package/dist/runtime/schema-loader.js +26 -0
- package/dist/runtime/schema-loader.js.map +1 -1
- package/dist/runtime/snapshot-document.d.ts +33 -0
- package/dist/runtime/snapshot-document.d.ts.map +1 -0
- package/dist/runtime/snapshot-document.js +65 -0
- package/dist/runtime/snapshot-document.js.map +1 -0
- package/package.json +20 -7
- package/dist/bin/clickhouse-resource.d.ts +0 -4
- package/dist/bin/clickhouse-resource.d.ts.map +0 -1
- package/dist/bin/clickhouse-resource.js +0 -11
- package/dist/bin/clickhouse-resource.js.map +0 -1
- package/dist/bin/command-dispatch.d.ts +0 -13
- package/dist/bin/command-dispatch.d.ts.map +0 -1
- package/dist/bin/command-dispatch.js +0 -186
- package/dist/bin/command-dispatch.js.map +0 -1
- package/dist/bin/command-registry.d.ts +0 -34
- package/dist/bin/command-registry.d.ts.map +0 -1
- package/dist/bin/command-registry.js +0 -87
- package/dist/bin/command-registry.js.map +0 -1
- package/dist/bin/commands/check.d.ts +0 -3
- package/dist/bin/commands/check.d.ts.map +0 -1
- package/dist/bin/commands/check.js +0 -181
- package/dist/bin/commands/check.js.map +0 -1
- package/dist/bin/commands/codegen.d.ts +0 -2
- package/dist/bin/commands/codegen.d.ts.map +0 -1
- package/dist/bin/commands/codegen.js +0 -25
- package/dist/bin/commands/codegen.js.map +0 -1
- package/dist/bin/commands/drift.d.ts +0 -27
- package/dist/bin/commands/drift.d.ts.map +0 -1
- package/dist/bin/commands/drift.js +0 -220
- package/dist/bin/commands/drift.js.map +0 -1
- package/dist/bin/commands/generate/output.d.ts +0 -8
- package/dist/bin/commands/generate/output.d.ts.map +0 -1
- package/dist/bin/commands/generate/output.js +0 -58
- package/dist/bin/commands/generate/output.js.map +0 -1
- package/dist/bin/commands/generate/plan-pipeline.d.ts +0 -7
- package/dist/bin/commands/generate/plan-pipeline.d.ts.map +0 -1
- package/dist/bin/commands/generate/plan-pipeline.js +0 -143
- package/dist/bin/commands/generate/plan-pipeline.js.map +0 -1
- package/dist/bin/commands/generate/rename-mappings.d.ts +0 -29
- package/dist/bin/commands/generate/rename-mappings.d.ts.map +0 -1
- package/dist/bin/commands/generate/rename-mappings.js +0 -195
- package/dist/bin/commands/generate/rename-mappings.js.map +0 -1
- package/dist/bin/commands/generate.d.ts +0 -3
- package/dist/bin/commands/generate.d.ts.map +0 -1
- package/dist/bin/commands/generate.js +0 -158
- package/dist/bin/commands/generate.js.map +0 -1
- package/dist/bin/commands/init.d.ts +0 -2
- package/dist/bin/commands/init.d.ts.map +0 -1
- package/dist/bin/commands/init.js +0 -12
- package/dist/bin/commands/init.js.map +0 -1
- package/dist/bin/commands/migrate.d.ts +0 -3
- package/dist/bin/commands/migrate.d.ts.map +0 -1
- package/dist/bin/commands/migrate.js +0 -288
- package/dist/bin/commands/migrate.js.map +0 -1
- package/dist/bin/commands/plugin-like.d.ts +0 -38
- package/dist/bin/commands/plugin-like.d.ts.map +0 -1
- package/dist/bin/commands/plugin-like.js +0 -101
- package/dist/bin/commands/plugin-like.js.map +0 -1
- package/dist/bin/commands/plugin.d.ts +0 -3
- package/dist/bin/commands/plugin.d.ts.map +0 -1
- package/dist/bin/commands/plugin.js +0 -148
- package/dist/bin/commands/plugin.js.map +0 -1
- package/dist/bin/commands/pull.d.ts +0 -2
- package/dist/bin/commands/pull.d.ts.map +0 -1
- package/dist/bin/commands/pull.js +0 -25
- package/dist/bin/commands/pull.js.map +0 -1
- package/dist/bin/commands/status.d.ts +0 -3
- package/dist/bin/commands/status.d.ts.map +0 -1
- package/dist/bin/commands/status.js +0 -63
- package/dist/bin/commands/status.js.map +0 -1
- package/dist/bin/commands/typegen.d.ts +0 -2
- package/dist/bin/commands/typegen.d.ts.map +0 -1
- package/dist/bin/commands/typegen.js +0 -25
- package/dist/bin/commands/typegen.js.map +0 -1
- package/dist/bin/config.d.ts +0 -13
- package/dist/bin/config.d.ts.map +0 -1
- package/dist/bin/config.js +0 -48
- package/dist/bin/config.js.map +0 -1
- package/dist/bin/debug.d.ts +0 -3
- package/dist/bin/debug.d.ts.map +0 -1
- package/dist/bin/debug.js +0 -14
- package/dist/bin/debug.js.map +0 -1
- package/dist/bin/global-flags.d.ts +0 -16
- package/dist/bin/global-flags.d.ts.map +0 -1
- package/dist/bin/global-flags.js +0 -7
- package/dist/bin/global-flags.js.map +0 -1
- package/dist/bin/help.d.ts +0 -5
- package/dist/bin/help.d.ts.map +0 -1
- package/dist/bin/help.js +0 -84
- package/dist/bin/help.js.map +0 -1
- package/dist/bin/internal-plugins/index.d.ts +0 -3
- package/dist/bin/internal-plugins/index.d.ts.map +0 -1
- package/dist/bin/internal-plugins/index.js +0 -5
- package/dist/bin/internal-plugins/index.js.map +0 -1
- package/dist/bin/internal-plugins/skill-hint.d.ts +0 -31
- package/dist/bin/internal-plugins/skill-hint.d.ts.map +0 -1
- package/dist/bin/internal-plugins/skill-hint.js +0 -172
- package/dist/bin/internal-plugins/skill-hint.js.map +0 -1
- package/dist/bin/journal-store.d.ts +0 -10
- package/dist/bin/journal-store.d.ts.map +0 -1
- package/dist/bin/journal-store.js +0 -137
- package/dist/bin/journal-store.js.map +0 -1
- package/dist/bin/json-output.d.ts +0 -5
- package/dist/bin/json-output.d.ts.map +0 -1
- package/dist/bin/json-output.js +0 -21
- package/dist/bin/json-output.js.map +0 -1
- package/dist/bin/lib.d.ts +0 -5
- package/dist/bin/lib.d.ts.map +0 -1
- package/dist/bin/lib.js +0 -5
- package/dist/bin/lib.js.map +0 -1
- package/dist/bin/logging.d.ts +0 -3
- package/dist/bin/logging.d.ts.map +0 -1
- package/dist/bin/logging.js +0 -31
- package/dist/bin/logging.js.map +0 -1
- package/dist/bin/migration-store.d.ts +0 -22
- package/dist/bin/migration-store.d.ts.map +0 -1
- package/dist/bin/migration-store.js +0 -60
- package/dist/bin/migration-store.js.map +0 -1
- package/dist/bin/plugin-runtime.d.ts +0 -45
- package/dist/bin/plugin-runtime.d.ts.map +0 -1
- package/dist/bin/plugin-runtime.js +0 -513
- package/dist/bin/plugin-runtime.js.map +0 -1
- package/dist/bin/safety-markers.d.ts +0 -23
- package/dist/bin/safety-markers.d.ts.map +0 -1
- package/dist/bin/safety-markers.js +0 -85
- package/dist/bin/safety-markers.js.map +0 -1
- package/dist/bin/schema-loader.d.ts +0 -3
- package/dist/bin/schema-loader.d.ts.map +0 -1
- package/dist/bin/schema-loader.js +0 -11
- package/dist/bin/schema-loader.js.map +0 -1
- package/dist/bin/table-scope.d.ts +0 -38
- package/dist/bin/table-scope.d.ts.map +0 -1
- package/dist/bin/table-scope.js +0 -167
- package/dist/bin/table-scope.js.map +0 -1
- package/dist/bin/version.d.ts +0 -2
- package/dist/bin/version.d.ts.map +0 -1
- package/dist/bin/version.js +0 -5
- package/dist/bin/version.js.map +0 -1
- package/dist/drift-diff.d.ts +0 -8
- package/dist/drift-diff.d.ts.map +0 -1
- package/dist/drift-diff.js +0 -46
- package/dist/drift-diff.js.map +0 -1
- package/dist/drift.d.ts +0 -66
- package/dist/drift.d.ts.map +0 -1
- package/dist/drift.js +0 -220
- package/dist/drift.js.map +0 -1
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import { quoteIdentifier, renderQualifiedName } from '@chkit/core';
|
|
2
|
+
// Drops and object creates keep the order planDiff gave them, which is
|
|
3
|
+
// dependency-aware (#231); the classes this pipeline adds to sort by key.
|
|
4
|
+
const DROP_RANK = 0;
|
|
5
|
+
const CREATE_RANK = 4;
|
|
1
6
|
export function applySelectedRenameSuggestions(plan, selectedSuggestions) {
|
|
2
7
|
if (selectedSuggestions.length === 0)
|
|
3
8
|
return plan;
|
|
@@ -13,15 +18,7 @@ export function applySelectedRenameSuggestions(plan, selectedSuggestions) {
|
|
|
13
18
|
sql: suggestion.confirmationSQL,
|
|
14
19
|
});
|
|
15
20
|
}
|
|
16
|
-
const operations =
|
|
17
|
-
...plan.operations.filter((operation) => !operationKeysToRemove.has(operation.key)),
|
|
18
|
-
...renameOperations,
|
|
19
|
-
].sort((a, b) => {
|
|
20
|
-
const rankOrder = rankOperation(a) - rankOperation(b);
|
|
21
|
-
if (rankOrder !== 0)
|
|
22
|
-
return rankOrder;
|
|
23
|
-
return a.key.localeCompare(b.key);
|
|
24
|
-
});
|
|
21
|
+
const operations = mergeOperations(plan.operations.filter((operation) => !operationKeysToRemove.has(operation.key)), renameOperations);
|
|
25
22
|
return {
|
|
26
23
|
operations,
|
|
27
24
|
riskSummary: summarizeRisk(operations),
|
|
@@ -56,18 +53,10 @@ export function applyExplicitTableRenames(plan, mappings) {
|
|
|
56
53
|
type: 'alter_table_rename_table',
|
|
57
54
|
key: `table:${mapping.newDatabase}.${mapping.newName}:rename_table`,
|
|
58
55
|
risk: 'caution',
|
|
59
|
-
sql: `RENAME TABLE IF EXISTS ${mapping.oldDatabase
|
|
56
|
+
sql: `RENAME TABLE IF EXISTS ${renderQualifiedName(mapping.oldDatabase, mapping.oldName)} TO ${renderQualifiedName(mapping.newDatabase, mapping.newName)};`,
|
|
60
57
|
});
|
|
61
58
|
}
|
|
62
|
-
const operations =
|
|
63
|
-
...plan.operations.filter((operation) => !operationKeysToRemove.has(operation.key)),
|
|
64
|
-
...extraOperations,
|
|
65
|
-
].sort((a, b) => {
|
|
66
|
-
const rankOrder = rankOperation(a) - rankOperation(b);
|
|
67
|
-
if (rankOrder !== 0)
|
|
68
|
-
return rankOrder;
|
|
69
|
-
return a.key.localeCompare(b.key);
|
|
70
|
-
});
|
|
59
|
+
const operations = mergeOperations(plan.operations.filter((operation) => !operationKeysToRemove.has(operation.key)), extraOperations);
|
|
71
60
|
return {
|
|
72
61
|
operations,
|
|
73
62
|
riskSummary: summarizeRisk(operations),
|
|
@@ -99,18 +88,10 @@ export function applyExplicitDictionaryRenames(plan, mappings) {
|
|
|
99
88
|
type: 'rename_dictionary',
|
|
100
89
|
key: `dictionary:${mapping.newDatabase}.${mapping.newName}:rename_dictionary`,
|
|
101
90
|
risk: 'caution',
|
|
102
|
-
sql: `RENAME DICTIONARY IF EXISTS ${mapping.oldDatabase
|
|
91
|
+
sql: `RENAME DICTIONARY IF EXISTS ${renderQualifiedName(mapping.oldDatabase, mapping.oldName)} TO ${renderQualifiedName(mapping.newDatabase, mapping.newName)};`,
|
|
103
92
|
});
|
|
104
93
|
}
|
|
105
|
-
const operations =
|
|
106
|
-
...plan.operations.filter((operation) => !operationKeysToRemove.has(operation.key)),
|
|
107
|
-
...extraOperations,
|
|
108
|
-
].sort((a, b) => {
|
|
109
|
-
const rankOrder = rankOperation(a) - rankOperation(b);
|
|
110
|
-
if (rankOrder !== 0)
|
|
111
|
-
return rankOrder;
|
|
112
|
-
return a.key.localeCompare(b.key);
|
|
113
|
-
});
|
|
94
|
+
const operations = mergeOperations(plan.operations.filter((operation) => !operationKeysToRemove.has(operation.key)), extraOperations);
|
|
114
95
|
return {
|
|
115
96
|
operations,
|
|
116
97
|
riskSummary: summarizeRisk(operations),
|
|
@@ -139,7 +120,7 @@ export function buildExplicitColumnRenameSuggestions(plan, mappings) {
|
|
|
139
120
|
: 'Explicitly confirmed by schema metadata (renamedFrom).',
|
|
140
121
|
dropOperationKey,
|
|
141
122
|
addOperationKey,
|
|
142
|
-
confirmationSQL: `ALTER TABLE ${mapping.database
|
|
123
|
+
confirmationSQL: `ALTER TABLE ${renderQualifiedName(mapping.database, mapping.table)} RENAME COLUMN IF EXISTS ${quoteIdentifier(mapping.from)} TO ${quoteIdentifier(mapping.to)};`,
|
|
143
124
|
});
|
|
144
125
|
}
|
|
145
126
|
return suggestions;
|
|
@@ -158,20 +139,38 @@ export function assertCliColumnMappingsResolvable(cliMappings, plan, nextDefinit
|
|
|
158
139
|
throw new Error(`--rename-column mapping "${mapping.database}.${mapping.table}.${mapping.from}=${mapping.to}" is invalid: planner did not find both matching drop and add operations.`);
|
|
159
140
|
}
|
|
160
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* Combines the planner's operations (minus the ones a rename replaces) with the
|
|
144
|
+
* rename/create_database operations added here. Drops and object creates keep
|
|
145
|
+
* the planner's order, which is dependency-aware (#231); the classes this
|
|
146
|
+
* pipeline adds to are ordered by key, and operations that share a key keep
|
|
147
|
+
* the planner's order, so a column's `REMOVE DEFAULT` still runs before its
|
|
148
|
+
* `MODIFY COLUMN`.
|
|
149
|
+
*/
|
|
150
|
+
function mergeOperations(kept, added) {
|
|
151
|
+
return [...kept, ...added]
|
|
152
|
+
.map((operation, index) => ({ operation, index }))
|
|
153
|
+
.sort((a, b) => {
|
|
154
|
+
const rank = rankOperation(a.operation);
|
|
155
|
+
const rankOrder = rank - rankOperation(b.operation);
|
|
156
|
+
if (rankOrder !== 0)
|
|
157
|
+
return rankOrder;
|
|
158
|
+
if (rank === DROP_RANK || rank === CREATE_RANK)
|
|
159
|
+
return a.index - b.index;
|
|
160
|
+
return a.operation.key.localeCompare(b.operation.key) || a.index - b.index;
|
|
161
|
+
})
|
|
162
|
+
.map(({ operation }) => operation);
|
|
163
|
+
}
|
|
161
164
|
function rankOperation(op) {
|
|
162
165
|
if (op.type.startsWith('drop_'))
|
|
163
|
-
return
|
|
166
|
+
return DROP_RANK;
|
|
164
167
|
if (op.type === 'create_database')
|
|
165
168
|
return 1;
|
|
166
169
|
if (op.type === 'alter_table_rename_table' || op.type === 'rename_dictionary')
|
|
167
170
|
return 2;
|
|
168
171
|
if (op.type.startsWith('alter_'))
|
|
169
172
|
return 3;
|
|
170
|
-
|
|
171
|
-
return 4;
|
|
172
|
-
if (op.type === 'create_view')
|
|
173
|
-
return 5;
|
|
174
|
-
return 6;
|
|
173
|
+
return CREATE_RANK;
|
|
175
174
|
}
|
|
176
175
|
function summarizeRisk(operations) {
|
|
177
176
|
const riskSummary = { safe: 0, caution: 0, danger: 0 };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-pipeline.js","sourceRoot":"","sources":["../../../src/commands/generate/plan-pipeline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plan-pipeline.js","sourceRoot":"","sources":["../../../src/commands/generate/plan-pipeline.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
|
+
/** The example schema `init` writes to src/db/schema/example.ts. */
|
|
2
|
+
export declare const INIT_SCHEMA_TEMPLATE = "import { schema, table } from '@chkit/core'\n\n// Offline generation still needs the real schema namespace.\nconst database = process.env.CLICKHOUSE_DB\nif (!database?.trim()) {\n throw new Error('Set CLICKHOUSE_DB to the intended database before generating migrations.')\n}\n\nconst events = table({\n database,\n name: 'events',\n engine: 'MergeTree',\n columns: [\n { name: 'id', type: 'UInt64' },\n { name: 'source', type: 'String' },\n { name: 'ingested_at', type: 'DateTime64(3)', default: { expression: 'now64(3)' } },\n ],\n primaryKey: ['id'],\n orderBy: ['id'],\n partitionBy: 'toYYYYMM(ingested_at)',\n})\n\nexport default schema(events)\n";
|
|
1
3
|
export declare function cmdInit(argv?: string[]): Promise<void>;
|
|
2
4
|
//# sourceMappingURL=init.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAQA,oEAAoE;AACpE,eAAO,MAAM,oBAAoB,iqBAAiqB,CAAA;AAUlsB,wBAAsB,OAAO,CAAC,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDhE"}
|
package/dist/commands/init.js
CHANGED
|
@@ -2,13 +2,29 @@ import process from 'node:process';
|
|
|
2
2
|
import { relative, resolve } from 'node:path';
|
|
3
3
|
import { DEFAULT_CONFIG_FILE, writeIfMissing } from '../runtime/config.js';
|
|
4
4
|
import { ensureProjectDependencies } from '../runtime/deps.js';
|
|
5
|
+
/** The example schema `init` writes to src/db/schema/example.ts. */
|
|
6
|
+
export const INIT_SCHEMA_TEMPLATE = `import { schema, table } from '@chkit/core'\n\n// Offline generation still needs the real schema namespace.\nconst database = process.env.CLICKHOUSE_DB\nif (!database?.trim()) {\n throw new Error('Set CLICKHOUSE_DB to the intended database before generating migrations.')\n}\n\nconst events = table({\n database,\n name: 'events',\n engine: 'MergeTree',\n columns: [\n { name: 'id', type: 'UInt64' },\n { name: 'source', type: 'String' },\n { name: 'ingested_at', type: 'DateTime64(3)', default: { expression: 'now64(3)' } },\n ],\n primaryKey: ['id'],\n orderBy: ['id'],\n partitionBy: 'toYYYYMM(ingested_at)',\n})\n\nexport default schema(events)\n`;
|
|
5
7
|
export async function cmdInit(argv = []) {
|
|
8
|
+
if (argv.includes('--help') || argv.includes('-h')) {
|
|
9
|
+
console.log(`chkit init [options]
|
|
10
|
+
|
|
11
|
+
Create a TypeScript config and example schema; install project dependencies.
|
|
12
|
+
|
|
13
|
+
-y, --yes Skip interactive onboarding
|
|
14
|
+
--connect <choice> claim, account, clickhouse, or later
|
|
15
|
+
--email <email> Email for account onboarding
|
|
16
|
+
--code <code> Verification code
|
|
17
|
+
--org-name <name> Organization name
|
|
18
|
+
-h, --help Show help without creating files or connecting
|
|
19
|
+
`);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
6
22
|
const cwd = process.cwd();
|
|
7
23
|
const configPath = resolve(cwd, DEFAULT_CONFIG_FILE);
|
|
8
24
|
const schemaPath = resolve(cwd, 'src/db/schema/example.ts');
|
|
9
25
|
const options = parseInitOptions(argv);
|
|
10
|
-
const wroteConfig = await writeIfMissing(configPath, `import { defineConfig } from '@chkit/core'\n\nexport default defineConfig({\n schema: './src/db/schema/**/*.ts',\n outDir: './chkit',\n migrationsDir: './chkit/migrations',\n metaDir: './chkit/meta',\n plugins: [\n // Register plugins inline. Example:\n // import { codegen } from '@chkit/plugin-codegen'\n // codegen({ emitZod: true }),\n ],\n
|
|
11
|
-
const wroteSchema = await writeIfMissing(schemaPath,
|
|
26
|
+
const wroteConfig = await writeIfMissing(configPath, `import { defineConfig } from '@chkit/core'\n\nfunction requiredEnv(name: string): string {\n const value = process.env[name]\n if (value === undefined || (name !== 'CLICKHOUSE_PASSWORD' && value.trim() === '')) {\n throw new Error(\`Set \${name} explicitly before connecting to ClickHouse (an empty password is allowed).\`)\n }\n return value\n}\n\nexport default defineConfig({\n schema: './src/db/schema/**/*.ts',\n outDir: './chkit',\n migrationsDir: './chkit/migrations',\n metaDir: './chkit/meta',\n plugins: [\n // Register plugins inline. Example:\n // import { codegen } from '@chkit/plugin-codegen'\n // codegen({ emitZod: true }),\n ],\n // Preserve an explicitly supplied target for offline generation as well.\n // Without a URL, a registered provider plugin may supply the connection.\n clickhouse: process.env.CLICKHOUSE_URL ? {\n url: requiredEnv('CLICKHOUSE_URL'),\n username: requiredEnv('CLICKHOUSE_USER'),\n password: requiredEnv('CLICKHOUSE_PASSWORD'),\n database: requiredEnv('CLICKHOUSE_DB'),\n cluster: process.env.CLICKHOUSE_CLUSTER,\n } : undefined,\n})\n`);
|
|
27
|
+
const wroteSchema = await writeIfMissing(schemaPath, INIT_SCHEMA_TEMPLATE);
|
|
12
28
|
if (wroteConfig)
|
|
13
29
|
console.log(`Created ${relative(cwd, configPath)}`);
|
|
14
30
|
if (wroteSchema)
|
|
@@ -24,10 +40,11 @@ export async function cmdInit(argv = []) {
|
|
|
24
40
|
if (wroteConfig || wroteSchema) {
|
|
25
41
|
console.log('');
|
|
26
42
|
console.log('Next steps:');
|
|
27
|
-
console.log(' 1. Set
|
|
43
|
+
console.log(' 1. Set CLICKHOUSE_DB to the intended database before generating migrations.');
|
|
28
44
|
console.log(' 2. Edit src/db/schema/example.ts to match your data.');
|
|
29
45
|
console.log(' 3. Run: npx chkit generate --name init');
|
|
30
|
-
console.log(' 4.
|
|
46
|
+
console.log(' 4. Set CLICKHOUSE_URL, CLICKHOUSE_USER, and CLICKHOUSE_PASSWORD explicitly before connecting.');
|
|
47
|
+
console.log(' 5. Run: npx chkit migrate --apply');
|
|
31
48
|
console.log('');
|
|
32
49
|
console.log('Docs: https://chkit.obsessiondb.com/getting-started/add-to-existing-project/');
|
|
33
50
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAE7C,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { JournalStore, MigrationRowState, OperationState, OperationStatus } from '../../runtime/journal-store.js';
|
|
2
|
+
/** What --abandon reports, before and after it resets the journal state. */
|
|
3
|
+
export interface AbandonReport {
|
|
4
|
+
migration: string;
|
|
5
|
+
/** Checksum recorded for the failed attempt. */
|
|
6
|
+
checksum: string;
|
|
7
|
+
/** Statements that completed, including those an earlier --abandon marked failed. */
|
|
8
|
+
completedStatements: number;
|
|
9
|
+
/** The recorded per-statement progress, sorted by statement index. */
|
|
10
|
+
operations: OperationState[];
|
|
11
|
+
}
|
|
12
|
+
/** Read the in-progress state --abandon <migration> resets; throws when there is none. */
|
|
13
|
+
export declare function readAbandonableState(input: {
|
|
14
|
+
migration: string;
|
|
15
|
+
appliedNames: ReadonlySet<string>;
|
|
16
|
+
}, deps: {
|
|
17
|
+
journalStore: JournalStore;
|
|
18
|
+
}): Promise<MigrationRowState>;
|
|
19
|
+
/**
|
|
20
|
+
* Supersede an in-progress state with a version in which every recorded
|
|
21
|
+
* statement failed. The next apply runs the file from statement 1: every
|
|
22
|
+
* statement runs its `-- before-retry:` SQL first, sync statements run again,
|
|
23
|
+
* and async statements keep their query ids, so they take the retry path
|
|
24
|
+
* (compensation, then a resubmit).
|
|
25
|
+
* Like every journal write this is an INSERT of a newer row version, so it
|
|
26
|
+
* needs no DELETE privilege and leaves no mutation behind.
|
|
27
|
+
*/
|
|
28
|
+
export declare function abandonMigrationState(state: MigrationRowState, deps: {
|
|
29
|
+
journalStore: JournalStore;
|
|
30
|
+
now?: () => number;
|
|
31
|
+
}): Promise<void>;
|
|
32
|
+
export declare function abandonReport(state: MigrationRowState): AbandonReport;
|
|
33
|
+
/**
|
|
34
|
+
* The status a statement had before --abandon marked it failed, or its
|
|
35
|
+
* recorded status when no abandon touched it. A statement that completed
|
|
36
|
+
* before an abandon stays applied in ClickHouse.
|
|
37
|
+
*/
|
|
38
|
+
export declare function statusBeforeAbandon(op: OperationState): OperationStatus;
|
|
39
|
+
//# sourceMappingURL=abandon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abandon.d.ts","sourceRoot":"","sources":["../../../src/commands/migrate/abandon.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,eAAe,EAChB,MAAM,gCAAgC,CAAA;AAIvC,4EAA4E;AAC5E,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAA;IAChB,qFAAqF;IACrF,mBAAmB,EAAE,MAAM,CAAA;IAC3B,sEAAsE;IACtE,UAAU,EAAE,cAAc,EAAE,CAAA;CAC7B;AAID,0FAA0F;AAC1F,wBAAsB,oBAAoB,CACxC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAAE,EAC/D,IAAI,EAAE;IAAE,YAAY,EAAE,YAAY,CAAA;CAAE,GACnC,OAAO,CAAC,iBAAiB,CAAC,CAY5B;AAED;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,iBAAiB,EACxB,IAAI,EAAE;IAAE,YAAY,EAAE,YAAY,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAAE,GACvD,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,iBAAiB,GAAG,aAAa,CAQrE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,cAAc,GAAG,eAAe,CAEvE"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { isoWithoutZone } from './async-apply.js';
|
|
2
|
+
import { MigrateError } from './errors.js';
|
|
3
|
+
const OPERATION_STATUSES = ['completed', 'failed', 'started'];
|
|
4
|
+
/** Read the in-progress state --abandon <migration> resets; throws when there is none. */
|
|
5
|
+
export async function readAbandonableState(input, deps) {
|
|
6
|
+
const { migration } = input;
|
|
7
|
+
if (input.appliedNames.has(migration))
|
|
8
|
+
throw alreadyAppliedError(migration);
|
|
9
|
+
const state = await deps.journalStore.readMigrationState(migration);
|
|
10
|
+
if (state === null) {
|
|
11
|
+
throw new MigrateError('migration_not_in_progress', `Cannot abandon ${migration}: the journal has no in-progress state for it.`);
|
|
12
|
+
}
|
|
13
|
+
if (state.migrationCompleted)
|
|
14
|
+
throw alreadyAppliedError(migration);
|
|
15
|
+
return state;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Supersede an in-progress state with a version in which every recorded
|
|
19
|
+
* statement failed. The next apply runs the file from statement 1: every
|
|
20
|
+
* statement runs its `-- before-retry:` SQL first, sync statements run again,
|
|
21
|
+
* and async statements keep their query ids, so they take the retry path
|
|
22
|
+
* (compensation, then a resubmit).
|
|
23
|
+
* Like every journal write this is an INSERT of a newer row version, so it
|
|
24
|
+
* needs no DELETE privilege and leaves no mutation behind.
|
|
25
|
+
*/
|
|
26
|
+
export async function abandonMigrationState(state, deps) {
|
|
27
|
+
const now = isoWithoutZone(new Date((deps.now ?? Date.now)()));
|
|
28
|
+
await deps.journalStore.writeMigrationState(abandonedState(state, now));
|
|
29
|
+
}
|
|
30
|
+
export function abandonReport(state) {
|
|
31
|
+
const operations = [...state.operations].sort((a, b) => a.operationIndex - b.operationIndex);
|
|
32
|
+
return {
|
|
33
|
+
migration: state.name,
|
|
34
|
+
checksum: state.checksum,
|
|
35
|
+
completedStatements: operations.filter((op) => statusBeforeAbandon(op) === 'completed').length,
|
|
36
|
+
operations,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The status a statement had before --abandon marked it failed, or its
|
|
41
|
+
* recorded status when no abandon touched it. A statement that completed
|
|
42
|
+
* before an abandon stays applied in ClickHouse.
|
|
43
|
+
*/
|
|
44
|
+
export function statusBeforeAbandon(op) {
|
|
45
|
+
return abandonedFrom(op) ?? op.status;
|
|
46
|
+
}
|
|
47
|
+
// A statement an earlier --abandon already marked failed keeps that record,
|
|
48
|
+
// so abandoning again does not lose which statements had completed.
|
|
49
|
+
function abandonedState(state, now) {
|
|
50
|
+
return {
|
|
51
|
+
...state,
|
|
52
|
+
appliedAt: now,
|
|
53
|
+
migrationCompleted: false,
|
|
54
|
+
operations: state.operations.map((op) => abandonedFrom(op) !== undefined
|
|
55
|
+
? op
|
|
56
|
+
: {
|
|
57
|
+
...op,
|
|
58
|
+
status: 'failed',
|
|
59
|
+
finishedAt: op.finishedAt ?? now,
|
|
60
|
+
lastError: abandonedError(op.status),
|
|
61
|
+
}),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/** The status before an earlier --abandon, or undefined when no abandon marked this statement. */
|
|
65
|
+
function abandonedFrom(op) {
|
|
66
|
+
if (op.status !== 'failed')
|
|
67
|
+
return undefined;
|
|
68
|
+
return OPERATION_STATUSES.find((status) => op.lastError === abandonedError(status));
|
|
69
|
+
}
|
|
70
|
+
function abandonedError(previous) {
|
|
71
|
+
return `abandoned via chkit migrate --abandon (was ${previous})`;
|
|
72
|
+
}
|
|
73
|
+
function alreadyAppliedError(migration) {
|
|
74
|
+
return new MigrateError('migration_already_applied', `Cannot abandon ${migration}: it is already applied. --abandon only resets a migration that failed part-way; to undo an applied migration, write a new migration.`);
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=abandon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abandon.js","sourceRoot":"","sources":["../../../src/commands/migrate/abandon.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ClickHouseExecutor } from '@chkit/clickhouse';
|
|
1
|
+
import { type ClickHouseExecutor, type ClickHouseSettings } from '@chkit/clickhouse';
|
|
2
2
|
import type { ResolvedChxConfig } from '@chkit/core';
|
|
3
3
|
import type { ParsedFlags, PluginRuntime, TableScope } from '../../plugins.js';
|
|
4
4
|
import type { createJournalStore } from '../../runtime/journal-store.js';
|
|
@@ -28,6 +28,15 @@ export declare function applyMigration(input: {
|
|
|
28
28
|
flags: ParsedFlags;
|
|
29
29
|
migrationsDir: string;
|
|
30
30
|
file: string;
|
|
31
|
+
/** --setting values, sent with every statement of the migration (sync, async, barrier, before-retry). */
|
|
32
|
+
settings?: ClickHouseSettings;
|
|
33
|
+
/** Set when --retry verified an edit of this in-progress migration before the run (#233). */
|
|
34
|
+
retry?: {
|
|
35
|
+
previousChecksum: string;
|
|
36
|
+
checksum: string;
|
|
37
|
+
};
|
|
38
|
+
/** Progress lines; the command sends them to stderr in --json mode. */
|
|
39
|
+
log?: (line: string) => void;
|
|
31
40
|
}): Promise<MigrationJournalEntry>;
|
|
32
41
|
export {};
|
|
33
42
|
//# sourceMappingURL=apply.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../../src/commands/migrate/apply.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../../src/commands/migrate/apply.ts"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EAExB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE9E,OAAO,KAAK,EACV,kBAAkB,EAInB,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAe,KAAK,qBAAqB,EAAE,MAAM,kCAAkC,CAAA;AAsB1F,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAYzD,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,SAAM,GAAG,MAAM,CAG/D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,OAAO,CAAA;CACf,GAAG,KAAK,CAQR;AAsBD,wBAAsB,cAAc,CAAC,KAAK,EAAE;IAC1C,EAAE,EAAE,kBAAkB,CAAA;IACtB,YAAY,EAAE,YAAY,CAAA;IAC1B,aAAa,EAAE,aAAa,CAAA;IAC5B,MAAM,EAAE,iBAAiB,CAAA;IACzB,UAAU,EAAE,UAAU,CAAA;IACtB,KAAK,EAAE,WAAW,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,yGAAyG;IACzG,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IAC7B,6FAA6F;IAC7F,KAAK,CAAC,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IACtD,uEAAuE;IACvE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAC7B,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAoJjC"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { readFile } from 'node:fs/promises';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
-
import { waitForDDLPropagation } from '@chkit/clickhouse';
|
|
3
|
+
import { assertNoFireAndForgetAsyncInserts, parseExchangeTables, waitForDDLPropagation, waitForExchange, waitForInsertBarrier, } from '@chkit/clickhouse';
|
|
4
4
|
import { debug } from '../../runtime/debug.js';
|
|
5
5
|
import { checksumSQL } from '../../runtime/migration-store.js';
|
|
6
6
|
import { extractExecutableStatements, extractMigrationOperationSummaries, } from '../../runtime/safety-markers.js';
|
|
7
7
|
import { applyAsyncStatement, freshMigrationState, isoWithoutZone, upsertOperation, } from './async-apply.js';
|
|
8
|
+
import { inProgressChecksumMismatchError } from './errors.js';
|
|
9
|
+
import { hasStatementProgress, rebaseInProgressState, retryMismatchError, statementIdentities, statementIdentity, verifyRetryEdit, } from './recovery.js';
|
|
8
10
|
function operationIsCompleted(state, index) {
|
|
9
11
|
return (state?.operations.some((op) => op.operationIndex === index && op.status === 'completed') ?? false);
|
|
10
12
|
}
|
|
@@ -44,7 +46,8 @@ function syncOperationState(index, operationType, operationKey, status, lastErro
|
|
|
44
46
|
};
|
|
45
47
|
}
|
|
46
48
|
export async function applyMigration(input) {
|
|
47
|
-
const { db, journalStore, pluginRuntime, config, tableScope, flags, migrationsDir, file } = input;
|
|
49
|
+
const { db, journalStore, pluginRuntime, config, tableScope, flags, migrationsDir, file, settings, retry } = input;
|
|
50
|
+
const log = input.log ?? ((line) => console.log(line));
|
|
48
51
|
debug('migrate', `applying ${file}`);
|
|
49
52
|
const sql = await readFile(join(migrationsDir, file), 'utf8');
|
|
50
53
|
const parsedStatements = extractExecutableStatements(sql);
|
|
@@ -63,12 +66,20 @@ export async function applyMigration(input) {
|
|
|
63
66
|
// Resume support (#6): if a prior run left per-statement journal state for
|
|
64
67
|
// this migration, statements already marked completed are skipped instead of
|
|
65
68
|
// replayed — so a partial failure no longer bricks the migration on re-run
|
|
66
|
-
// with "column already exists".
|
|
69
|
+
// with "column already exists". Resuming across a file edit needs care (#233).
|
|
67
70
|
const initialState = await journalStore.readMigrationState(file);
|
|
68
71
|
if (initialState !== null &&
|
|
69
72
|
!initialState.migrationCompleted &&
|
|
70
73
|
initialState.checksum !== migrationChecksum) {
|
|
71
|
-
|
|
74
|
+
await acceptEditedMigration({
|
|
75
|
+
file,
|
|
76
|
+
state: initialState,
|
|
77
|
+
checksum: migrationChecksum,
|
|
78
|
+
identities: statementIdentities(operationSummaries, statements.length),
|
|
79
|
+
retry,
|
|
80
|
+
journalStore,
|
|
81
|
+
log,
|
|
82
|
+
});
|
|
72
83
|
}
|
|
73
84
|
for (let i = 0; i < statements.length; i++) {
|
|
74
85
|
const statement = statements[i];
|
|
@@ -85,7 +96,8 @@ export async function applyMigration(input) {
|
|
|
85
96
|
operationType: operation.type,
|
|
86
97
|
operationKey: operation.key,
|
|
87
98
|
beforeRetry: operation.beforeRetry,
|
|
88
|
-
|
|
99
|
+
settings,
|
|
100
|
+
log,
|
|
89
101
|
});
|
|
90
102
|
}
|
|
91
103
|
catch (error) {
|
|
@@ -101,12 +113,39 @@ export async function applyMigration(input) {
|
|
|
101
113
|
debug('migrate', `${file}#${i}: already completed in a prior run — skipping`);
|
|
102
114
|
continue;
|
|
103
115
|
}
|
|
104
|
-
const opType =
|
|
105
|
-
const
|
|
116
|
+
const { type: opType, key: opKey } = statementIdentity(operationSummaries, i);
|
|
117
|
+
const priorAttempt = stateBefore?.operations.find((op) => op.operationIndex === i);
|
|
118
|
+
if (priorAttempt !== undefined && operation?.beforeRetry) {
|
|
119
|
+
try {
|
|
120
|
+
await runBeforeRetry(db, operation.type, statement, operation.beforeRetry, {
|
|
121
|
+
cluster: config.clickhouse?.cluster,
|
|
122
|
+
settings,
|
|
123
|
+
log,
|
|
124
|
+
status: priorAttempt.status,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
throw statementError({ file, index: i, total: statements.length, statement, error });
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const swapped = operation ? swappedTables(operation.type, operation.key, statement) : undefined;
|
|
132
|
+
if (swapped) {
|
|
133
|
+
try {
|
|
134
|
+
await assertNoFireAndForgetAsyncInserts(db, swapped, { cluster: config.clickhouse?.cluster, log });
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
throw statementError({ file, index: i, total: statements.length, statement, error });
|
|
138
|
+
}
|
|
139
|
+
}
|
|
106
140
|
const baseState = stateBefore ?? freshMigrationState(file, migrationChecksum);
|
|
107
141
|
await journalStore.writeMigrationState(upsertOperation(baseState, syncOperationState(i, opType, opKey, 'started'), Date.now));
|
|
108
142
|
try {
|
|
109
|
-
|
|
143
|
+
if (operation?.mode === 'barrier') {
|
|
144
|
+
await waitForInsertBarrier(db, statement, { cluster: config.clickhouse?.cluster, settings, log });
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
await db.command(statement, settings);
|
|
148
|
+
}
|
|
110
149
|
}
|
|
111
150
|
catch (error) {
|
|
112
151
|
const stateOnError = (await journalStore.readMigrationState(file)) ?? baseState;
|
|
@@ -119,8 +158,8 @@ export async function applyMigration(input) {
|
|
|
119
158
|
// replay it into an "already exists" error (the brick this fix prevents).
|
|
120
159
|
const stateAfter = (await journalStore.readMigrationState(file)) ?? baseState;
|
|
121
160
|
await journalStore.writeMigrationState(upsertOperation(stateAfter, syncOperationState(i, opType, opKey, 'completed'), Date.now));
|
|
122
|
-
if (operation) {
|
|
123
|
-
await waitForDDLPropagation(db, operation.type, operation.key);
|
|
161
|
+
if (operation && operation.mode !== 'barrier') {
|
|
162
|
+
await waitForDDLPropagation(db, operation.type, operation.key, { cluster: config.clickhouse?.cluster, statement });
|
|
124
163
|
}
|
|
125
164
|
}
|
|
126
165
|
const entry = {
|
|
@@ -140,4 +179,63 @@ export async function applyMigration(input) {
|
|
|
140
179
|
});
|
|
141
180
|
return entry;
|
|
142
181
|
}
|
|
182
|
+
const CUTOVER_START_KEY = /^table:([^.]+)\.(.+):cutover:start$/;
|
|
183
|
+
/**
|
|
184
|
+
* The tables a statement is about to swap, whose fire-and-forget async inserts
|
|
185
|
+
* would be dropped: both tables of an EXCHANGE TABLES, and the table of a
|
|
186
|
+
* cutover at its first step, so that the cutover stops before its copy.
|
|
187
|
+
*/
|
|
188
|
+
function swappedTables(operationType, operationKey, statement) {
|
|
189
|
+
if (operationType === 'exchange_tables')
|
|
190
|
+
return parseExchangeTables(statement);
|
|
191
|
+
if (operationType !== 'cutover_validate')
|
|
192
|
+
return undefined;
|
|
193
|
+
const match = CUTOVER_START_KEY.exec(operationKey);
|
|
194
|
+
if (!match?.[1] || !match[2])
|
|
195
|
+
return undefined;
|
|
196
|
+
return [{ database: match[1], name: match[2] }];
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Runs a statement's `-- before-retry:` SQL before chkit attempts it again
|
|
200
|
+
* after an earlier attempt failed or was interrupted. Before an EXCHANGE
|
|
201
|
+
* TABLES the replicas first have to agree on both tables: a swap that ran but
|
|
202
|
+
* whose acknowledgement was lost may not have reached the replica the guard
|
|
203
|
+
* reads yet, and exchanging again would swap the tables back.
|
|
204
|
+
*/
|
|
205
|
+
async function runBeforeRetry(db, operationType, statement, beforeRetry, options) {
|
|
206
|
+
if (operationType === 'exchange_tables') {
|
|
207
|
+
await waitForExchange(db, statement, { cluster: options.cluster });
|
|
208
|
+
}
|
|
209
|
+
options.log(` ${operationType}: an earlier attempt ${options.status === 'failed' ? 'failed' : 'was interrupted'} — running before-retry SQL`);
|
|
210
|
+
await db.command(beforeRetry, options.settings);
|
|
211
|
+
}
|
|
212
|
+
// An in-progress migration whose file changed resumes when this run's --retry
|
|
213
|
+
// verified the edit, or when no statement is recorded as completed or started
|
|
214
|
+
// (the first statement failed, or --abandon marked every statement failed):
|
|
215
|
+
// the file then runs again from statement 1. The state is re-keyed to the new
|
|
216
|
+
// checksum before anything runs, so a later failure resumes without --retry.
|
|
217
|
+
async function acceptEditedMigration(input) {
|
|
218
|
+
const { file, state, checksum, identities, retry, journalStore } = input;
|
|
219
|
+
const retryVerified = retry !== undefined && retry.previousChecksum === state.checksum && retry.checksum === checksum;
|
|
220
|
+
if (retryVerified) {
|
|
221
|
+
// --retry checked the file's statements; apply indexes the statements the
|
|
222
|
+
// plugins returned, so check those too.
|
|
223
|
+
const check = verifyRetryEdit(state.operations, identities);
|
|
224
|
+
if (!check.ok)
|
|
225
|
+
throw retryMismatchError(file, check);
|
|
226
|
+
debug('migrate', `${file}: --retry accepted checksum ${state.checksum} → ${checksum}`);
|
|
227
|
+
}
|
|
228
|
+
else if (hasStatementProgress(state)) {
|
|
229
|
+
throw inProgressChecksumMismatchError({
|
|
230
|
+
migration: file,
|
|
231
|
+
journalChecksum: state.checksum,
|
|
232
|
+
fileChecksum: checksum,
|
|
233
|
+
async: false,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
input.log(`${file} changed since its last failed attempt; no statement is recorded as completed, so it runs again from statement 1.`);
|
|
238
|
+
}
|
|
239
|
+
await journalStore.writeMigrationState(rebaseInProgressState(state, { checksum, identities, appliedAt: isoWithoutZone(new Date()) }));
|
|
240
|
+
}
|
|
143
241
|
//# sourceMappingURL=apply.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/commands/migrate/apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/commands/migrate/apply.ts"],"names":[],"mappings":"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"}
|