@rocicorp/zero 0.17.2025022800 → 0.17.2025030600
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/out/{chunk-5BT5TJFM.js → chunk-XXZWDMNW.js} +4025 -531
- package/out/chunk-XXZWDMNW.js.map +7 -0
- package/out/react.js +19 -11
- package/out/react.js.map +2 -2
- package/out/shared/src/set-utils.d.ts +1 -1
- package/out/shared/src/set-utils.js +1 -1
- package/out/solid.js +9 -5
- package/out/solid.js.map +2 -2
- package/out/zero-cache/src/auth/read-authorizer.d.ts.map +1 -1
- package/out/zero-cache/src/auth/read-authorizer.js +0 -1
- package/out/zero-cache/src/auth/read-authorizer.js.map +1 -1
- package/out/zero-cache/src/config/zero-config.d.ts +46 -13
- package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
- package/out/zero-cache/src/config/zero-config.js +76 -32
- package/out/zero-cache/src/config/zero-config.js.map +1 -1
- package/out/zero-cache/src/db/migration-lite.d.ts.map +1 -1
- package/out/zero-cache/src/db/migration-lite.js +12 -6
- package/out/zero-cache/src/db/migration-lite.js.map +1 -1
- package/out/zero-cache/src/db/migration.d.ts +1 -1
- package/out/zero-cache/src/db/migration.d.ts.map +1 -1
- package/out/zero-cache/src/db/migration.js +16 -5
- package/out/zero-cache/src/db/migration.js.map +1 -1
- package/out/zero-cache/src/db/pg-to-lite.d.ts +4 -0
- package/out/zero-cache/src/db/pg-to-lite.d.ts.map +1 -1
- package/out/zero-cache/src/db/pg-to-lite.js +14 -4
- package/out/zero-cache/src/db/pg-to-lite.js.map +1 -1
- package/out/zero-cache/src/scripts/deploy-permissions.js +35 -20
- package/out/zero-cache/src/scripts/deploy-permissions.js.map +1 -1
- package/out/zero-cache/src/scripts/permissions.d.ts +17 -0
- package/out/zero-cache/src/scripts/permissions.d.ts.map +1 -1
- package/out/zero-cache/src/scripts/permissions.js +3 -1
- package/out/zero-cache/src/scripts/permissions.js.map +1 -1
- package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
- package/out/zero-cache/src/server/change-streamer.js +11 -10
- package/out/zero-cache/src/server/change-streamer.js.map +1 -1
- package/out/zero-cache/src/server/main.d.ts.map +1 -1
- package/out/zero-cache/src/server/main.js +11 -4
- package/out/zero-cache/src/server/main.js.map +1 -1
- package/out/zero-cache/src/server/multi/config.d.ts +23 -9
- package/out/zero-cache/src/server/multi/config.d.ts.map +1 -1
- package/out/zero-cache/src/server/multi/config.js +2 -4
- package/out/zero-cache/src/server/multi/config.js.map +1 -1
- package/out/zero-cache/src/server/multi/run-worker.d.ts.map +1 -1
- package/out/zero-cache/src/server/multi/run-worker.js +1 -3
- package/out/zero-cache/src/server/multi/run-worker.js.map +1 -1
- package/out/zero-cache/src/server/replicator.js +1 -1
- package/out/zero-cache/src/server/replicator.js.map +1 -1
- package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
- package/out/zero-cache/src/server/syncer.js +14 -12
- package/out/zero-cache/src/server/syncer.js.map +1 -1
- package/out/zero-cache/src/services/change-source/custom/change-source.d.ts +5 -5
- package/out/zero-cache/src/services/change-source/custom/change-source.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/custom/change-source.js +21 -19
- package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-source/custom/sync-schema.d.ts +2 -2
- package/out/zero-cache/src/services/change-source/custom/sync-schema.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/custom/sync-schema.js +2 -2
- package/out/zero-cache/src/services/change-source/custom/sync-schema.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source.d.ts +5 -5
- package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/change-source.js +41 -34
- package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/decommission.d.ts +4 -0
- package/out/zero-cache/src/services/change-source/pg/decommission.d.ts.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/decommission.js +21 -0
- package/out/zero-cache/src/services/change-source/pg/decommission.js.map +1 -0
- package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +4 -3
- package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/initial-sync.js +45 -25
- package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts +3 -2
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.js +35 -16
- package/out/zero-cache/src/services/change-source/pg/schema/ddl.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts +4 -3
- package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/init.js +53 -13
- package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts +2 -2
- package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/published.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +10 -12
- package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js +52 -53
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/sync-schema.d.ts +2 -2
- package/out/zero-cache/src/services/change-source/pg/sync-schema.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/sync-schema.js +11 -2
- package/out/zero-cache/src/services/change-source/pg/sync-schema.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +3 -2
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +11 -11
- package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/init.d.ts +3 -2
- package/out/zero-cache/src/services/change-streamer/schema/init.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/init.js +25 -14
- package/out/zero-cache/src/services/change-streamer/schema/init.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +6 -5
- package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/schema/tables.js +28 -26
- package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.d.ts +4 -2
- package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-streamer/storer.js +19 -9
- package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
- package/out/zero-cache/src/services/litestream/commands.d.ts +1 -1
- package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
- package/out/zero-cache/src/services/litestream/commands.js +3 -3
- package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.d.ts +3 -2
- package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.js +14 -16
- package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
- package/out/zero-cache/src/services/replicator/schema/replication-state.d.ts +14 -5
- package/out/zero-cache/src/services/replicator/schema/replication-state.d.ts.map +1 -1
- package/out/zero-cache/src/services/replicator/schema/replication-state.js +29 -1
- package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +3 -2
- package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-handler.js +5 -3
- package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +3 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.js +21 -11
- package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr.d.ts +5 -3
- package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr.js +100 -66
- package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/database-storage.d.ts +2 -0
- package/out/zero-cache/src/services/view-syncer/database-storage.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/database-storage.js +8 -3
- package/out/zero-cache/src/services/view-syncer/database-storage.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +2 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/row-record-cache.d.ts +3 -2
- package/out/zero-cache/src/services/view-syncer/row-record-cache.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/row-record-cache.js +5 -3
- package/out/zero-cache/src/services/view-syncer/row-record-cache.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/cvr.d.ts +3 -5
- package/out/zero-cache/src/services/view-syncer/schema/cvr.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/cvr.js +38 -40
- package/out/zero-cache/src/services/view-syncer/schema/cvr.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/init.d.ts +2 -1
- package/out/zero-cache/src/services/view-syncer/schema/init.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/init.js +7 -6
- package/out/zero-cache/src/services/view-syncer/schema/init.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/types.d.ts +26 -18
- package/out/zero-cache/src/services/view-syncer/schema/types.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/schema/types.js +12 -9
- package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +2 -1
- package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/snapshotter.js +1 -1
- package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +18 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.js +194 -43
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
- package/out/zero-cache/src/types/lite.d.ts +2 -2
- package/out/zero-cache/src/types/lite.d.ts.map +1 -1
- package/out/zero-cache/src/types/lite.js +9 -4
- package/out/zero-cache/src/types/lite.js.map +1 -1
- package/out/zero-cache/src/types/pg.d.ts +7 -3
- package/out/zero-cache/src/types/pg.d.ts.map +1 -1
- package/out/zero-cache/src/types/pg.js +11 -5
- package/out/zero-cache/src/types/pg.js.map +1 -1
- package/out/zero-cache/src/types/shards.d.ts +33 -0
- package/out/zero-cache/src/types/shards.d.ts.map +1 -0
- package/out/zero-cache/src/types/shards.js +44 -0
- package/out/zero-cache/src/types/shards.js.map +1 -0
- package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
- package/out/zero-cache/src/workers/connection.js +39 -20
- package/out/zero-cache/src/workers/connection.js.map +1 -1
- package/out/zero-cache/src/workers/replicator.d.ts +2 -1
- package/out/zero-cache/src/workers/replicator.d.ts.map +1 -1
- package/out/zero-cache/src/workers/replicator.js +42 -17
- package/out/zero-cache/src/workers/replicator.js.map +1 -1
- package/out/zero-cache/src/workers/syncer-ws-message-handler.d.ts +4 -4
- package/out/zero-cache/src/workers/syncer-ws-message-handler.d.ts.map +1 -1
- package/out/zero-cache/src/workers/syncer-ws-message-handler.js +5 -2
- package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
- package/out/zero-client/src/client/custom.d.ts +2 -11
- package/out/zero-client/src/client/custom.d.ts.map +1 -1
- package/out/zero-client/src/client/zero.d.ts.map +1 -1
- package/out/zero-client/src/mod.d.ts +1 -0
- package/out/zero-client/src/mod.d.ts.map +1 -1
- package/out/zero-pg/src/custom.d.ts +1 -2
- package/out/zero-pg/src/custom.d.ts.map +1 -1
- package/out/zero-pg/src/custom.js.map +1 -1
- package/out/zero-pg/src/mod.d.ts +2 -2
- package/out/zero-pg/src/mod.d.ts.map +1 -1
- package/out/zero-pg/src/query.d.ts +3 -4
- package/out/zero-pg/src/query.d.ts.map +1 -1
- package/out/zero-pg/src/query.js +5 -7
- package/out/zero-pg/src/query.js.map +1 -1
- package/out/zero-pg/src/web.d.ts +1 -1
- package/out/zero-pg/src/web.d.ts.map +1 -1
- package/out/zero-pg/src/web.js.map +1 -1
- package/out/zero-protocol/src/close-connection.d.ts +16 -0
- package/out/zero-protocol/src/close-connection.d.ts.map +1 -0
- package/out/zero-protocol/src/close-connection.js +17 -0
- package/out/zero-protocol/src/close-connection.js.map +1 -0
- package/out/zero-protocol/src/up.d.ts +1 -1
- package/out/zero-protocol/src/up.d.ts.map +1 -1
- package/out/zero-protocol/src/up.js +2 -1
- package/out/zero-protocol/src/up.js.map +1 -1
- package/out/zero-react/src/use-query.d.ts +11 -2
- package/out/zero-react/src/use-query.d.ts.map +1 -1
- package/out/zero-solid/src/use-query.d.ts +4 -1
- package/out/zero-solid/src/use-query.d.ts.map +1 -1
- package/out/zero.js +1 -2
- package/out/zql/src/ivm/exists.d.ts.map +1 -1
- package/out/zql/src/ivm/exists.js +134 -138
- package/out/zql/src/ivm/exists.js.map +1 -1
- package/out/zql/src/mutate/custom.d.ts +36 -1
- package/out/zql/src/mutate/custom.d.ts.map +1 -1
- package/out/zql/src/mutate/custom.js.map +1 -1
- package/out/zql/src/query/query-impl.d.ts +8 -8
- package/out/zql/src/query/query-impl.d.ts.map +1 -1
- package/out/zql/src/query/query-impl.js +29 -25
- package/out/zql/src/query/query-impl.js.map +1 -1
- package/out/zql/src/query/query-internal.d.ts +2 -2
- package/out/zql/src/query/query-internal.d.ts.map +1 -1
- package/out/zql/src/query/query.d.ts +10 -2
- package/out/zql/src/query/query.d.ts.map +1 -1
- package/out/zql/src/query/query.js +1 -1
- package/out/zql/src/query/query.js.map +1 -1
- package/out/zql/src/query/static-query.d.ts +1 -1
- package/out/zql/src/query/static-query.d.ts.map +1 -1
- package/out/zql/src/query/static-query.js +2 -2
- package/out/zql/src/query/static-query.js.map +1 -1
- package/out/zqlite/src/db.d.ts +3 -1
- package/out/zqlite/src/db.d.ts.map +1 -1
- package/out/zqlite/src/db.js +47 -0
- package/out/zqlite/src/db.js.map +1 -1
- package/package.json +3 -3
- package/out/chunk-5BT5TJFM.js.map +0 -7
- package/out/chunk-P3NUVEQJ.js +0 -3578
- package/out/chunk-P3NUVEQJ.js.map +0 -7
- package/out/pg.js +0 -593
- package/out/pg.js.map +0 -7
- package/out/zero-cache/src/services/change-source/pg/shard-config.d.ts +0 -19
- package/out/zero-cache/src/services/change-source/pg/shard-config.d.ts.map +0 -1
- package/out/zero-cache/src/services/change-source/pg/shard-config.js +0 -2
- package/out/zero-cache/src/services/change-source/pg/shard-config.js.map +0 -1
- package/out/zero-pg/src/db.d.ts +0 -27
- package/out/zero-pg/src/db.d.ts.map +0 -1
- package/out/zero-pg/src/db.js +0 -2
- package/out/zero-pg/src/db.js.map +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { literal as lit } from 'pg-format';
|
|
2
2
|
import * as v from "../../../../../../shared/src/valita.js";
|
|
3
|
+
import { upstreamSchema } from "../../../../types/shards.js";
|
|
3
4
|
import { id } from "../../../../types/sql.js";
|
|
4
5
|
import { indexDefinitionsQuery, publishedSchema, publishedTableQuery, } from "./published.js";
|
|
5
6
|
// Sent in the 'version' tag of "ddlStart" and "ddlUpdate" event messages.
|
|
@@ -96,9 +97,10 @@ export const ddlUpdateEventSchema = ddlEventSchema.extend({
|
|
|
96
97
|
event: v.union(tableEvent, indexEvent, dropEvent, publicationEvent),
|
|
97
98
|
});
|
|
98
99
|
export const replicationEventSchema = v.union(ddlStartEventSchema, ddlUpdateEventSchema);
|
|
99
|
-
// Creates a function that appends `
|
|
100
|
-
|
|
101
|
-
|
|
100
|
+
// Creates a function that appends `_{shard-num}` to the input and
|
|
101
|
+
// quotes the result to be a valid identifier.
|
|
102
|
+
function append(shardNum) {
|
|
103
|
+
return (name) => id(name + '_' + String(shardNum));
|
|
102
104
|
}
|
|
103
105
|
/**
|
|
104
106
|
* Event trigger functions contain the core logic that are invoked by triggers.
|
|
@@ -117,8 +119,9 @@ export function append(shardID) {
|
|
|
117
119
|
* Instead, we opt for the simplicity and isolation of having each shard
|
|
118
120
|
* completely own (and maintain) the entirety of its trigger/function stack.
|
|
119
121
|
*/
|
|
120
|
-
function createEventFunctionStatements(
|
|
121
|
-
const
|
|
122
|
+
function createEventFunctionStatements(shard) {
|
|
123
|
+
const { appID, shardNum, publications } = shard;
|
|
124
|
+
const schema = id(upstreamSchema(shard)); // e.g. "{APP_ID}_{SHARD_ID}"
|
|
122
125
|
return `
|
|
123
126
|
CREATE SCHEMA IF NOT EXISTS ${schema};
|
|
124
127
|
|
|
@@ -136,7 +139,7 @@ $$ LANGUAGE plpgsql;
|
|
|
136
139
|
CREATE OR REPLACE FUNCTION ${schema}.notice_ignore(object_id TEXT)
|
|
137
140
|
RETURNS void AS $$
|
|
138
141
|
BEGIN
|
|
139
|
-
RAISE NOTICE 'zero(%) ignoring %', ${lit(
|
|
142
|
+
RAISE NOTICE 'zero(%) ignoring %', ${lit(shardNum)}, object_id;
|
|
140
143
|
END
|
|
141
144
|
$$ LANGUAGE plpgsql;
|
|
142
145
|
|
|
@@ -172,7 +175,7 @@ BEGIN
|
|
|
172
175
|
'context', ${schema}.get_trigger_context()
|
|
173
176
|
) INTO message;
|
|
174
177
|
|
|
175
|
-
PERFORM pg_logical_emit_message(true, ${lit(
|
|
178
|
+
PERFORM pg_logical_emit_message(true, ${lit(`${appID}/${shardNum}`)}, message);
|
|
176
179
|
END
|
|
177
180
|
$$ LANGUAGE plpgsql;
|
|
178
181
|
|
|
@@ -270,7 +273,7 @@ BEGIN
|
|
|
270
273
|
'context', ${schema}.get_trigger_context()
|
|
271
274
|
) INTO message;
|
|
272
275
|
|
|
273
|
-
PERFORM pg_logical_emit_message(true, ${lit(
|
|
276
|
+
PERFORM pg_logical_emit_message(true, ${lit(`${appID}/${shardNum}`)}, message);
|
|
274
277
|
END
|
|
275
278
|
$$ LANGUAGE plpgsql;
|
|
276
279
|
`;
|
|
@@ -284,17 +287,19 @@ export const TAGS = [
|
|
|
284
287
|
'DROP INDEX',
|
|
285
288
|
'ALTER PUBLICATION',
|
|
286
289
|
];
|
|
287
|
-
export function createEventTriggerStatements(
|
|
290
|
+
export function createEventTriggerStatements(shard) {
|
|
288
291
|
// Unlike functions, which are namespaced in shard-specific schemas,
|
|
289
|
-
// EVENT TRIGGER names are in the global namespace and
|
|
290
|
-
|
|
291
|
-
const
|
|
292
|
+
// EVENT TRIGGER names are in the global namespace and thus must include
|
|
293
|
+
// the appID and shardNum.
|
|
294
|
+
const { appID, shardNum } = shard;
|
|
295
|
+
const sharded = append(shardNum);
|
|
296
|
+
const schema = id(upstreamSchema(shard));
|
|
292
297
|
const triggers = [
|
|
293
|
-
|
|
298
|
+
dropEventTriggerStatements(shard.appID, shard.shardNum),
|
|
299
|
+
createEventFunctionStatements(shard),
|
|
294
300
|
];
|
|
295
301
|
// A single ddl_command_start trigger covering all relevant tags.
|
|
296
302
|
triggers.push(`
|
|
297
|
-
DROP EVENT TRIGGER IF EXISTS ${sharded(`${appID}_ddl_start`)};
|
|
298
303
|
CREATE EVENT TRIGGER ${sharded(`${appID}_ddl_start`)}
|
|
299
304
|
ON ddl_command_start
|
|
300
305
|
WHEN TAG IN (${lit(TAGS)})
|
|
@@ -311,8 +316,6 @@ BEGIN
|
|
|
311
316
|
END
|
|
312
317
|
$$ LANGUAGE plpgsql;
|
|
313
318
|
|
|
314
|
-
|
|
315
|
-
DROP EVENT TRIGGER IF EXISTS ${sharded(`${appID}_${tagID}`)};
|
|
316
319
|
CREATE EVENT TRIGGER ${sharded(`${appID}_${tagID}`)}
|
|
317
320
|
ON ddl_command_end
|
|
318
321
|
WHEN TAG IN (${lit(tag)})
|
|
@@ -321,4 +324,20 @@ CREATE EVENT TRIGGER ${sharded(`${appID}_${tagID}`)}
|
|
|
321
324
|
}
|
|
322
325
|
return triggers.join('');
|
|
323
326
|
}
|
|
327
|
+
// Exported for testing.
|
|
328
|
+
export function dropEventTriggerStatements(appID, shardID) {
|
|
329
|
+
const stmts = [];
|
|
330
|
+
// A single ddl_command_start trigger covering all relevant tags.
|
|
331
|
+
stmts.push(`
|
|
332
|
+
DROP EVENT TRIGGER IF EXISTS ${id(`${appID}_ddl_start_${shardID}`)};
|
|
333
|
+
`);
|
|
334
|
+
// A per-tag ddl_command_end trigger that dispatches to ${schema}.emit_ddl_end(tag)
|
|
335
|
+
for (const tag of TAGS) {
|
|
336
|
+
const tagID = tag.toLowerCase().replace(' ', '_');
|
|
337
|
+
stmts.push(`
|
|
338
|
+
DROP EVENT TRIGGER IF EXISTS ${id(`${appID}_${tagID}_${shardID}`)};
|
|
339
|
+
`);
|
|
340
|
+
}
|
|
341
|
+
return stmts.join('');
|
|
342
|
+
}
|
|
324
343
|
//# sourceMappingURL=ddl.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ddl.js","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/ddl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,IAAI,GAAG,EAAC,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,CAAC,MAAM,wCAAwC,CAAC;AAC5D,OAAO,EAAC,EAAE,EAAC,MAAM,0BAA0B,CAAC;AAC5C,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,0EAA0E;AAC1E,sEAAsE;AACtE,gFAAgF;AAChF,EAAE;AACF,+EAA+E;AAC/E,0EAA0E;AAC1E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CACxD,CAAC,CAAC;AAEH,2EAA2E;AAC3E,yCAAyC;AACzC,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC;IAChD,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACpC,MAAM,EAAE,eAAe;CACxB,CAAC,CAAC;AAEH,2EAA2E;AAC3E,+EAA+E;AAC/E,4EAA4E;AAC5E,2EAA2E;AAC3E,6EAA6E;AAC7E,+EAA+E;AAC/E,yDAAyD;AACzD,MAAM,CAAC,MAAM,mBAAmB,GAAG,cAAc,CAAC,MAAM,CAAC;IACvD,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;CAC5B,CAAC,CAAC;AAIH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACjE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAC,CAAC;CACxD,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;IAC9B,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAC,CAAC;CACxD,CAAC,CAAC;AAEH;;;;;;;;GAQG;AACH,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IACzB,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;CAC/D,CAAC,CAAC;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC;CACpC,CAAC,CAAC;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,cAAc,CAAC,MAAM,CAAC;IACxD,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IAC5B,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,CAAC;CACpE,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAC3C,mBAAmB,EACnB,oBAAoB,CACrB,CAAC;AAIF,
|
|
1
|
+
{"version":3,"file":"ddl.js","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/ddl.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import type { LogContext } from '@rocicorp/logger';
|
|
2
2
|
import type { PostgresDB } from '../../../../types/pg.ts';
|
|
3
|
-
import type
|
|
3
|
+
import { type ShardConfig } from '../../../../types/shards.ts';
|
|
4
4
|
/**
|
|
5
5
|
* Initializes a shard for initial sync.
|
|
6
6
|
* This will drop any existing shard setup.
|
|
7
7
|
*/
|
|
8
|
-
export declare function initShardSchema(lc: LogContext, db: PostgresDB,
|
|
8
|
+
export declare function initShardSchema(lc: LogContext, db: PostgresDB, shard: ShardConfig): Promise<void>;
|
|
9
9
|
/**
|
|
10
10
|
* Updates the schema for an existing shard.
|
|
11
11
|
*/
|
|
12
|
-
export declare function updateShardSchema(lc: LogContext, db: PostgresDB,
|
|
12
|
+
export declare function updateShardSchema(lc: LogContext, db: PostgresDB, shard: ShardConfig, replicaVersion: string): Promise<void>;
|
|
13
|
+
export declare function decommissionLegacyShard(lc: LogContext, db: PostgresDB, shard: ShardConfig): Promise<void>;
|
|
13
14
|
//# sourceMappingURL=init.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAQjD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAiB,KAAK,WAAW,EAAC,MAAM,6BAA6B,CAAC;AAK7E;;;GAGG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,WAAW,EAClB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC,CAaf;AA6DD,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,WAAW,iBAYnB"}
|
|
@@ -1,28 +1,34 @@
|
|
|
1
|
+
import { assert } from "../../../../../../shared/src/asserts.js";
|
|
1
2
|
import { getVersionHistory, runSchemaMigrations, } from "../../../../db/migration.js";
|
|
3
|
+
import { upstreamSchema } from "../../../../types/shards.js";
|
|
2
4
|
import { AutoResetSignal } from "../../../change-streamer/schema/tables.js";
|
|
3
|
-
import {
|
|
5
|
+
import { decommissionShard } from "../decommission.js";
|
|
6
|
+
import { dropShard, setupTablesAndReplication } from "./shard.js";
|
|
4
7
|
/**
|
|
5
8
|
* Initializes a shard for initial sync.
|
|
6
9
|
* This will drop any existing shard setup.
|
|
7
10
|
*/
|
|
8
|
-
export async function initShardSchema(lc, db,
|
|
9
|
-
await db.unsafe(dropShard(appID,
|
|
10
|
-
return runShardMigrations(lc, db,
|
|
11
|
+
export async function initShardSchema(lc, db, shard) {
|
|
12
|
+
await db.unsafe(dropShard(shard.appID, shard.shardNum));
|
|
13
|
+
return runShardMigrations(lc, db, shard);
|
|
11
14
|
}
|
|
12
15
|
/**
|
|
13
16
|
* Updates the schema for an existing shard.
|
|
14
17
|
*/
|
|
15
|
-
export async function updateShardSchema(lc, db,
|
|
16
|
-
const {
|
|
17
|
-
const
|
|
18
|
-
if (
|
|
19
|
-
throw new AutoResetSignal(`upstream shard ${appID}_${
|
|
18
|
+
export async function updateShardSchema(lc, db, shard, replicaVersion) {
|
|
19
|
+
const { appID, shardNum } = shard;
|
|
20
|
+
const versionHistory = await getVersionHistory(db, upstreamSchema(shard));
|
|
21
|
+
if (versionHistory === null) {
|
|
22
|
+
throw new AutoResetSignal(`upstream shard ${appID}_${shardNum} is not initialized`);
|
|
20
23
|
}
|
|
21
|
-
|
|
24
|
+
await runShardMigrations(lc, db, shard, replicaVersion);
|
|
25
|
+
// The decommission check is run in updateShardSchema so that it happens
|
|
26
|
+
// after initial sync, and not when the shard schema is initially set up.
|
|
27
|
+
await decommissionLegacyShard(lc, db, shard);
|
|
22
28
|
}
|
|
23
|
-
async function runShardMigrations(lc, db,
|
|
29
|
+
async function runShardMigrations(lc, db, shard, replicaVersion) {
|
|
24
30
|
const setupMigration = {
|
|
25
|
-
migrateSchema: (lc, tx) => setupTablesAndReplication(lc, tx,
|
|
31
|
+
migrateSchema: (lc, tx) => setupTablesAndReplication(lc, tx, shard),
|
|
26
32
|
minSafeVersion: 1,
|
|
27
33
|
};
|
|
28
34
|
const schemaVersionMigrationMap = {
|
|
@@ -32,7 +38,41 @@ async function runShardMigrations(lc, db, appID, shard) {
|
|
|
32
38
|
},
|
|
33
39
|
minSafeVersion: 3,
|
|
34
40
|
},
|
|
41
|
+
// v5 changes the upstream schema organization from "zero_{SHARD_ID}" to
|
|
42
|
+
// the "{APP_ID}_0". An incremental migration indicates that the previous
|
|
43
|
+
// SHARD_ID was "0" and the new APP_ID is "zero" (i.e. the default values
|
|
44
|
+
// for those options). In this case, the upstream format is identical, and
|
|
45
|
+
// no migration is necessary. However, the version is bumped to v5 to
|
|
46
|
+
// indicate that it was created with the {APP_ID} configuration and should
|
|
47
|
+
// not be decommissioned as a legacy shard.
|
|
48
|
+
5: {},
|
|
49
|
+
6: {
|
|
50
|
+
migrateSchema: async (lc, tx) => {
|
|
51
|
+
assert(replicaVersion, `replicaVersion is always passed for incremental migrations`);
|
|
52
|
+
await Promise.all([
|
|
53
|
+
tx `
|
|
54
|
+
ALTER TABLE ${tx(upstreamSchema(shard))}."shardConfig"
|
|
55
|
+
ADD "replicaVersion" TEXT`,
|
|
56
|
+
tx `
|
|
57
|
+
UPDATE ${tx(upstreamSchema(shard))}."shardConfig"
|
|
58
|
+
SET ${tx({ replicaVersion })}`,
|
|
59
|
+
]);
|
|
60
|
+
lc.info?.(`Recorded replicaVersion ${replicaVersion} in upstream shardConfig`);
|
|
61
|
+
},
|
|
62
|
+
},
|
|
35
63
|
};
|
|
36
|
-
await runSchemaMigrations(lc, `upstream-shard-${shard.
|
|
64
|
+
await runSchemaMigrations(lc, `upstream-shard-${shard.appID}`, upstreamSchema(shard), db, setupMigration, schemaVersionMigrationMap);
|
|
65
|
+
}
|
|
66
|
+
export async function decommissionLegacyShard(lc, db, shard) {
|
|
67
|
+
if (shard.appID !== 'zero') {
|
|
68
|
+
// When migration from non-default shard ids, e.g. "zero_prod" => "prod_0",
|
|
69
|
+
// clean up the old "zero_prod" shard if it is pre-v5. Note that the v5
|
|
70
|
+
// check is important to guard against cleaning up a **new** "zero_0" app
|
|
71
|
+
// that coexists with the current App (with app-id === "0").
|
|
72
|
+
const versionHistory = await getVersionHistory(db, `zero_${shard.appID}`);
|
|
73
|
+
if (versionHistory !== null && versionHistory.schemaVersion < 5) {
|
|
74
|
+
await decommissionShard(lc, db, 'zero', shard.appID);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
37
77
|
}
|
|
38
78
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/init.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,mBAAmB,GAGpB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAC,eAAe,EAAC,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type postgres from 'postgres';
|
|
2
2
|
import * as v from '../../../../../../shared/src/valita.ts';
|
|
3
|
-
export declare function publishedTableQuery(publications: string[]): string;
|
|
4
|
-
export declare function indexDefinitionsQuery(publications: string[]): string;
|
|
3
|
+
export declare function publishedTableQuery(publications: readonly string[]): string;
|
|
4
|
+
export declare function indexDefinitionsQuery(publications: readonly string[]): string;
|
|
5
5
|
export declare const publishedSchema: v.ObjectType<Omit<{
|
|
6
6
|
tables: v.ArrayType<v.ObjectType<Omit<Omit<{
|
|
7
7
|
name: v.Type<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"published.d.ts","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/published.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AAErC,OAAO,KAAK,CAAC,MAAM,wCAAwC,CAAC;AAG5D,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"published.d.ts","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/published.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AAErC,OAAO,KAAK,CAAC,MAAM,wCAAwC,CAAC;AAG5D,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,UA6ElE;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,UAyEpE;AAKD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAE3B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAY9D,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAEzB,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,QAAQ,CAAC,GAAG,EACjB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,eAAe,CAAC,CAiD1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"published.js","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/published.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAC;AAElC,OAAO,EAAC,MAAM,EAAC,MAAM,2CAA2C,CAAC;AACjE,OAAO,KAAK,CAAC,MAAM,wCAAwC,CAAC;AAC5D,OAAO,EAAC,kBAAkB,EAAE,kBAAkB,EAAC,MAAM,yBAAyB,CAAC;AAE/E,MAAM,UAAU,mBAAmB,CAAC,
|
|
1
|
+
{"version":3,"file":"published.js","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/published.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,18 @@
|
|
|
1
1
|
import type { LogContext } from '@rocicorp/logger';
|
|
2
2
|
import * as v from '../../../../../../shared/src/valita.ts';
|
|
3
3
|
import type { PostgresDB, PostgresTransaction } from '../../../../types/pg.ts';
|
|
4
|
-
import type { ShardConfig } from '
|
|
4
|
+
import type { AppID, ShardConfig, ShardID } from '../../../../types/shards.ts';
|
|
5
5
|
import { type PublicationInfo, type PublishedSchema } from './published.ts';
|
|
6
|
-
export declare function
|
|
7
|
-
export declare function
|
|
8
|
-
export declare function unescapedSchema(appID: string, shardID: string): string;
|
|
9
|
-
export declare function internalPublicationPrefix(appID: string): string;
|
|
10
|
-
export declare function globalSetup(appID: string): string;
|
|
11
|
-
export declare function ensureGlobalTables(db: PostgresDB, appID: string): Promise<void>;
|
|
6
|
+
export declare function internalPublicationPrefix({ appID }: AppID): string;
|
|
7
|
+
export declare function ensureGlobalTables(db: PostgresDB, appID: AppID): Promise<void>;
|
|
12
8
|
export declare function getClientsTableDefinition(schema: string): string;
|
|
13
|
-
export declare
|
|
14
|
-
export declare function
|
|
9
|
+
export declare const SHARD_CONFIG_TABLE = "shardConfig";
|
|
10
|
+
export declare function shardSetup(shardConfig: ShardConfig, metadataPublication: string): string;
|
|
11
|
+
export declare function dropShard(appID: string, shardID: string | number): string;
|
|
15
12
|
declare const internalShardConfigSchema: v.ObjectType<{
|
|
16
13
|
publications: v.ArrayType<v.Type<string>>;
|
|
17
14
|
ddlDetection: v.Type<boolean>;
|
|
15
|
+
replicaVersion: v.Type<string | null>;
|
|
18
16
|
initialSchema: v.Type<{
|
|
19
17
|
tables: {
|
|
20
18
|
primaryKey?: string[] | undefined;
|
|
@@ -47,13 +45,13 @@ declare const internalShardConfigSchema: v.ObjectType<{
|
|
|
47
45
|
} | null>;
|
|
48
46
|
}, undefined>;
|
|
49
47
|
export type InternalShardConfig = v.Infer<typeof internalShardConfigSchema>;
|
|
50
|
-
export declare function setInitialSchema(db: PostgresDB,
|
|
51
|
-
export declare function getInternalShardConfig(db: PostgresDB,
|
|
48
|
+
export declare function setInitialSchema(db: PostgresDB, shard: ShardID, replicaVersion: string, { tables, indexes }: PublishedSchema): Promise<void>;
|
|
49
|
+
export declare function getInternalShardConfig(db: PostgresDB, shard: ShardID): Promise<InternalShardConfig>;
|
|
52
50
|
/**
|
|
53
51
|
* Sets up and returns all publications (including internal ones) for
|
|
54
52
|
* the given shard.
|
|
55
53
|
*/
|
|
56
|
-
export declare function setupTablesAndReplication(lc: LogContext, tx: PostgresTransaction,
|
|
54
|
+
export declare function setupTablesAndReplication(lc: LogContext, tx: PostgresTransaction, requested: ShardConfig): Promise<void>;
|
|
57
55
|
export declare function validatePublications(lc: LogContext, published: PublicationInfo): void;
|
|
58
56
|
type ReplicaIdentities = {
|
|
59
57
|
apply(lc: LogContext, db: PostgresDB): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shard.d.ts","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/shard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAIjD,OAAO,KAAK,CAAC,MAAM,wCAAwC,CAAC;AAE5D,OAAO,KAAK,EAAC,UAAU,EAAE,mBAAmB,EAAC,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"shard.d.ts","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/shard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAIjD,OAAO,KAAK,CAAC,MAAM,wCAAwC,CAAC;AAE5D,OAAO,KAAK,EAAC,UAAU,EAAE,mBAAmB,EAAC,MAAM,yBAAyB,CAAC;AAC7E,OAAO,KAAK,EAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAC,MAAM,6BAA6B,CAAC;AAI7E,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AAGxB,wBAAgB,yBAAyB,CAAC,EAAC,KAAK,EAAC,EAAE,KAAK,UAEvD;AAyDD,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,iBAEpE;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,UAQvD;AAED,eAAO,MAAM,kBAAkB,gBAAgB,CAAC;AAEhD,wBAAgB,UAAU,CACxB,WAAW,EAAE,WAAW,EACxB,mBAAmB,EAAE,MAAM,GAC1B,MAAM,CAkCR;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAYzE;AAED,QAAA,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAK7B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAc5E,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,OAAO,EACd,cAAc,EAAE,MAAM,EACtB,EAAC,MAAM,EAAE,OAAO,EAAC,EAAE,eAAe,iBAQnC;AAED,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,mBAAmB,CAAC,CAO9B;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,mBAAmB,EACvB,SAAS,EAAE,WAAW,iBA0EvB;AAED,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,UAAU,EACd,SAAS,EAAE,eAAe,QAkB3B;AAED,KAAK,iBAAiB,GAAG;IACvB,KAAK,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD,CAAC;AAEF,wBAAgB,4CAA4C,CAC1D,IAAI,EAAE,eAAe,GACpB,iBAAiB,GAAG,SAAS,CA+C/B"}
|
|
@@ -4,21 +4,12 @@ import postgres from 'postgres';
|
|
|
4
4
|
import { assert } from "../../../../../../shared/src/asserts.js";
|
|
5
5
|
import * as v from "../../../../../../shared/src/valita.js";
|
|
6
6
|
import { Default } from "../../../../db/postgres-replica-identity-enum.js";
|
|
7
|
+
import { appSchema, upstreamSchema } from "../../../../types/shards.js";
|
|
7
8
|
import { id } from "../../../../types/sql.js";
|
|
8
9
|
import { createEventTriggerStatements } from "./ddl.js";
|
|
9
10
|
import { getPublicationInfo, publishedSchema, } from "./published.js";
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
export function append(shardID) {
|
|
13
|
-
return (name) => id(name + '_' + shardID);
|
|
14
|
-
}
|
|
15
|
-
export function schemaFor(appID, shardID) {
|
|
16
|
-
return append(shardID)(appID);
|
|
17
|
-
}
|
|
18
|
-
export function unescapedSchema(appID, shardID) {
|
|
19
|
-
return `${appID}_${shardID}`;
|
|
20
|
-
}
|
|
21
|
-
export function internalPublicationPrefix(appID) {
|
|
11
|
+
import { validate } from "./validation.js";
|
|
12
|
+
export function internalPublicationPrefix({ appID }) {
|
|
22
13
|
return `_${appID}_`;
|
|
23
14
|
}
|
|
24
15
|
function defaultPublicationName(appID, shardID) {
|
|
@@ -28,14 +19,12 @@ function metadataPublicationName(appID, shardID) {
|
|
|
28
19
|
return `_${appID}_metadata_${shardID}`;
|
|
29
20
|
}
|
|
30
21
|
// The GLOBAL_SETUP must be idempotent as it can be run multiple times for different shards.
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
// Sanity check; should already be validated upstream.
|
|
34
|
-
assert(ALLOWED_APP_ID_CHARACTERS.test(appID), `Invalid App ID ${appID}`);
|
|
22
|
+
function globalSetup(appID) {
|
|
23
|
+
const app = id(appSchema(appID));
|
|
35
24
|
return `
|
|
36
|
-
CREATE SCHEMA IF NOT EXISTS ${
|
|
25
|
+
CREATE SCHEMA IF NOT EXISTS ${app};
|
|
37
26
|
|
|
38
|
-
CREATE TABLE IF NOT EXISTS ${
|
|
27
|
+
CREATE TABLE IF NOT EXISTS ${app}."schemaVersions" (
|
|
39
28
|
"minSupportedVersion" INT4,
|
|
40
29
|
"maxSupportedVersion" INT4,
|
|
41
30
|
|
|
@@ -45,10 +34,10 @@ export function globalSetup(appID) {
|
|
|
45
34
|
"lock" BOOL PRIMARY KEY DEFAULT true CHECK (lock)
|
|
46
35
|
);
|
|
47
36
|
|
|
48
|
-
INSERT INTO ${
|
|
37
|
+
INSERT INTO ${app}."schemaVersions" ("lock", "minSupportedVersion", "maxSupportedVersion")
|
|
49
38
|
VALUES (true, 1, 1) ON CONFLICT DO NOTHING;
|
|
50
39
|
|
|
51
|
-
CREATE TABLE IF NOT EXISTS ${
|
|
40
|
+
CREATE TABLE IF NOT EXISTS ${app}.permissions (
|
|
52
41
|
"permissions" JSONB,
|
|
53
42
|
"hash" TEXT,
|
|
54
43
|
|
|
@@ -58,7 +47,7 @@ export function globalSetup(appID) {
|
|
|
58
47
|
"lock" BOOL PRIMARY KEY DEFAULT true CHECK (lock)
|
|
59
48
|
);
|
|
60
49
|
|
|
61
|
-
CREATE OR REPLACE FUNCTION ${
|
|
50
|
+
CREATE OR REPLACE FUNCTION ${app}.set_permissions_hash()
|
|
62
51
|
RETURNS TRIGGER AS $$
|
|
63
52
|
BEGIN
|
|
64
53
|
NEW.hash = md5(NEW.permissions::text);
|
|
@@ -67,11 +56,11 @@ export function globalSetup(appID) {
|
|
|
67
56
|
$$ LANGUAGE plpgsql;
|
|
68
57
|
|
|
69
58
|
CREATE OR REPLACE TRIGGER on_set_permissions
|
|
70
|
-
BEFORE INSERT OR UPDATE ON ${
|
|
59
|
+
BEFORE INSERT OR UPDATE ON ${app}.permissions
|
|
71
60
|
FOR EACH ROW
|
|
72
|
-
EXECUTE FUNCTION ${
|
|
61
|
+
EXECUTE FUNCTION ${app}.set_permissions_hash();
|
|
73
62
|
|
|
74
|
-
INSERT INTO ${
|
|
63
|
+
INSERT INTO ${app}.permissions (permissions) VALUES (NULL) ON CONFLICT DO NOTHING;
|
|
75
64
|
`;
|
|
76
65
|
}
|
|
77
66
|
export async function ensureGlobalTables(db, appID) {
|
|
@@ -86,40 +75,42 @@ export function getClientsTableDefinition(schema) {
|
|
|
86
75
|
PRIMARY KEY("clientGroupID", "clientID")
|
|
87
76
|
);`;
|
|
88
77
|
}
|
|
89
|
-
export
|
|
90
|
-
|
|
91
|
-
const
|
|
92
|
-
const
|
|
93
|
-
publications.
|
|
94
|
-
|
|
78
|
+
export const SHARD_CONFIG_TABLE = 'shardConfig';
|
|
79
|
+
export function shardSetup(shardConfig, metadataPublication) {
|
|
80
|
+
const app = id(appSchema(shardConfig));
|
|
81
|
+
const shard = id(upstreamSchema(shardConfig));
|
|
82
|
+
const pubs = [...shardConfig.publications].sort();
|
|
83
|
+
assert(pubs.includes(metadataPublication));
|
|
95
84
|
return `
|
|
96
|
-
CREATE SCHEMA IF NOT EXISTS ${
|
|
85
|
+
CREATE SCHEMA IF NOT EXISTS ${shard};
|
|
97
86
|
|
|
98
|
-
${getClientsTableDefinition(
|
|
87
|
+
${getClientsTableDefinition(shard)}
|
|
99
88
|
|
|
100
89
|
CREATE PUBLICATION ${id(metadataPublication)}
|
|
101
|
-
FOR TABLE ${
|
|
90
|
+
FOR TABLE ${app}."schemaVersions", ${app}."permissions", TABLE ${shard}."clients";
|
|
102
91
|
|
|
103
|
-
CREATE TABLE ${
|
|
92
|
+
CREATE TABLE ${shard}."${SHARD_CONFIG_TABLE}" (
|
|
104
93
|
"publications" TEXT[] NOT NULL,
|
|
105
94
|
"ddlDetection" BOOL NOT NULL,
|
|
95
|
+
"replicaVersion" TEXT,
|
|
106
96
|
"initialSchema" JSON,
|
|
107
97
|
|
|
108
98
|
-- Ensure that there is only a single row in the table.
|
|
109
99
|
"lock" BOOL PRIMARY KEY DEFAULT true CHECK (lock)
|
|
110
100
|
);
|
|
111
101
|
|
|
112
|
-
INSERT INTO ${
|
|
113
|
-
("lock", "publications", "ddlDetection", "initialSchema")
|
|
102
|
+
INSERT INTO ${shard}."${SHARD_CONFIG_TABLE}"
|
|
103
|
+
("lock", "publications", "ddlDetection", "replicaVersion", "initialSchema")
|
|
114
104
|
VALUES (true,
|
|
115
|
-
ARRAY[${literal(
|
|
105
|
+
ARRAY[${literal(pubs)}],
|
|
116
106
|
false, -- set in SAVEPOINT with triggerSetup() statements
|
|
117
|
-
null
|
|
107
|
+
null, -- set in initial-sync at consistent_point LSN.
|
|
108
|
+
null -- set in initial-sync at consistent_ponit LSN.
|
|
118
109
|
);
|
|
119
110
|
`;
|
|
120
111
|
}
|
|
121
112
|
export function dropShard(appID, shardID) {
|
|
122
|
-
const schema =
|
|
113
|
+
const schema = `${appID}_${shardID}`;
|
|
123
114
|
const metadataPublication = metadataPublicationName(appID, shardID);
|
|
124
115
|
const defaultPublication = defaultPublicationName(appID, shardID);
|
|
125
116
|
// DROP SCHEMA ... CASCADE does not drop dependent PUBLICATIONS,
|
|
@@ -127,32 +118,36 @@ export function dropShard(appID, shardID) {
|
|
|
127
118
|
return `
|
|
128
119
|
DROP PUBLICATION IF EXISTS ${id(defaultPublication)};
|
|
129
120
|
DROP PUBLICATION IF EXISTS ${id(metadataPublication)};
|
|
130
|
-
DROP SCHEMA IF EXISTS ${schema} CASCADE;
|
|
121
|
+
DROP SCHEMA IF EXISTS ${id(schema)} CASCADE;
|
|
131
122
|
`;
|
|
132
123
|
}
|
|
133
124
|
const internalShardConfigSchema = v.object({
|
|
134
125
|
publications: v.array(v.string()),
|
|
135
126
|
ddlDetection: v.boolean(),
|
|
127
|
+
replicaVersion: v.string().nullable(),
|
|
136
128
|
initialSchema: publishedSchema.nullable(),
|
|
137
129
|
});
|
|
138
130
|
// triggerSetup is run separately in a sub-transaction (i.e. SAVEPOINT) so
|
|
139
131
|
// that a failure (e.g. due to lack of superuser permissions) can be handled
|
|
140
132
|
// by continuing in a degraded mode (ddlDetection = false).
|
|
141
|
-
function triggerSetup(
|
|
142
|
-
const schema =
|
|
143
|
-
return (createEventTriggerStatements(
|
|
133
|
+
function triggerSetup(shard) {
|
|
134
|
+
const schema = id(upstreamSchema(shard));
|
|
135
|
+
return (createEventTriggerStatements(shard) +
|
|
144
136
|
`UPDATE ${schema}."shardConfig" SET "ddlDetection" = true;`);
|
|
145
137
|
}
|
|
146
138
|
// Called in initial-sync to store the exact schema that was initially synced.
|
|
147
|
-
export async function setInitialSchema(db,
|
|
148
|
-
const schema =
|
|
139
|
+
export async function setInitialSchema(db, shard, replicaVersion, { tables, indexes }) {
|
|
140
|
+
const schema = upstreamSchema(shard);
|
|
149
141
|
const synced = { tables, indexes };
|
|
150
|
-
await db `
|
|
142
|
+
await db `
|
|
143
|
+
UPDATE ${db(schema)}."shardConfig"
|
|
144
|
+
SET "replicaVersion" = ${replicaVersion},
|
|
145
|
+
"initialSchema" = ${synced}`;
|
|
151
146
|
}
|
|
152
|
-
export async function getInternalShardConfig(db,
|
|
147
|
+
export async function getInternalShardConfig(db, shard) {
|
|
153
148
|
const result = await db `
|
|
154
|
-
SELECT "publications", "ddlDetection", "initialSchema"
|
|
155
|
-
FROM ${db(
|
|
149
|
+
SELECT "publications", "ddlDetection", "replicaVersion", "initialSchema"
|
|
150
|
+
FROM ${db(upstreamSchema(shard))}."shardConfig";
|
|
156
151
|
`;
|
|
157
152
|
assert(result.length === 1);
|
|
158
153
|
return v.parse(result[0], internalShardConfigSchema, 'passthrough');
|
|
@@ -161,7 +156,8 @@ export async function getInternalShardConfig(db, appID, shardID) {
|
|
|
161
156
|
* Sets up and returns all publications (including internal ones) for
|
|
162
157
|
* the given shard.
|
|
163
158
|
*/
|
|
164
|
-
export async function setupTablesAndReplication(lc, tx,
|
|
159
|
+
export async function setupTablesAndReplication(lc, tx, requested) {
|
|
160
|
+
const { publications } = requested;
|
|
165
161
|
// Validate requested publications.
|
|
166
162
|
for (const pub of publications) {
|
|
167
163
|
if (pub.startsWith('_')) {
|
|
@@ -180,7 +176,7 @@ export async function setupTablesAndReplication(lc, tx, appID, { id, publication
|
|
|
180
176
|
allPublications.push(...publications);
|
|
181
177
|
}
|
|
182
178
|
else {
|
|
183
|
-
const defaultPublication = defaultPublicationName(appID,
|
|
179
|
+
const defaultPublication = defaultPublicationName(requested.appID, requested.shardNum);
|
|
184
180
|
// Note: For re-syncing, this publication is dropped in dropShard(), so an existence
|
|
185
181
|
// check is unnecessary.
|
|
186
182
|
await tx `
|
|
@@ -189,12 +185,15 @@ export async function setupTablesAndReplication(lc, tx, appID, { id, publication
|
|
|
189
185
|
WITH (publish_via_partition_root = true)`;
|
|
190
186
|
allPublications.push(defaultPublication);
|
|
191
187
|
}
|
|
188
|
+
const metadataPublication = metadataPublicationName(requested.appID, requested.shardNum);
|
|
189
|
+
allPublications.push(metadataPublication);
|
|
190
|
+
const shard = { ...requested, publications: allPublications };
|
|
192
191
|
// Setup the global tables and shard tables / publications.
|
|
193
|
-
await tx.unsafe(globalSetup(
|
|
192
|
+
await tx.unsafe(globalSetup(shard) + shardSetup(shard, metadataPublication));
|
|
194
193
|
const pubs = await getPublicationInfo(tx, allPublications);
|
|
195
194
|
await replicaIdentitiesForTablesWithoutPrimaryKeys(pubs)?.apply(lc, tx);
|
|
196
195
|
try {
|
|
197
|
-
await tx.savepoint(sub => sub.unsafe(triggerSetup(
|
|
196
|
+
await tx.savepoint(sub => sub.unsafe(triggerSetup(shard)));
|
|
198
197
|
}
|
|
199
198
|
catch (e) {
|
|
200
199
|
if (!(e instanceof postgres.PostgresError &&
|