@intentius/sql-yodeler 0.1.0 → 0.3.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/README.md +28 -26
- package/dist/bin.js +15 -0
- package/dist/bin.js.map +1 -1
- package/dist/chant/apply.d.ts +9 -1
- package/dist/chant/apply.js +13 -1
- package/dist/chant/apply.js.map +1 -1
- package/dist/chant/build.js +7 -0
- package/dist/chant/build.js.map +1 -1
- package/dist/chant/drift.d.ts +69 -1
- package/dist/chant/drift.js +152 -5
- package/dist/chant/drift.js.map +1 -1
- package/dist/chant/runnable.d.ts +19 -0
- package/dist/chant/runnable.js +47 -0
- package/dist/chant/runnable.js.map +1 -0
- package/dist/ci/render.d.ts +289 -0
- package/dist/ci/render.js +688 -0
- package/dist/ci/render.js.map +1 -0
- package/dist/ci/replay.d.ts +17 -0
- package/dist/ci/replay.js +69 -0
- package/dist/ci/replay.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.js +40 -0
- package/dist/cli.js.map +1 -1
- package/dist/command.d.ts +6 -0
- package/dist/command.js.map +1 -1
- package/dist/commands/apply.d.ts +113 -0
- package/dist/commands/apply.js +376 -49
- package/dist/commands/apply.js.map +1 -1
- package/dist/commands/approve.d.ts +5 -0
- package/dist/commands/approve.js +155 -0
- package/dist/commands/approve.js.map +1 -0
- package/dist/commands/checkpoint.d.ts +3 -0
- package/dist/commands/checkpoint.js +78 -0
- package/dist/commands/checkpoint.js.map +1 -0
- package/dist/commands/ci.d.ts +3 -0
- package/dist/commands/ci.js +118 -0
- package/dist/commands/ci.js.map +1 -0
- package/dist/commands/docs.d.ts +11 -0
- package/dist/commands/docs.js +108 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/drift.d.ts +23 -0
- package/dist/commands/drift.js +263 -18
- package/dist/commands/drift.js.map +1 -1
- package/dist/commands/index.js +16 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.js +15 -11
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/lint.js +25 -8
- package/dist/commands/lint.js.map +1 -1
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.js +50 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/new.d.ts +2 -0
- package/dist/commands/new.js +134 -10
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/override.d.ts +3 -0
- package/dist/commands/override.js +150 -0
- package/dist/commands/override.js.map +1 -0
- package/dist/commands/plan.js +43 -27
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/repair.d.ts +11 -0
- package/dist/commands/repair.js +15 -7
- package/dist/commands/repair.js.map +1 -1
- package/dist/commands/report.d.ts +13 -0
- package/dist/commands/report.js +121 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/revert.d.ts +20 -0
- package/dist/commands/revert.js +246 -0
- package/dist/commands/revert.js.map +1 -0
- package/dist/commands/status.js +44 -17
- package/dist/commands/status.js.map +1 -1
- package/dist/config/base.d.ts +69 -0
- package/dist/config/base.js +121 -0
- package/dist/config/base.js.map +1 -0
- package/dist/config/define.d.ts +223 -3
- package/dist/config/define.js +3 -1
- package/dist/config/define.js.map +1 -1
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/load.d.ts +1 -1
- package/dist/config/load.js +150 -5
- package/dist/config/load.js.map +1 -1
- package/dist/config/settings.d.ts +18 -2
- package/dist/config/settings.js +40 -6
- package/dist/config/settings.js.map +1 -1
- package/dist/env-args.d.ts +6 -0
- package/dist/env-args.js +31 -1
- package/dist/env-args.js.map +1 -1
- package/dist/exit.d.ts +20 -0
- package/dist/exit.js +28 -0
- package/dist/exit.js.map +1 -0
- package/dist/history/client.d.ts +8 -0
- package/dist/history/client.js +24 -1
- package/dist/history/client.js.map +1 -1
- package/dist/history/lock.d.ts +5 -1
- package/dist/history/lock.js +8 -2
- package/dist/history/lock.js.map +1 -1
- package/dist/history/postgres/ddl.d.ts +18 -0
- package/dist/history/postgres/ddl.js +27 -2
- package/dist/history/postgres/ddl.js.map +1 -1
- package/dist/history/postgres/store.d.ts +2 -0
- package/dist/history/postgres/store.js +7 -1
- package/dist/history/postgres/store.js.map +1 -1
- package/dist/history/rows.d.ts +16 -3
- package/dist/history/rows.js +30 -1
- package/dist/history/rows.js.map +1 -1
- package/dist/history/store.d.ts +2 -0
- package/dist/history/store.js +2 -2
- package/dist/history/store.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/init/adopt.js +8 -3
- package/dist/init/adopt.js.map +1 -1
- package/dist/init/live.d.ts +11 -0
- package/dist/init/live.js +25 -2
- package/dist/init/live.js.map +1 -1
- package/dist/lint/check.d.ts +8 -1
- package/dist/lint/check.js +38 -4
- package/dist/lint/check.js.map +1 -1
- package/dist/lint/report.js +1 -1
- package/dist/lint/report.js.map +1 -1
- package/dist/lint/routines.d.ts +26 -0
- package/dist/lint/routines.js +65 -0
- package/dist/lint/routines.js.map +1 -0
- package/dist/lint/rules.d.ts +16 -4
- package/dist/lint/rules.js +9 -4
- package/dist/lint/rules.js.map +1 -1
- package/dist/mcp/server.d.ts +40 -0
- package/dist/mcp/server.js +106 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +72 -0
- package/dist/mcp/tools.js +178 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/migrations/checkpoint.d.ts +45 -0
- package/dist/migrations/checkpoint.js +110 -0
- package/dist/migrations/checkpoint.js.map +1 -0
- package/dist/migrations/checks.d.ts +28 -0
- package/dist/migrations/checks.js +97 -0
- package/dist/migrations/checks.js.map +1 -0
- package/dist/migrations/create.d.ts +3 -1
- package/dist/migrations/create.js +3 -0
- package/dist/migrations/create.js.map +1 -1
- package/dist/migrations/directory.js +4 -0
- package/dist/migrations/directory.js.map +1 -1
- package/dist/migrations/document.d.ts +33 -0
- package/dist/migrations/document.js +2 -0
- package/dist/migrations/document.js.map +1 -1
- package/dist/migrations/index.d.ts +3 -0
- package/dist/migrations/index.js +3 -0
- package/dist/migrations/index.js.map +1 -1
- package/dist/migrations/routines.d.ts +31 -0
- package/dist/migrations/routines.js +55 -0
- package/dist/migrations/routines.js.map +1 -0
- package/dist/notify/index.d.ts +124 -0
- package/dist/notify/index.js +210 -0
- package/dist/notify/index.js.map +1 -0
- package/dist/notify/verify.d.ts +53 -0
- package/dist/notify/verify.js +71 -0
- package/dist/notify/verify.js.map +1 -0
- package/dist/pr/forge.d.ts +4 -0
- package/dist/pr/forge.js +21 -7
- package/dist/pr/forge.js.map +1 -1
- package/dist/pr/issue.d.ts +68 -0
- package/dist/pr/issue.js +107 -0
- package/dist/pr/issue.js.map +1 -0
- package/dist/pr/model.d.ts +12 -1
- package/dist/pr/model.js +44 -6
- package/dist/pr/model.js.map +1 -1
- package/dist/pr/render.d.ts +3 -1
- package/dist/pr/render.js +63 -4
- package/dist/pr/render.js.map +1 -1
- package/dist/project.d.ts +19 -2
- package/dist/project.js +33 -1
- package/dist/project.js.map +1 -1
- package/dist/replay/index.d.ts +3 -0
- package/dist/replay/index.js +3 -0
- package/dist/replay/index.js.map +1 -1
- package/dist/replay/replay.d.ts +9 -1
- package/dist/replay/replay.js +63 -32
- package/dist/replay/replay.js.map +1 -1
- package/dist/replay/report.js +1 -1
- package/dist/replay/report.js.map +1 -1
- package/dist/replay/shared.d.ts +28 -0
- package/dist/replay/shared.js +77 -0
- package/dist/replay/shared.js.map +1 -0
- package/dist/report/audit.d.ts +138 -0
- package/dist/report/audit.js +202 -0
- package/dist/report/audit.js.map +1 -0
- package/dist/report/jsonl.d.ts +21 -0
- package/dist/report/jsonl.js +52 -0
- package/dist/report/jsonl.js.map +1 -0
- package/dist/report/model.d.ts +68 -0
- package/dist/report/model.js +127 -0
- package/dist/report/model.js.map +1 -0
- package/dist/report/render.d.ts +18 -0
- package/dist/report/render.js +127 -0
- package/dist/report/render.js.map +1 -0
- package/dist/schema-docs/render.d.ts +49 -0
- package/dist/schema-docs/render.js +359 -0
- package/dist/schema-docs/render.js.map +1 -0
- package/dist/schemas.d.ts +37 -0
- package/dist/schemas.js +41 -0
- package/dist/schemas.js.map +1 -0
- package/dist/server.d.ts +40 -0
- package/dist/server.js +87 -0
- package/dist/server.js.map +1 -0
- package/dist/sources/ddl.d.ts +53 -0
- package/dist/sources/ddl.js +347 -0
- package/dist/sources/ddl.js.map +1 -0
- package/dist/sources/index.d.ts +69 -0
- package/dist/sources/index.js +170 -0
- package/dist/sources/index.js.map +1 -0
- package/dist/steps/backfill.d.ts +21 -17
- package/dist/steps/backfill.js +20 -20
- package/dist/steps/backfill.js.map +1 -1
- package/dist/steps/index.d.ts +2 -2
- package/dist/steps/index.js +3 -3
- package/dist/steps/index.js.map +1 -1
- package/dist/steps/postgres-migration.d.ts +35 -25
- package/dist/steps/postgres-migration.js +42 -29
- package/dist/steps/postgres-migration.js.map +1 -1
- package/dist/steps/rebuild.d.ts +15 -15
- package/dist/steps/rebuild.js +17 -24
- package/dist/steps/rebuild.js.map +1 -1
- package/dist/tenants/index.d.ts +40 -0
- package/dist/tenants/index.js +122 -0
- package/dist/tenants/index.js.map +1 -0
- package/dist/tenants/target.d.ts +23 -0
- package/dist/tenants/target.js +29 -0
- package/dist/tenants/target.js.map +1 -0
- package/dist/versioned/checks.d.ts +29 -0
- package/dist/versioned/checks.js +54 -0
- package/dist/versioned/checks.js.map +1 -0
- package/dist/versioned/clickhouse.js +8 -0
- package/dist/versioned/clickhouse.js.map +1 -1
- package/dist/versioned/driver.d.ts +10 -0
- package/dist/versioned/engine.d.ts +61 -1
- package/dist/versioned/engine.js +109 -6
- package/dist/versioned/engine.js.map +1 -1
- package/dist/versioned/explain.js +7 -2
- package/dist/versioned/explain.js.map +1 -1
- package/dist/versioned/index.d.ts +10 -0
- package/dist/versioned/index.js +25 -1
- package/dist/versioned/index.js.map +1 -1
- package/dist/versioned/op.d.ts +16 -1
- package/dist/versioned/op.js +43 -6
- package/dist/versioned/op.js.map +1 -1
- package/dist/versioned/policy.d.ts +98 -0
- package/dist/versioned/policy.js +212 -0
- package/dist/versioned/policy.js.map +1 -0
- package/dist/versioned/postgres/driver.d.ts +3 -1
- package/dist/versioned/postgres/driver.js +30 -3
- package/dist/versioned/postgres/driver.js.map +1 -1
- package/dist/versioned/postgres/waits.d.ts +46 -0
- package/dist/versioned/postgres/waits.js +78 -0
- package/dist/versioned/postgres/waits.js.map +1 -0
- package/dist/versioned/report.d.ts +3 -0
- package/dist/versioned/report.js +13 -1
- package/dist/versioned/report.js.map +1 -1
- package/dist/versioned/revert.d.ts +128 -0
- package/dist/versioned/revert.js +251 -0
- package/dist/versioned/revert.js.map +1 -0
- package/dist/versioned/stand-down.d.ts +30 -0
- package/dist/versioned/stand-down.js +56 -0
- package/dist/versioned/stand-down.js.map +1 -0
- package/dist/versioned/state.d.ts +25 -0
- package/dist/versioned/state.js +36 -3
- package/dist/versioned/state.js.map +1 -1
- package/dist/waves/index.d.ts +179 -0
- package/dist/waves/index.js +268 -0
- package/dist/waves/index.js.map +1 -0
- package/dist/waves/promotion.d.ts +56 -0
- package/dist/waves/promotion.js +108 -0
- package/dist/waves/promotion.js.map +1 -0
- package/dist/waves/record.d.ts +24 -0
- package/dist/waves/record.js +20 -0
- package/dist/waves/record.js.map +1 -0
- package/package.json +22 -8
- package/schemas/apply.schema.json +428 -0
- package/schemas/checkpoint.schema.json +19 -0
- package/schemas/common.schema.json +213 -0
- package/schemas/drift.schema.json +61 -0
- package/schemas/event.schema.json +36 -0
- package/schemas/init.schema.json +31 -0
- package/schemas/lint-rules.schema.json +54 -0
- package/schemas/lint.schema.json +294 -0
- package/schemas/mcp.schema.json +70 -0
- package/schemas/new.schema.json +71 -0
- package/schemas/plan.schema.json +489 -0
- package/schemas/rebase.schema.json +54 -0
- package/schemas/repair.schema.json +20 -0
- package/schemas/report.schema.json +114 -0
- package/schemas/revert.schema.json +69 -0
- package/schemas/status.schema.json +371 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-migration.js","sourceRoot":"","sources":["../../src/steps/postgres-migration.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"postgres-migration.js","sourceRoot":"","sources":["../../src/steps/postgres-migration.ts"],"names":[],"mappings":"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"}
|
package/dist/steps/rebuild.d.ts
CHANGED
|
@@ -15,26 +15,28 @@
|
|
|
15
15
|
* `schema`), written to a temporary build file, not a fresh `chant build`:
|
|
16
16
|
* the table is rebuilt as this migration declares it, however far the
|
|
17
17
|
* declared schema has moved on since.
|
|
18
|
-
* -
|
|
19
|
-
* the step's options are in the migration's checksum, which
|
|
20
|
-
* digest the migrations Op's gate approved
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* -
|
|
25
|
-
*
|
|
26
|
-
* the next `yodel apply`: every
|
|
27
|
-
* start the rebuild over instead,
|
|
28
|
-
*
|
|
18
|
+
* - It is built with `gates: "outer"`: the swap gate's approval is the
|
|
19
|
+
* migration's (the step's options are in the migration's checksum, which
|
|
20
|
+
* is in the plan digest the migrations Op's gate approved), so the Op has
|
|
21
|
+
* no gate and no Drop phase. The verification still runs before the swap,
|
|
22
|
+
* and a difference fails the step with nothing swapped. The old table is
|
|
23
|
+
* kept, `<table>__chant_old`, until its retention date (7 days).
|
|
24
|
+
* - It is built with `onFailure: "keep"`, so a step that failed or was
|
|
25
|
+
* killed part way keeps `<table>__chant_new` and `<table>__chant_dual` and
|
|
26
|
+
* resumes from the backfill's receipts on the next `yodel apply`: every
|
|
27
|
+
* partition with a receipt is skipped. To start the rebuild over instead,
|
|
28
|
+
* drop those two tables (a refusal names them).
|
|
29
29
|
*
|
|
30
30
|
* The activities render their DDL for the topology chant resolves from
|
|
31
31
|
* `sql.profiles.<env>.topology`. When the environment's topology comes from
|
|
32
32
|
* elsewhere (`yodel.config.ts`, or `YODEL_TOPOLOGY`, #9), the step hands
|
|
33
33
|
* every rebuild activity chant's config with that topology set on the
|
|
34
34
|
* profile ({@link rebuildChantConfig}), so the rebuild renders for the same
|
|
35
|
-
* topology as the migration's statements.
|
|
35
|
+
* topology as the migration's statements. On a cluster of more than one
|
|
36
|
+
* shard the Op copies and verifies every shard; it needs the `{shard}` macro
|
|
37
|
+
* on each server, distinct per shard, and refuses the cluster without it.
|
|
36
38
|
*/
|
|
37
|
-
import type { OpConfig
|
|
39
|
+
import type { OpConfig } from "@intentius/chant/op/types";
|
|
38
40
|
import type { ActivityFn } from "@intentius/chant/op/activity-registry";
|
|
39
41
|
import type { StepRecord } from "@intentius/chant/op/local-executor";
|
|
40
42
|
import type { Topology } from "@intentius/chant-lexicon-sql/clickhouse/topology";
|
|
@@ -50,8 +52,6 @@ export declare function withProfileTopology(config: ProjectConfig, environment:
|
|
|
50
52
|
* gives the same topology (set in the profile, or no topology anywhere).
|
|
51
53
|
*/
|
|
52
54
|
export declare function rebuildChantConfig(projectDir: string, environment: string, env?: NodeJS.ProcessEnv): Promise<ProjectConfig | undefined>;
|
|
53
|
-
/** `ClickHouseRebuildOp`'s phases as a step runs them: no gates, no Drop, no onFailure. */
|
|
54
|
-
export declare function stepPhases(config: OpConfig): PhaseDefinition[];
|
|
55
55
|
/** The Op a rebuild step runs. `buildPath` is the recorded schema's file; `projectDir` holds chant.config.ts. */
|
|
56
56
|
export declare function rebuildOpConfig(options: RebuildOptions, ctx: {
|
|
57
57
|
environment: string;
|
package/dist/steps/rebuild.js
CHANGED
|
@@ -15,24 +15,26 @@
|
|
|
15
15
|
* `schema`), written to a temporary build file, not a fresh `chant build`:
|
|
16
16
|
* the table is rebuilt as this migration declares it, however far the
|
|
17
17
|
* declared schema has moved on since.
|
|
18
|
-
* -
|
|
19
|
-
* the step's options are in the migration's checksum, which
|
|
20
|
-
* digest the migrations Op's gate approved
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* -
|
|
25
|
-
*
|
|
26
|
-
* the next `yodel apply`: every
|
|
27
|
-
* start the rebuild over instead,
|
|
28
|
-
*
|
|
18
|
+
* - It is built with `gates: "outer"`: the swap gate's approval is the
|
|
19
|
+
* migration's (the step's options are in the migration's checksum, which
|
|
20
|
+
* is in the plan digest the migrations Op's gate approved), so the Op has
|
|
21
|
+
* no gate and no Drop phase. The verification still runs before the swap,
|
|
22
|
+
* and a difference fails the step with nothing swapped. The old table is
|
|
23
|
+
* kept, `<table>__chant_old`, until its retention date (7 days).
|
|
24
|
+
* - It is built with `onFailure: "keep"`, so a step that failed or was
|
|
25
|
+
* killed part way keeps `<table>__chant_new` and `<table>__chant_dual` and
|
|
26
|
+
* resumes from the backfill's receipts on the next `yodel apply`: every
|
|
27
|
+
* partition with a receipt is skipped. To start the rebuild over instead,
|
|
28
|
+
* drop those two tables (a refusal names them).
|
|
29
29
|
*
|
|
30
30
|
* The activities render their DDL for the topology chant resolves from
|
|
31
31
|
* `sql.profiles.<env>.topology`. When the environment's topology comes from
|
|
32
32
|
* elsewhere (`yodel.config.ts`, or `YODEL_TOPOLOGY`, #9), the step hands
|
|
33
33
|
* every rebuild activity chant's config with that topology set on the
|
|
34
34
|
* profile ({@link rebuildChantConfig}), so the rebuild renders for the same
|
|
35
|
-
* topology as the migration's statements.
|
|
35
|
+
* topology as the migration's statements. On a cluster of more than one
|
|
36
|
+
* shard the Op copies and verifies every shard; it needs the `{shard}` macro
|
|
37
|
+
* on each server, distinct per shard, and refuses the cluster without it.
|
|
36
38
|
*/
|
|
37
39
|
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
38
40
|
import { tmpdir } from "node:os";
|
|
@@ -63,14 +65,6 @@ export async function rebuildChantConfig(projectDir, environment, env = process.
|
|
|
63
65
|
return undefined;
|
|
64
66
|
return withProfileTopology(project.config, environment, settings.topology);
|
|
65
67
|
}
|
|
66
|
-
/** The activity of the phase left out: the old table's drop, which waits for its retention and its own gate. */
|
|
67
|
-
const LEFT_OUT = new Set(["clickhouseRebuildDrop"]);
|
|
68
|
-
/** `ClickHouseRebuildOp`'s phases as a step runs them: no gates, no Drop, no onFailure. */
|
|
69
|
-
export function stepPhases(config) {
|
|
70
|
-
return config.phases
|
|
71
|
-
.map((p) => ({ ...p, steps: p.steps.filter((s) => s.kind !== "gate" && !(s.kind === "activity" && LEFT_OUT.has(s.fn))) }))
|
|
72
|
-
.filter((p) => p.steps.length > 0);
|
|
73
|
-
}
|
|
74
68
|
/** The Op a rebuild step runs. `buildPath` is the recorded schema's file; `projectDir` holds chant.config.ts. */
|
|
75
69
|
export async function rebuildOpConfig(options, ctx) {
|
|
76
70
|
const { ClickHouseRebuildOp } = await import("@intentius/chant-lexicon-sql/clickhouse/rebuild/op");
|
|
@@ -82,11 +76,10 @@ export async function rebuildOpConfig(options, ctx) {
|
|
|
82
76
|
build: false,
|
|
83
77
|
output: ctx.buildPath,
|
|
84
78
|
path: ctx.projectDir,
|
|
79
|
+
gates: "outer",
|
|
80
|
+
onFailure: "keep",
|
|
85
81
|
});
|
|
86
|
-
|
|
87
|
-
const rest = { ...full, phases: stepPhases(full) };
|
|
88
|
-
delete rest.onFailure;
|
|
89
|
-
return rest;
|
|
82
|
+
return op.props;
|
|
90
83
|
}
|
|
91
84
|
const num = (v) => (typeof v === "number" ? v : undefined);
|
|
92
85
|
const str = (v) => (typeof v === "string" ? v : undefined);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rebuild.js","sourceRoot":"","sources":["../../src/steps/rebuild.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"rebuild.js","sourceRoot":"","sources":["../../src/steps/rebuild.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tenant sets (#56): one environment over many databases (ClickHouse) or
|
|
3
|
+
* schemas (Postgres) with the same migrations.
|
|
4
|
+
*
|
|
5
|
+
* `yodel.config.ts` `environments.<env>.tenants` lists them (names, a file,
|
|
6
|
+
* or a read-only query on the environment's server). Each tenant is a
|
|
7
|
+
* target of its own, `<env>/<tenant>`: its profile is the environment's on
|
|
8
|
+
* the tenant's database or schema (`resolveEnvironment`), its history is
|
|
9
|
+
* `<history database>_<tenant>` (`environmentSettings`), and every
|
|
10
|
+
* statement and check is sent with the template's name replaced by the
|
|
11
|
+
* tenant's ({@link tenantDriver}). The apply pipeline renders the
|
|
12
|
+
* environment's wave with a run per tenant, one gate over all of them.
|
|
13
|
+
*/
|
|
14
|
+
import type { TenantSet } from "../config/define.js";
|
|
15
|
+
import { type Environment, type Project, type TenantOf } from "../project.js";
|
|
16
|
+
import type { VersionedDriver } from "../versioned/driver.js";
|
|
17
|
+
export * from "./target.js";
|
|
18
|
+
/** `env`'s tenant set in yodel.config.ts, if it has one. */
|
|
19
|
+
export declare const tenantSetOf: (project: Pick<Project, "yodel">, env: string) => TenantSet | undefined;
|
|
20
|
+
/** Reads a tenant file: a JSON array of names, or one name per line (`#` starts a comment). */
|
|
21
|
+
export declare function readTenantFile(path: string): string[];
|
|
22
|
+
/**
|
|
23
|
+
* The tenants of `env`, in the order the set gives them; undefined when it
|
|
24
|
+
* has no set. A query runs read-only on the environment's server, with its
|
|
25
|
+
* profile, and its rows' first column are the names.
|
|
26
|
+
*/
|
|
27
|
+
export declare function listTenants(project: Project, env: string): Promise<string[] | undefined>;
|
|
28
|
+
/** Throws unless `env`'s tenant set names the tenant `env` is. */
|
|
29
|
+
export declare function checkTenant(project: Project, env: Environment): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* The targets `names` stand for: an environment with a tenant set is each
|
|
32
|
+
* of its tenants, `<env>/<tenant>`; any other name is itself.
|
|
33
|
+
*/
|
|
34
|
+
export declare function expandTargets(project: Project, names: readonly string[]): Promise<string[]>;
|
|
35
|
+
/**
|
|
36
|
+
* A tenant's driver: the environment's, with the template's name replaced
|
|
37
|
+
* by the tenant's in every statement and check it sends. An Op step (a
|
|
38
|
+
* rebuild, a backfill) names its tables itself and does not run on a tenant.
|
|
39
|
+
*/
|
|
40
|
+
export declare function tenantDriver(driver: VersionedDriver, tenant: TenantOf): VersionedDriver;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tenant sets (#56): one environment over many databases (ClickHouse) or
|
|
3
|
+
* schemas (Postgres) with the same migrations.
|
|
4
|
+
*
|
|
5
|
+
* `yodel.config.ts` `environments.<env>.tenants` lists them (names, a file,
|
|
6
|
+
* or a read-only query on the environment's server). Each tenant is a
|
|
7
|
+
* target of its own, `<env>/<tenant>`: its profile is the environment's on
|
|
8
|
+
* the tenant's database or schema (`resolveEnvironment`), its history is
|
|
9
|
+
* `<history database>_<tenant>` (`environmentSettings`), and every
|
|
10
|
+
* statement and check is sent with the template's name replaced by the
|
|
11
|
+
* tenant's ({@link tenantDriver}). The apply pipeline renders the
|
|
12
|
+
* environment's wave with a run per tenant, one gate over all of them.
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
15
|
+
import { resolve } from "node:path";
|
|
16
|
+
import { resolveEnvironment, YodelError } from "../project.js";
|
|
17
|
+
import { renameIdentifier, splitTarget, TENANT_NAME, tenantTarget } from "./target.js";
|
|
18
|
+
export * from "./target.js";
|
|
19
|
+
/** `env`'s tenant set in yodel.config.ts, if it has one. */
|
|
20
|
+
export const tenantSetOf = (project, env) => project.yodel?.config.environments?.[env]?.tenants;
|
|
21
|
+
function checked(names, where) {
|
|
22
|
+
const bad = names.filter((n) => !TENANT_NAME.test(n));
|
|
23
|
+
if (bad.length > 0)
|
|
24
|
+
throw new YodelError(`${where} lists ${bad.map((b) => JSON.stringify(b)).join(", ")}, which ${bad.length === 1 ? "is not a tenant name" : "are not tenant names"} (letters, digits and _, not starting with a digit)`);
|
|
25
|
+
return [...new Set(names)];
|
|
26
|
+
}
|
|
27
|
+
/** Reads a tenant file: a JSON array of names, or one name per line (`#` starts a comment). */
|
|
28
|
+
export function readTenantFile(path) {
|
|
29
|
+
if (!existsSync(path))
|
|
30
|
+
throw new YodelError(`the tenant file ${path} does not exist`);
|
|
31
|
+
const text = readFileSync(path, "utf8");
|
|
32
|
+
if (text.trimStart().startsWith("[")) {
|
|
33
|
+
let parsed;
|
|
34
|
+
try {
|
|
35
|
+
parsed = JSON.parse(text);
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
throw new YodelError(`${path}: ${e instanceof Error ? e.message : String(e)}`);
|
|
39
|
+
}
|
|
40
|
+
if (!Array.isArray(parsed) || !parsed.every((t) => typeof t === "string"))
|
|
41
|
+
throw new YodelError(`${path}: expected a JSON array of tenant names`);
|
|
42
|
+
return checked(parsed, path);
|
|
43
|
+
}
|
|
44
|
+
return checked(text.split("\n").map((l) => l.replace(/#.*/, "").trim()).filter(Boolean), path);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* The tenants of `env`, in the order the set gives them; undefined when it
|
|
48
|
+
* has no set. A query runs read-only on the environment's server, with its
|
|
49
|
+
* profile, and its rows' first column are the names.
|
|
50
|
+
*/
|
|
51
|
+
export async function listTenants(project, env) {
|
|
52
|
+
const set = tenantSetOf(project, env);
|
|
53
|
+
if (set === undefined)
|
|
54
|
+
return undefined;
|
|
55
|
+
if (Array.isArray(set))
|
|
56
|
+
return [...set];
|
|
57
|
+
if ("file" in set)
|
|
58
|
+
return readTenantFile(resolve(project.dir, set.file));
|
|
59
|
+
const { openVersioned, closeVersioned } = await import("../versioned/engine.js");
|
|
60
|
+
const venv = await openVersioned(project, resolveEnvironment(project, env));
|
|
61
|
+
try {
|
|
62
|
+
let rows;
|
|
63
|
+
try {
|
|
64
|
+
rows = await venv.driver.readCheck(set.query, {});
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
throw new YodelError(`${env}'s tenant query failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
68
|
+
}
|
|
69
|
+
return checked(rows.map((r) => { const v = Object.values(r)[0]; return typeof v === "string" ? v : JSON.stringify(v ?? ""); }), `${env}'s tenant query`);
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
await closeVersioned(venv);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/** Throws unless `env`'s tenant set names the tenant `env` is. */
|
|
76
|
+
export async function checkTenant(project, env) {
|
|
77
|
+
if (!env.tenant)
|
|
78
|
+
return;
|
|
79
|
+
const set = tenantSetOf(project, env.tenant.env);
|
|
80
|
+
if (Array.isArray(set))
|
|
81
|
+
return; // resolveEnvironment checked it.
|
|
82
|
+
const names = (await listTenants(project, env.tenant.env)) ?? [];
|
|
83
|
+
if (!names.includes(env.tenant.name)) {
|
|
84
|
+
throw new YodelError(`no tenant "${env.tenant.name}" in ${env.tenant.env}'s tenant set (${set && "file" in set ? set.file : "its query"} lists ${names.length > 0 ? names.join(", ") : "none"})`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* The targets `names` stand for: an environment with a tenant set is each
|
|
89
|
+
* of its tenants, `<env>/<tenant>`; any other name is itself.
|
|
90
|
+
*/
|
|
91
|
+
export async function expandTargets(project, names) {
|
|
92
|
+
const out = [];
|
|
93
|
+
for (const name of names) {
|
|
94
|
+
const tenants = splitTarget(name).tenant === undefined ? await listTenants(project, name) : undefined;
|
|
95
|
+
if (tenants)
|
|
96
|
+
out.push(...tenants.map((t) => tenantTarget(name, t)));
|
|
97
|
+
else
|
|
98
|
+
out.push(name);
|
|
99
|
+
}
|
|
100
|
+
return out;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* A tenant's driver: the environment's, with the template's name replaced
|
|
104
|
+
* by the tenant's in every statement and check it sends. An Op step (a
|
|
105
|
+
* rebuild, a backfill) names its tables itself and does not run on a tenant.
|
|
106
|
+
*/
|
|
107
|
+
export function tenantDriver(driver, tenant) {
|
|
108
|
+
const rename = (sql) => renameIdentifier(sql, tenant.template, tenant.name);
|
|
109
|
+
const where = (w) => ({
|
|
110
|
+
...(w.defaultDatabase !== undefined ? { defaultDatabase: rename(w.defaultDatabase) } : {}),
|
|
111
|
+
...(w.defaultSchema !== undefined ? { defaultSchema: rename(w.defaultSchema) } : {}),
|
|
112
|
+
});
|
|
113
|
+
return {
|
|
114
|
+
...driver,
|
|
115
|
+
readCheck: (sql, w) => driver.readCheck(rename(sql), where(w)),
|
|
116
|
+
runStatement: (step, run) => driver.runStatement({ ...step, sql: rename(step.sql) }, run),
|
|
117
|
+
stepContext: () => {
|
|
118
|
+
throw new YodelError(`an Op step does not run on a tenant (${tenantTarget(tenant.env, tenant.name)}): only statements are renamed from ${tenant.template} to ${tenant.name}`);
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tenants/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tenant targets (#56), the parts every module can import: a tenant of
|
|
3
|
+
* environment `prod` is the target `prod/<tenant>`, and its migrations are
|
|
4
|
+
* the environment's with the template database or schema renamed.
|
|
5
|
+
*/
|
|
6
|
+
/** Between an environment and a tenant in a target's name. */
|
|
7
|
+
export declare const TENANT_SEPARATOR = "/";
|
|
8
|
+
/** A tenant's name: a database or schema name, and part of a target's name and of a file's. */
|
|
9
|
+
export declare const TENANT_NAME: RegExp;
|
|
10
|
+
/** `prod/acme` is environment `prod`, tenant `acme`; `prod` is `prod` alone. */
|
|
11
|
+
export declare function splitTarget(name: string): {
|
|
12
|
+
env: string;
|
|
13
|
+
tenant?: string;
|
|
14
|
+
};
|
|
15
|
+
/** The environment a target belongs to: `prod` for `prod/acme` and for `prod`. */
|
|
16
|
+
export declare const baseEnvironment: (name: string) => string;
|
|
17
|
+
export declare const tenantTarget: (env: string, tenant: string) => string;
|
|
18
|
+
/**
|
|
19
|
+
* `sql` with every identifier `from` replaced by `to`: the name standing
|
|
20
|
+
* alone, bare or quoted (`from.orders`, `"from"`, `` `from` ``), never a
|
|
21
|
+
* longer name that contains it (`from_archive`).
|
|
22
|
+
*/
|
|
23
|
+
export declare function renameIdentifier(sql: string, from: string, to: string): string;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tenant targets (#56), the parts every module can import: a tenant of
|
|
3
|
+
* environment `prod` is the target `prod/<tenant>`, and its migrations are
|
|
4
|
+
* the environment's with the template database or schema renamed.
|
|
5
|
+
*/
|
|
6
|
+
/** Between an environment and a tenant in a target's name. */
|
|
7
|
+
export const TENANT_SEPARATOR = "/";
|
|
8
|
+
/** A tenant's name: a database or schema name, and part of a target's name and of a file's. */
|
|
9
|
+
export const TENANT_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
10
|
+
/** `prod/acme` is environment `prod`, tenant `acme`; `prod` is `prod` alone. */
|
|
11
|
+
export function splitTarget(name) {
|
|
12
|
+
const i = name.indexOf(TENANT_SEPARATOR);
|
|
13
|
+
return i < 0 ? { env: name } : { env: name.slice(0, i), tenant: name.slice(i + 1) };
|
|
14
|
+
}
|
|
15
|
+
/** The environment a target belongs to: `prod` for `prod/acme` and for `prod`. */
|
|
16
|
+
export const baseEnvironment = (name) => splitTarget(name).env;
|
|
17
|
+
export const tenantTarget = (env, tenant) => `${env}${TENANT_SEPARATOR}${tenant}`;
|
|
18
|
+
const escapeRegExp = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
19
|
+
/**
|
|
20
|
+
* `sql` with every identifier `from` replaced by `to`: the name standing
|
|
21
|
+
* alone, bare or quoted (`from.orders`, `"from"`, `` `from` ``), never a
|
|
22
|
+
* longer name that contains it (`from_archive`).
|
|
23
|
+
*/
|
|
24
|
+
export function renameIdentifier(sql, from, to) {
|
|
25
|
+
if (from === to)
|
|
26
|
+
return sql;
|
|
27
|
+
return sql.replace(new RegExp(`(?<![A-Za-z0-9_$])${escapeRegExp(from)}(?![A-Za-z0-9_$])`, "g"), to);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=target.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"target.js","sourceRoot":"","sources":["../../src/tenants/target.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,8DAA8D;AAC9D,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAEpC,+FAA+F;AAC/F,MAAM,CAAC,MAAM,WAAW,GAAG,0BAA0B,CAAC;AAEtD,gFAAgF;AAChF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;AACtF,CAAC;AAED,kFAAkF;AAClF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;AAE/E,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,MAAc,EAAU,EAAE,CAAC,GAAG,GAAG,GAAG,gBAAgB,GAAG,MAAM,EAAE,CAAC;AAE1G,MAAM,YAAY,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAErF;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,IAAY,EAAE,EAAU;IACpE,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,GAAG,CAAC;IAC5B,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,qBAAqB,YAAY,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;AACtG,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-migration checks (#52), run against an environment.
|
|
3
|
+
*
|
|
4
|
+
* A migration's `checks` (`../migrations/checks.ts`) are read-only queries.
|
|
5
|
+
* `yodel apply <env>` runs the first pending migration's before it runs the
|
|
6
|
+
* migrations Op, so a run that would be refused stops before anyone is
|
|
7
|
+
* asked to approve it; the Op's Apply step runs every migration's again
|
|
8
|
+
* under the lock, just before that migration's first statement, where the
|
|
9
|
+
* data is what the statements will meet. A check that fails, or whose query
|
|
10
|
+
* the server refuses, refuses the run with exit 4: nothing of that
|
|
11
|
+
* migration is sent. Under the lock the history records the outcome: the
|
|
12
|
+
* migration's `started` row carries the checks that passed in its `note`,
|
|
13
|
+
* and a refusal is a `failed` migration row naming the check.
|
|
14
|
+
*
|
|
15
|
+
* A migration resuming part way (a statement of it already succeeded) does
|
|
16
|
+
* not run its checks again: they held before its first statement.
|
|
17
|
+
*/
|
|
18
|
+
import { YodelError } from "../project.js";
|
|
19
|
+
import { type CheckOutcome, type Migration } from "../migrations/index.js";
|
|
20
|
+
import type { VersionedDriver } from "./driver.js";
|
|
21
|
+
import type { PendingMigration } from "./state.js";
|
|
22
|
+
/** Whether `p`'s checks run before it: it has some, and no statement of it has succeeded yet. */
|
|
23
|
+
export declare const checksDue: (p: PendingMigration) => boolean;
|
|
24
|
+
/** Runs each of `m`'s checks; a query the server refuses is a failed check. */
|
|
25
|
+
export declare function runChecks(driver: VersionedDriver, m: Migration): Promise<CheckOutcome[]>;
|
|
26
|
+
/** The checks that failed, one line each. */
|
|
27
|
+
export declare function failedChecks(m: Migration, outcomes: readonly CheckOutcome[]): string[];
|
|
28
|
+
/** The refusal when a check of `m` failed, or `undefined`. */
|
|
29
|
+
export declare function checksRefusal(m: Migration, outcomes: readonly CheckOutcome[], when: string): YodelError | undefined;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-migration checks (#52), run against an environment.
|
|
3
|
+
*
|
|
4
|
+
* A migration's `checks` (`../migrations/checks.ts`) are read-only queries.
|
|
5
|
+
* `yodel apply <env>` runs the first pending migration's before it runs the
|
|
6
|
+
* migrations Op, so a run that would be refused stops before anyone is
|
|
7
|
+
* asked to approve it; the Op's Apply step runs every migration's again
|
|
8
|
+
* under the lock, just before that migration's first statement, where the
|
|
9
|
+
* data is what the statements will meet. A check that fails, or whose query
|
|
10
|
+
* the server refuses, refuses the run with exit 4: nothing of that
|
|
11
|
+
* migration is sent. Under the lock the history records the outcome: the
|
|
12
|
+
* migration's `started` row carries the checks that passed in its `note`,
|
|
13
|
+
* and a refusal is a `failed` migration row naming the check.
|
|
14
|
+
*
|
|
15
|
+
* A migration resuming part way (a statement of it already succeeded) does
|
|
16
|
+
* not run its checks again: they held before its first statement.
|
|
17
|
+
*/
|
|
18
|
+
import { YodelError } from "../project.js";
|
|
19
|
+
import { EXIT_REFUSED } from "../exit.js";
|
|
20
|
+
import { describeExpect, judgeCheck } from "../migrations/index.js";
|
|
21
|
+
/** Whether `p`'s checks run before it: it has some, and no statement of it has succeeded yet. */
|
|
22
|
+
export const checksDue = (p) => (p.migration.document.checks?.length ?? 0) > 0 && (p.partWay?.done.length ?? 0) === 0;
|
|
23
|
+
/** Runs each of `m`'s checks; a query the server refuses is a failed check. */
|
|
24
|
+
export async function runChecks(driver, m) {
|
|
25
|
+
const where = { defaultDatabase: m.document.defaultDatabase, defaultSchema: m.document.defaultSchema };
|
|
26
|
+
const out = [];
|
|
27
|
+
for (const check of m.document.checks ?? []) {
|
|
28
|
+
try {
|
|
29
|
+
out.push(judgeCheck(check, await driver.readCheck(check.sql, where)));
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
out.push({ name: check.name, passed: false, detail: `the query failed: ${(e instanceof Error ? e.message : String(e)).split("\n")[0] ?? ""}` });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return out;
|
|
36
|
+
}
|
|
37
|
+
/** The checks that failed, one line each. */
|
|
38
|
+
export function failedChecks(m, outcomes) {
|
|
39
|
+
return outcomes
|
|
40
|
+
.filter((o) => !o.passed)
|
|
41
|
+
.map((o) => {
|
|
42
|
+
const check = m.document.checks?.find((c) => c.name === o.name);
|
|
43
|
+
return `check ${o.name} failed: it must ${check ? describeExpect(check).replace(/^returns/, "return") : "pass"}, and returned ${o.detail}`;
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/** The refusal when a check of `m` failed, or `undefined`. */
|
|
47
|
+
export function checksRefusal(m, outcomes, when) {
|
|
48
|
+
const failed = failedChecks(m, outcomes);
|
|
49
|
+
if (failed.length === 0)
|
|
50
|
+
return undefined;
|
|
51
|
+
return new YodelError(`refused: a pre-migration check of ${m.id} failed ${when}. Nothing of ${m.id} was applied:\n${failed.map((f) => ` ${f}`).join("\n")}\n` +
|
|
52
|
+
`Fix the data, then run yodel apply again; if the check is wrong, edit it in migration.json and run yodel lint --update-checksum ${m.id} (the plan digest moves, so the plan is approved again).`, EXIT_REFUSED);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=checks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checks.js","sourceRoot":"","sources":["../../src/versioned/checks.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,14 @@ export function clickhouseDriver(input) {
|
|
|
18
18
|
rowNote: topologyNote(topology),
|
|
19
19
|
acquireLock: (holder) => acquireLock(port, { database: input.location.database, topology: input.location.topology, holder, ttlMs: input.lockTtlMs, serverKey: input.serverKey }),
|
|
20
20
|
liveFingerprint: async () => catalogFingerprint(await readLiveCatalog(port, input.scope)),
|
|
21
|
+
async readCheck(sql, where) {
|
|
22
|
+
try {
|
|
23
|
+
return await port.query(sql.trim().replace(/;+$/, ""), { settings: { readonly: "2", ...(where.defaultDatabase ? { database: where.defaultDatabase } : {}) } });
|
|
24
|
+
}
|
|
25
|
+
catch (e) {
|
|
26
|
+
throw new Error(serverMessage(e), { cause: e });
|
|
27
|
+
}
|
|
28
|
+
},
|
|
21
29
|
async runStatement(step, run) {
|
|
22
30
|
try {
|
|
23
31
|
await port.query(renderForEnvironment(step.sql, topology), step.waitsForMutation ? { settings: { mutations_sync: "2" } } : {});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clickhouse.js","sourceRoot":"","sources":["../../src/versioned/clickhouse.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAA6C,MAAM,qBAAqB,CAAC;AACpH,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAiB,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAkB,MAAM,aAAa,CAAC;AAalF,MAAM,UAAU,gBAAgB,CAAC,KAA4B;IAC3D,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACvB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC;IAC1C,OAAO;QACL,OAAO,EAAE,YAAY;QACrB,OAAO,EAAE,YAAY,CAAC,QAAQ,CAAC;QAC/B,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE,CACtB,WAAW,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;QACzJ,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC,kBAAkB,CAAC,MAAM,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACzF,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG;YAC1B,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACjI,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAClD,CAAC;YACD,MAAM,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;QACD,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;QACvD,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;KAC/B,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"clickhouse.js","sourceRoot":"","sources":["../../src/versioned/clickhouse.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAA6C,MAAM,qBAAqB,CAAC;AACpH,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAiB,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAkB,MAAM,aAAa,CAAC;AAalF,MAAM,UAAU,gBAAgB,CAAC,KAA4B;IAC3D,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IACvB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC;IAC1C,OAAO;QACL,OAAO,EAAE,YAAY;QACrB,OAAO,EAAE,YAAY,CAAC,QAAQ,CAAC;QAC/B,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE,CACtB,WAAW,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;QACzJ,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC,kBAAkB,CAAC,MAAM,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACzF,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK;YACxB,IAAI,CAAC;gBACH,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACjK,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QACD,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG;YAC1B,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACjI,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAClD,CAAC;YACD,MAAM,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;QACD,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;QACvD,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;KAC/B,CAAC;AACJ,CAAC"}
|
|
@@ -32,6 +32,16 @@ export interface VersionedDriver {
|
|
|
32
32
|
acquireLock(holder: string): Promise<Lock>;
|
|
33
33
|
/** A fingerprint of the live schema in the environment's scope, the history left out. */
|
|
34
34
|
liveFingerprint(): Promise<string>;
|
|
35
|
+
/**
|
|
36
|
+
* Runs a pre-migration check's query (#52) read-only and returns its rows:
|
|
37
|
+
* ClickHouse with `readonly = 2` and the migration's default database,
|
|
38
|
+
* Postgres in a `READ ONLY` transaction with `search_path` set to the
|
|
39
|
+
* migration's default schema, rolled back.
|
|
40
|
+
*/
|
|
41
|
+
readCheck(sql: string, where: {
|
|
42
|
+
defaultDatabase?: string | undefined;
|
|
43
|
+
defaultSchema?: string | undefined;
|
|
44
|
+
}): Promise<Array<Record<string, unknown>>>;
|
|
35
45
|
/** Sends one statement and writes its `succeeded` row through `run`; throws with the server's message when it fails. */
|
|
36
46
|
runStatement(step: StatementStep, run: StatementRun): Promise<void>;
|
|
37
47
|
/** What an Op step's runner gets from the dialect: the ClickHouse port and endpoint; the Postgres lock timeout, and the connection, timeouts and receipts schema a backfill uses. */
|