@antelopejs/postgres 0.2.2 → 0.2.3
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 +6 -5
- package/dist/config.d.ts +1 -0
- package/dist/config.js +7 -3
- package/dist/config.js.map +1 -1
- package/dist/connect-failure.d.ts +1 -0
- package/dist/connect-failure.js +39 -0
- package/dist/connect-failure.js.map +1 -0
- package/dist/connection.d.ts +2 -1
- package/dist/connection.js +19 -2
- package/dist/connection.js.map +1 -1
- package/dist/implementations/catalog/index.js +3 -6
- package/dist/implementations/catalog/index.js.map +1 -1
- package/dist/implementations/database/coerce.js +20 -20
- package/dist/implementations/database/coerce.js.map +1 -1
- package/dist/implementations/database/context.d.ts +1 -0
- package/dist/implementations/database/context.js +4 -0
- package/dist/implementations/database/context.js.map +1 -1
- package/dist/implementations/database/convergence.d.ts +22 -0
- package/dist/implementations/database/convergence.js +183 -0
- package/dist/implementations/database/convergence.js.map +1 -0
- package/dist/implementations/database/cursors.js +3 -0
- package/dist/implementations/database/cursors.js.map +1 -1
- package/dist/implementations/database/ddl.d.ts +5 -26
- package/dist/implementations/database/ddl.js +15 -191
- package/dist/implementations/database/ddl.js.map +1 -1
- package/dist/implementations/database/external-column-profile.js +6 -1
- package/dist/implementations/database/external-column-profile.js.map +1 -1
- package/dist/implementations/database/external-discovery.js +5 -5
- package/dist/implementations/database/external-discovery.js.map +1 -1
- package/dist/implementations/database/external-measures.js.map +1 -1
- package/dist/implementations/database/external-payload.d.ts +2 -2
- package/dist/implementations/database/external-payload.js +23 -13
- package/dist/implementations/database/external-payload.js.map +1 -1
- package/dist/implementations/database/external-schema.d.ts +2 -2
- package/dist/implementations/database/external-schema.js +3 -3
- package/dist/implementations/database/external-schema.js.map +1 -1
- package/dist/implementations/database/external-types.js +23 -16
- package/dist/implementations/database/external-types.js.map +1 -1
- package/dist/implementations/database/external-writes.d.ts +7 -1
- package/dist/implementations/database/external-writes.js +22 -21
- package/dist/implementations/database/external-writes.js.map +1 -1
- package/dist/implementations/database/feed-pipeline.js +3 -2
- package/dist/implementations/database/feed-pipeline.js.map +1 -1
- package/dist/implementations/database/feeds.d.ts +1 -1
- package/dist/implementations/database/feeds.js +36 -45
- package/dist/implementations/database/feeds.js.map +1 -1
- package/dist/implementations/database/fields.d.ts +9 -13
- package/dist/implementations/database/fields.js +25 -21
- package/dist/implementations/database/fields.js.map +1 -1
- package/dist/implementations/database/guards.d.ts +5 -0
- package/dist/implementations/database/guards.js +23 -0
- package/dist/implementations/database/guards.js.map +1 -0
- package/dist/implementations/database/introspect.d.ts +1 -1
- package/dist/implementations/database/listener.js +9 -3
- package/dist/implementations/database/listener.js.map +1 -1
- package/dist/implementations/database/migrate.d.ts +2 -2
- package/dist/implementations/database/migrate.js +10 -10
- package/dist/implementations/database/migrate.js.map +1 -1
- package/dist/implementations/database/payload.d.ts +3 -3
- package/dist/implementations/database/payload.js +4 -4
- package/dist/implementations/database/pipeline.d.ts +6 -2
- package/dist/implementations/database/pipeline.js +4 -1
- package/dist/implementations/database/pipeline.js.map +1 -1
- package/dist/implementations/database/query.js +12 -7
- package/dist/implementations/database/query.js.map +1 -1
- package/dist/implementations/database/reaper.js +6 -4
- package/dist/implementations/database/reaper.js.map +1 -1
- package/dist/implementations/database/relation.d.ts +2 -12
- package/dist/implementations/database/relation.js +5 -141
- package/dist/implementations/database/relation.js.map +1 -1
- package/dist/implementations/database/render.d.ts +11 -0
- package/dist/implementations/database/render.js +147 -0
- package/dist/implementations/database/render.js.map +1 -0
- package/dist/implementations/database/result.d.ts +2 -2
- package/dist/implementations/database/result.js +18 -19
- package/dist/implementations/database/result.js.map +1 -1
- package/dist/implementations/database/row-source.d.ts +10 -10
- package/dist/implementations/database/row-source.js +22 -19
- package/dist/implementations/database/row-source.js.map +1 -1
- package/dist/implementations/database/schema.d.ts +2 -2
- package/dist/implementations/database/schema.js +19 -19
- package/dist/implementations/database/schema.js.map +1 -1
- package/dist/implementations/database/selection.js +13 -7
- package/dist/implementations/database/selection.js.map +1 -1
- package/dist/implementations/database/sql.d.ts +7 -3
- package/dist/implementations/database/sql.js.map +1 -1
- package/dist/implementations/database/stage.js +3 -2
- package/dist/implementations/database/stage.js.map +1 -1
- package/dist/implementations/database/stages-aggregate.js +7 -5
- package/dist/implementations/database/stages-aggregate.js.map +1 -1
- package/dist/implementations/database/stages-array.js.map +1 -1
- package/dist/implementations/database/stages-core.js +2 -1
- package/dist/implementations/database/stages-core.js.map +1 -1
- package/dist/implementations/database/stages-date.js +2 -1
- package/dist/implementations/database/stages-date.js.map +1 -1
- package/dist/implementations/database/stages-group.js +11 -6
- package/dist/implementations/database/stages-group.js.map +1 -1
- package/dist/implementations/database/stages-join.js +13 -11
- package/dist/implementations/database/stages-join.js.map +1 -1
- package/dist/implementations/database/stages-numeric.js.map +1 -1
- package/dist/implementations/database/stages-object.js +1 -1
- package/dist/implementations/database/stages-object.js.map +1 -1
- package/dist/implementations/database/stages-projection.js +9 -8
- package/dist/implementations/database/stages-projection.js.map +1 -1
- package/dist/implementations/database/stages-rows.js +10 -8
- package/dist/implementations/database/stages-rows.js.map +1 -1
- package/dist/implementations/database/stages-selection.js +6 -4
- package/dist/implementations/database/stages-selection.js.map +1 -1
- package/dist/implementations/database/stages-string.js +7 -6
- package/dist/implementations/database/stages-string.js.map +1 -1
- package/dist/implementations/database/subquery.d.ts +1 -1
- package/dist/implementations/database/subquery.js +7 -5
- package/dist/implementations/database/subquery.js.map +1 -1
- package/dist/implementations/database/types.d.ts +5 -5
- package/dist/implementations/database/types.js +11 -11
- package/dist/implementations/database/types.js.map +1 -1
- package/dist/implementations/database/utils.js +2 -1
- package/dist/implementations/database/utils.js.map +1 -1
- package/dist/implementations/database/value.d.ts +1 -1
- package/dist/implementations/database/value.js +34 -33
- package/dist/implementations/database/value.js.map +1 -1
- package/dist/implementations/database/writes-atomic.js +6 -5
- package/dist/implementations/database/writes-atomic.js.map +1 -1
- package/dist/implementations/database/writes-identity.js +18 -19
- package/dist/implementations/database/writes-identity.js.map +1 -1
- package/dist/implementations/database/writes-insert.js +16 -22
- package/dist/implementations/database/writes-insert.js.map +1 -1
- package/dist/implementations/database/writes-shared.d.ts +1 -1
- package/dist/implementations/database/writes-shared.js +11 -7
- package/dist/implementations/database/writes-shared.js.map +1 -1
- package/dist/implementations/database/writes.d.ts +22 -1
- package/dist/implementations/database/writes.js +6 -3
- package/dist/implementations/database/writes.js.map +1 -1
- package/dist/test/catalog-owned.test.js +2 -0
- package/dist/test/catalog-owned.test.js.map +1 -1
- package/dist/test/contention.test.js.map +1 -1
- package/dist/test/duplicate-key.test.js +13 -10
- package/dist/test/duplicate-key.test.js.map +1 -1
- package/dist/test/indexes.test.js +7 -7
- package/dist/test/indexes.test.js.map +1 -1
- package/dist/test/unit/coerce.spec.js +7 -7
- package/dist/test/unit/coerce.spec.js.map +1 -1
- package/dist/test/unit/config.spec.js +3 -1
- package/dist/test/unit/config.spec.js.map +1 -1
- package/dist/test/unit/connect-failure.spec.d.ts +1 -0
- package/dist/test/unit/connect-failure.spec.js +50 -0
- package/dist/test/unit/connect-failure.spec.js.map +1 -0
- package/dist/test/unit/connection.spec.js +16 -18
- package/dist/test/unit/connection.spec.js.map +1 -1
- package/dist/test/unit/convergence.spec.d.ts +1 -0
- package/dist/test/unit/convergence.spec.js +347 -0
- package/dist/test/unit/convergence.spec.js.map +1 -0
- package/dist/test/unit/cursors-fixture.d.ts +79 -0
- package/dist/test/unit/cursors-fixture.js +245 -0
- package/dist/test/unit/cursors-fixture.js.map +1 -0
- package/dist/test/unit/cursors.spec.js +138 -718
- package/dist/test/unit/cursors.spec.js.map +1 -1
- package/dist/test/unit/cursors.teardown.spec.d.ts +1 -0
- package/dist/test/unit/cursors.teardown.spec.js +322 -0
- package/dist/test/unit/cursors.teardown.spec.js.map +1 -0
- package/dist/test/unit/cursors.window.spec.d.ts +1 -0
- package/dist/test/unit/cursors.window.spec.js +78 -0
- package/dist/test/unit/cursors.window.spec.js.map +1 -0
- package/dist/test/unit/ddl-fixture.d.ts +5 -0
- package/dist/test/unit/ddl-fixture.js +19 -0
- package/dist/test/unit/ddl-fixture.js.map +1 -0
- package/dist/test/unit/ddl.spec.js +39 -380
- package/dist/test/unit/ddl.spec.js.map +1 -1
- package/dist/test/unit/expression-array-fixture.d.ts +17 -0
- package/dist/test/unit/expression-array-fixture.js +63 -0
- package/dist/test/unit/expression-array-fixture.js.map +1 -0
- package/dist/test/unit/expression-array-walk.spec.d.ts +1 -0
- package/dist/test/unit/expression-array-walk.spec.js +235 -0
- package/dist/test/unit/expression-array-walk.spec.js.map +1 -0
- package/dist/test/unit/expression-array.spec.js +48 -322
- package/dist/test/unit/expression-array.spec.js.map +1 -1
- package/dist/test/unit/expression-date.spec.js +4 -3
- package/dist/test/unit/expression-date.spec.js.map +1 -1
- package/dist/test/unit/expression-fixture.d.ts +15 -0
- package/dist/test/unit/expression-fixture.js +40 -0
- package/dist/test/unit/expression-fixture.js.map +1 -0
- package/dist/test/unit/expression-numeric.spec.js +10 -8
- package/dist/test/unit/expression-numeric.spec.js.map +1 -1
- package/dist/test/unit/expression-object.spec.js +3 -4
- package/dist/test/unit/expression-object.spec.js.map +1 -1
- package/dist/test/unit/expression-predicate.spec.d.ts +1 -0
- package/dist/test/unit/expression-predicate.spec.js +231 -0
- package/dist/test/unit/expression-predicate.spec.js.map +1 -0
- package/dist/test/unit/expression-stages.spec.js +0 -5
- package/dist/test/unit/expression-stages.spec.js.map +1 -1
- package/dist/test/unit/expression-string.spec.js +2 -5
- package/dist/test/unit/expression-string.spec.js.map +1 -1
- package/dist/test/unit/expression.spec.js +44 -292
- package/dist/test/unit/expression.spec.js.map +1 -1
- package/dist/test/unit/external-comparisons.spec.js +5 -5
- package/dist/test/unit/external-comparisons.spec.js.map +1 -1
- package/dist/test/unit/external-types.spec.js +2 -3
- package/dist/test/unit/external-types.spec.js.map +1 -1
- package/dist/test/unit/feeds.spec.js +40 -23
- package/dist/test/unit/feeds.spec.js.map +1 -1
- package/dist/test/unit/fields.spec.js +15 -9
- package/dist/test/unit/fields.spec.js.map +1 -1
- package/dist/test/unit/invalid-fixture.d.ts +3 -0
- package/dist/test/unit/invalid-fixture.js +11 -0
- package/dist/test/unit/invalid-fixture.js.map +1 -0
- package/dist/test/unit/payload.spec.js.map +1 -1
- package/dist/test/unit/pipeline-aggregate.spec.js +14 -14
- package/dist/test/unit/pipeline-aggregate.spec.js.map +1 -1
- package/dist/test/unit/pipeline-fixture.d.ts +25 -6
- package/dist/test/unit/pipeline-fixture.js +21 -11
- package/dist/test/unit/pipeline-fixture.js.map +1 -1
- package/dist/test/unit/pipeline-group-fixture.d.ts +2 -0
- package/dist/test/unit/pipeline-group-fixture.js +6 -0
- package/dist/test/unit/pipeline-group-fixture.js.map +1 -0
- package/dist/test/unit/pipeline-group.spec.js +15 -248
- package/dist/test/unit/pipeline-group.spec.js.map +1 -1
- package/dist/test/unit/pipeline-lookup.spec.js +13 -10
- package/dist/test/unit/pipeline-lookup.spec.js.map +1 -1
- package/dist/test/unit/pipeline-projection.spec.js +12 -13
- package/dist/test/unit/pipeline-projection.spec.js.map +1 -1
- package/dist/test/unit/pipeline-rows.spec.js +21 -18
- package/dist/test/unit/pipeline-rows.spec.js.map +1 -1
- package/dist/test/unit/pipeline-selection.spec.js +6 -4
- package/dist/test/unit/pipeline-selection.spec.js.map +1 -1
- package/dist/test/unit/pipeline-stages.spec.js +23 -35
- package/dist/test/unit/pipeline-stages.spec.js.map +1 -1
- package/dist/test/unit/pipeline-substream.spec.d.ts +1 -0
- package/dist/test/unit/pipeline-substream.spec.js +246 -0
- package/dist/test/unit/pipeline-substream.spec.js.map +1 -0
- package/dist/test/unit/pipeline.spec.js +1 -1
- package/dist/test/unit/query.spec.js +6 -2
- package/dist/test/unit/query.spec.js.map +1 -1
- package/dist/test/unit/reaper.spec.js +4 -3
- package/dist/test/unit/reaper.spec.js.map +1 -1
- package/dist/test/unit/relation.spec.js +37 -36
- package/dist/test/unit/relation.spec.js.map +1 -1
- package/dist/test/unit/result.spec.js +13 -11
- package/dist/test/unit/result.spec.js.map +1 -1
- package/dist/test/unit/row-source.spec.js +1 -1
- package/dist/test/unit/row-source.spec.js.map +1 -1
- package/dist/test/unit/schema.spec.js +5 -2
- package/dist/test/unit/schema.spec.js.map +1 -1
- package/dist/test/unit/selection.spec.js +7 -3
- package/dist/test/unit/selection.spec.js.map +1 -1
- package/dist/test/unit/types.spec.js +6 -6
- package/dist/test/unit/types.spec.js.map +1 -1
- package/dist/test/unit/writes-atomic.spec.js +2 -2
- package/dist/test/unit/writes-atomic.spec.js.map +1 -1
- package/dist/test/unit/writes-insert.spec.js +5 -4
- package/dist/test/unit/writes-insert.spec.js.map +1 -1
- package/dist/test/unit/writes-replace.spec.js +6 -6
- package/dist/test/unit/writes-replace.spec.js.map +1 -1
- package/dist/test/unit/writes-target.spec.js +3 -3
- package/dist/test/unit/writes-target.spec.js.map +1 -1
- package/dist/test/unit/writes-update-fixture.d.ts +9 -0
- package/dist/test/unit/writes-update-fixture.js +20 -0
- package/dist/test/unit/writes-update-fixture.js.map +1 -0
- package/dist/test/unit/writes-update-mapper.spec.d.ts +1 -0
- package/dist/test/unit/writes-update-mapper.spec.js +123 -0
- package/dist/test/unit/writes-update-mapper.spec.js.map +1 -0
- package/dist/test/unit/writes-update.spec.js +42 -171
- package/dist/test/unit/writes-update.spec.js.map +1 -1
- package/dist/test-external/catalog.test.js +11 -1
- package/dist/test-external/catalog.test.js.map +1 -1
- package/dist/test-external/native.test.js +8 -6
- package/dist/test-external/native.test.js.map +1 -1
- package/dist/test-external/reads.test.js +20 -22
- package/dist/test-external/reads.test.js.map +1 -1
- package/dist/test-external/refusals.test.js +45 -24
- package/dist/test-external/refusals.test.js.map +1 -1
- package/dist/test-external/registration.test.js +4 -2
- package/dist/test-external/registration.test.js.map +1 -1
- package/dist/test-external/sales.d.ts +9 -2
- package/dist/test-external/sales.js.map +1 -1
- package/dist/test-external/unreachable.test.d.ts +1 -0
- package/dist/test-external/unreachable.test.js +83 -0
- package/dist/test-external/unreachable.test.js.map +1 -0
- package/dist/test-external/writes.test.js +71 -37
- package/dist/test-external/writes.test.js.map +1 -1
- package/package.json +19 -6
package/README.md
CHANGED
|
@@ -112,12 +112,13 @@ This repository documents what is specific to the PostgreSQL backend:
|
|
|
112
112
|
|
|
113
113
|
## Compatibility
|
|
114
114
|
|
|
115
|
-
| Package
|
|
116
|
-
|
|
|
117
|
-
| `@antelopejs/interface-database`
|
|
118
|
-
| `@antelopejs/interface-
|
|
115
|
+
| Package | Supported range |
|
|
116
|
+
| ---------------------------------------- | ---------------- |
|
|
117
|
+
| `@antelopejs/interface-database` | `>=0.2.0 <0.3.0` |
|
|
118
|
+
| `@antelopejs/interface-database-catalog` | `>=0.0.3 <0.1.0` |
|
|
119
|
+
| `@antelopejs/interface-core` | `>=0.1.1 <1.0.0` |
|
|
119
120
|
|
|
120
|
-
The module is developed and tested against `@antelopejs/core` `^1.14.0` on Node.js
|
|
121
|
+
The module is developed and tested against `@antelopejs/core` `^1.14.0` on Node.js 24 (the `.nvmrc` version CI runs), with the `pg` driver `^8.22.0` and PostgreSQL 18.
|
|
121
122
|
|
|
122
123
|
## Contributing
|
|
123
124
|
|
package/dist/config.d.ts
CHANGED
|
@@ -35,4 +35,5 @@ export interface ResolvedOptions {
|
|
|
35
35
|
export declare function SetOptions(options?: Options): ResolvedOptions;
|
|
36
36
|
export declare function GetOptions(): ResolvedOptions;
|
|
37
37
|
export declare function IsExternal(): boolean;
|
|
38
|
+
export declare function IsCatalogEnabled(): Promise<boolean>;
|
|
38
39
|
export declare function ClearOptions(): void;
|
package/dist/config.js
CHANGED
|
@@ -3,7 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.SetOptions = SetOptions;
|
|
4
4
|
exports.GetOptions = GetOptions;
|
|
5
5
|
exports.IsExternal = IsExternal;
|
|
6
|
+
exports.IsCatalogEnabled = IsCatalogEnabled;
|
|
6
7
|
exports.ClearOptions = ClearOptions;
|
|
8
|
+
const runtime_1 = require("@antelopejs/interface-core/runtime");
|
|
7
9
|
const DEFAULT_URL = "postgres://postgres@localhost:5432/antelopejs";
|
|
8
10
|
const DEFAULT_MODE = "owned";
|
|
9
11
|
const MODES = ["owned", "external"];
|
|
@@ -28,9 +30,7 @@ function PositiveSafeInteger(option, supplied, fallback) {
|
|
|
28
30
|
if (supplied === undefined) {
|
|
29
31
|
return fallback;
|
|
30
32
|
}
|
|
31
|
-
if (
|
|
32
|
-
!Number.isSafeInteger(supplied) ||
|
|
33
|
-
supplied < SMALLEST_POSITIVE_INTEGER) {
|
|
33
|
+
if (!Number.isSafeInteger(supplied) || supplied < SMALLEST_POSITIVE_INTEGER) {
|
|
34
34
|
throw new Error(`${option} must be a positive safe integer, received ${String(supplied)}`);
|
|
35
35
|
}
|
|
36
36
|
return supplied;
|
|
@@ -85,6 +85,10 @@ function GetOptions() {
|
|
|
85
85
|
function IsExternal() {
|
|
86
86
|
return GetOptions().mode === "external";
|
|
87
87
|
}
|
|
88
|
+
async function IsCatalogEnabled() {
|
|
89
|
+
const configured = GetOptions().catalog.enabled;
|
|
90
|
+
return configured ?? (await (0, runtime_1.GetRuntimeInfo)()).dev;
|
|
91
|
+
}
|
|
88
92
|
function ClearOptions() {
|
|
89
93
|
resolved = undefined;
|
|
90
94
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function DescribeConnectFailure(err: Error, url: string): string;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DescribeConnectFailure = DescribeConnectFailure;
|
|
4
|
+
const DEFAULT_PORT = "5432";
|
|
5
|
+
const UNANSWERED_CODES = new Set(["ECONNREFUSED", "ENOTFOUND", "ETIMEDOUT"]);
|
|
6
|
+
const SSL_REQUIRED_MARKER = "no encryption";
|
|
7
|
+
function Endpoint(url) {
|
|
8
|
+
try {
|
|
9
|
+
const parsed = new URL(url);
|
|
10
|
+
return `${parsed.hostname}:${parsed.port || DEFAULT_PORT}`;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return "the configured host";
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function Sentence(code, message, url) {
|
|
17
|
+
if (code === "28P01") {
|
|
18
|
+
return "wrong user or password";
|
|
19
|
+
}
|
|
20
|
+
if (code === "3D000") {
|
|
21
|
+
return "the database does not exist";
|
|
22
|
+
}
|
|
23
|
+
if (UNANSWERED_CODES.has(code)) {
|
|
24
|
+
return `the server is not answering at ${Endpoint(url)}`;
|
|
25
|
+
}
|
|
26
|
+
if (code === "28000" && message.includes(SSL_REQUIRED_MARKER)) {
|
|
27
|
+
return "the server requires SSL";
|
|
28
|
+
}
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
function DescribeConnectFailure(err, url) {
|
|
32
|
+
const code = "code" in err ? String(err.code) : undefined;
|
|
33
|
+
if (!code) {
|
|
34
|
+
return err.message;
|
|
35
|
+
}
|
|
36
|
+
const sentence = Sentence(code, err.message, url) ?? err.message;
|
|
37
|
+
return `${sentence} (${code})`;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=connect-failure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect-failure.js","sourceRoot":"","sources":["../src/connect-failure.ts"],"names":[],"mappings":";;AAyCA,wDAOC;AAhDD,MAAM,YAAY,GAAG,MAAM,CAAC;AAE5B,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;AAE7E,MAAM,mBAAmB,GAAG,eAAe,CAAC;AAE5C,SAAS,QAAQ,CAAC,GAAW;IAC3B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,IAAI,YAAY,EAAE,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,qBAAqB,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CACf,IAAY,EACZ,OAAe,EACf,GAAW;IAEX,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,wBAAwB,CAAC;IAClC,CAAC;IACD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,6BAA6B,CAAC;IACvC,CAAC;IACD,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,kCAAkC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;IAC3D,CAAC;IACD,IAAI,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC9D,OAAO,yBAAyB,CAAC;IACnC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAQD,SAAgB,sBAAsB,CAAC,GAAU,EAAE,GAAW;IAC5D,MAAM,IAAI,GAAG,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1D,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,GAAG,CAAC,OAAO,CAAC;IACrB,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC;IACjE,OAAO,GAAG,QAAQ,KAAK,IAAI,GAAG,CAAC;AACjC,CAAC"}
|
package/dist/connection.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Pool, type PoolClient, type QueryResult, type QueryResultRow } from "pg";
|
|
2
2
|
import { type Options } from "./config";
|
|
3
|
-
export type BeforeDisconnect = () =>
|
|
3
|
+
export type BeforeDisconnect = () => void | PromiseLike<void>;
|
|
4
4
|
export type PoolTeardown = () => Promise<void>;
|
|
5
5
|
export declare function GuardPool(created: Pool): Pool;
|
|
6
6
|
export declare function Connect(options?: Options): Promise<void>;
|
|
@@ -8,6 +8,7 @@ export declare function RegisterBeforeDisconnect(callback: BeforeDisconnect): ()
|
|
|
8
8
|
export declare function SettleBeforeDisconnect(endPool: PoolTeardown): Promise<void>;
|
|
9
9
|
export declare function Disconnect(): Promise<void>;
|
|
10
10
|
export declare function GetPool(): Pool;
|
|
11
|
+
export declare function AssertConnected(): void;
|
|
11
12
|
export declare function Query<T extends QueryResultRow = QueryResultRow>(sql: string, params?: unknown[]): Promise<QueryResult<T>>;
|
|
12
13
|
export declare function GuardHeldClient(client: PoolClient): PoolClient;
|
|
13
14
|
export declare function AcquireClient(): Promise<PoolClient>;
|
package/dist/connection.js
CHANGED
|
@@ -6,6 +6,7 @@ exports.RegisterBeforeDisconnect = RegisterBeforeDisconnect;
|
|
|
6
6
|
exports.SettleBeforeDisconnect = SettleBeforeDisconnect;
|
|
7
7
|
exports.Disconnect = Disconnect;
|
|
8
8
|
exports.GetPool = GetPool;
|
|
9
|
+
exports.AssertConnected = AssertConnected;
|
|
9
10
|
exports.Query = Query;
|
|
10
11
|
exports.GuardHeldClient = GuardHeldClient;
|
|
11
12
|
exports.AcquireClient = AcquireClient;
|
|
@@ -13,16 +14,20 @@ exports.GetSchemaPrefix = GetSchemaPrefix;
|
|
|
13
14
|
const pg_1 = require("pg");
|
|
14
15
|
const logger_1 = require("./logger");
|
|
15
16
|
const config_1 = require("./config");
|
|
16
|
-
const
|
|
17
|
+
const connect_failure_1 = require("./connect-failure");
|
|
18
|
+
const NOT_CONNECTED = "PostgreSQL adapter is not connected";
|
|
19
|
+
const NOT_CONSTRUCTED = "construct() has not run yet";
|
|
17
20
|
const SESSION_SETTINGS = "SET TIME ZONE 'UTC'; SET DateStyle = 'ISO, MDY'";
|
|
18
21
|
const CLIENT_ERROR = "error";
|
|
19
22
|
const HELD_CLIENT_FAILED = "the connection under a borrowed PostgreSQL client failed while it was checked out";
|
|
20
23
|
const IDLE_CLIENT_FAILED = "the connection under an idle pooled PostgreSQL client failed";
|
|
21
24
|
const CONNECTED = "connected to PostgreSQL";
|
|
22
25
|
const DISCONNECTED = "disconnected from PostgreSQL";
|
|
26
|
+
const STARTED_UNCONNECTED = "could not connect to PostgreSQL; the instance starts without a connection and refuses every call until the project reloads";
|
|
23
27
|
const SLOW_ACQUIRE_MS = 10_000;
|
|
24
28
|
const SLOW_ACQUIRE = `no PostgreSQL client has become available in ${SLOW_ACQUIRE_MS} ms: either every pooled connection is checked out — a cursor holds one for as long as it is iterated — or a new connection is not being answered. Raise pool.max, or set pool.connectionTimeoutMillis to fail rather than wait`;
|
|
25
29
|
let pool;
|
|
30
|
+
let connectFailure;
|
|
26
31
|
let isWaiting = false;
|
|
27
32
|
const beforeDisconnect = new Set();
|
|
28
33
|
function PinSession(client) {
|
|
@@ -38,6 +43,9 @@ function GuardPool(created) {
|
|
|
38
43
|
created.on(CLIENT_ERROR, ReportIdleClientError);
|
|
39
44
|
return created;
|
|
40
45
|
}
|
|
46
|
+
async function ToleratesConnectFailure() {
|
|
47
|
+
return (0, config_1.IsExternal)() && (await (0, config_1.IsCatalogEnabled)());
|
|
48
|
+
}
|
|
41
49
|
async function Connect(options) {
|
|
42
50
|
await Disconnect();
|
|
43
51
|
const resolved = (0, config_1.SetOptions)(options);
|
|
@@ -53,6 +61,11 @@ async function Connect(options) {
|
|
|
53
61
|
}
|
|
54
62
|
catch (err) {
|
|
55
63
|
await created.end();
|
|
64
|
+
if (err instanceof Error && (await ToleratesConnectFailure())) {
|
|
65
|
+
connectFailure = (0, connect_failure_1.DescribeConnectFailure)(err, resolved.url);
|
|
66
|
+
logger_1.Logger.Warn(STARTED_UNCONNECTED, connectFailure);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
56
69
|
(0, config_1.ClearOptions)();
|
|
57
70
|
throw err;
|
|
58
71
|
}
|
|
@@ -72,6 +85,7 @@ async function SettleBeforeDisconnect(endPool) {
|
|
|
72
85
|
async function EndPool() {
|
|
73
86
|
const current = pool;
|
|
74
87
|
pool = undefined;
|
|
88
|
+
connectFailure = undefined;
|
|
75
89
|
(0, config_1.ClearOptions)();
|
|
76
90
|
if (current) {
|
|
77
91
|
await current.end();
|
|
@@ -83,10 +97,13 @@ async function Disconnect() {
|
|
|
83
97
|
}
|
|
84
98
|
function GetPool() {
|
|
85
99
|
if (!pool) {
|
|
86
|
-
throw new Error(NOT_CONNECTED);
|
|
100
|
+
throw new Error(`${NOT_CONNECTED}: ${connectFailure ?? NOT_CONSTRUCTED}`);
|
|
87
101
|
}
|
|
88
102
|
return pool;
|
|
89
103
|
}
|
|
104
|
+
function AssertConnected() {
|
|
105
|
+
GetPool();
|
|
106
|
+
}
|
|
90
107
|
function Query(sql, params) {
|
|
91
108
|
return GetPool().query(sql, params);
|
|
92
109
|
}
|
package/dist/connection.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,8 +6,8 @@ exports.DescribeRelations = DescribeRelations;
|
|
|
6
6
|
exports.Profile = Profile;
|
|
7
7
|
exports.CheckReference = CheckReference;
|
|
8
8
|
exports.SampleRows = SampleRows;
|
|
9
|
-
const runtime_1 = require("@antelopejs/interface-core/runtime");
|
|
10
9
|
const config_1 = require("../../config");
|
|
10
|
+
const connection_1 = require("../../connection");
|
|
11
11
|
const external_discovery_1 = require("../database/external-discovery");
|
|
12
12
|
const external_measures_1 = require("../database/external-measures");
|
|
13
13
|
const external_profile_1 = require("../database/external-profile");
|
|
@@ -15,17 +15,14 @@ const external_reference_1 = require("../database/external-reference");
|
|
|
15
15
|
const external_rows_1 = require("../database/external-rows");
|
|
16
16
|
const OWNED_REFUSAL = "the catalog describes a database an external instance was pointed at; this instance owns its tables";
|
|
17
17
|
const DEVELOPMENT_REFUSAL = "the catalog is a development tool: it answers under ajs project dev or run, or with catalog.enabled";
|
|
18
|
-
async function IsEnabled() {
|
|
19
|
-
const configured = (0, config_1.GetOptions)().catalog.enabled;
|
|
20
|
-
return configured ?? (await (0, runtime_1.GetRuntimeInfo)()).dev;
|
|
21
|
-
}
|
|
22
18
|
async function Guard() {
|
|
23
19
|
if (!(0, config_1.IsExternal)()) {
|
|
24
20
|
throw new Error(OWNED_REFUSAL);
|
|
25
21
|
}
|
|
26
|
-
if (!(await
|
|
22
|
+
if (!(await (0, config_1.IsCatalogEnabled)())) {
|
|
27
23
|
throw new Error(DEVELOPMENT_REFUSAL);
|
|
28
24
|
}
|
|
25
|
+
(0, connection_1.AssertConnected)();
|
|
29
26
|
}
|
|
30
27
|
async function Info() {
|
|
31
28
|
await Guard();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/implementations/catalog/index.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/implementations/catalog/index.ts"],"names":[],"mappings":";;AA+CA,oBAGC;AAED,sCAKC;AAED,8CAaC;AAED,0BAKC;AAED,wCAKC;AAED,gCAGC;AA9ED,yCAA4D;AAC5D,iDAAmD;AACnD,uEAOwC;AACxC,qEAA6D;AAC7D,mEAA+D;AAC/D,uEAAsE;AACtE,6DAA+D;AAE/D,MAAM,aAAa,GACjB,qGAAqG,CAAC;AACxG,MAAM,mBAAmB,GACvB,qGAAqG,CAAC;AAMxG,KAAK,UAAU,KAAK;IAClB,IAAI,CAAC,IAAA,mBAAU,GAAE,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,IAAA,yBAAgB,GAAE,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IACD,IAAA,4BAAe,GAAE,CAAC;AACpB,CAAC;AAEM,KAAK,UAAU,IAAI;IACxB,MAAM,KAAK,EAAE,CAAC;IACd,OAAO,IAAA,6BAAQ,GAAE,CAAC;AACpB,CAAC;AAEM,KAAK,UAAU,aAAa,CACjC,OAAkB;IAElB,MAAM,KAAK,EAAE,CAAC;IACd,OAAO,IAAA,gCAAY,EAAC,MAAM,IAAA,qCAAgB,EAAC,OAAO,CAAC,EAAE,8BAAS,CAAC,CAAC;AAClE,CAAC;AAEM,KAAK,UAAU,iBAAiB,CACrC,SAAmB;IAEnB,MAAM,KAAK,EAAE,CAAC;IACd,MAAM,IAAI,GAAG,MAAM,IAAA,0CAAqB,EAAC,SAAS,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,iCAAY,CAAC,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,eAAe,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,kCAAkC,CACpE,CAAC;IACJ,CAAC;IACD,OAAO,IAAA,gCAAY,EAAC,IAAI,EAAE,gCAAW,CAAC,CAAC;AACzC,CAAC;AAEM,KAAK,UAAU,OAAO,CAC3B,OAAuB;IAEvB,MAAM,KAAK,EAAE,CAAC;IACd,OAAO,IAAA,kCAAe,EAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAEM,KAAK,UAAU,cAAc,CAClC,KAAqB;IAErB,MAAM,KAAK,EAAE,CAAC;IACd,OAAO,IAAA,yCAAoB,EAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAEM,KAAK,UAAU,UAAU,CAAC,OAAsB;IACrD,MAAM,KAAK,EAAE,CAAC;IACd,OAAO,IAAA,kCAAkB,EAAC,OAAO,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -26,35 +26,35 @@ function UnifySameKind(left, right) {
|
|
|
26
26
|
return (0, types_1.ArrayOf)(Unify(left.elem, right.elem));
|
|
27
27
|
}
|
|
28
28
|
if (left.kind === "json" && right.kind === "json") {
|
|
29
|
-
return (0, types_1.JsonOf)(
|
|
29
|
+
return (0, types_1.JsonOf)(UnifyKeyTypes(left.keys, right.keys));
|
|
30
30
|
}
|
|
31
31
|
return left;
|
|
32
32
|
}
|
|
33
|
-
function
|
|
33
|
+
function UnifyKeyTypes(left, right) {
|
|
34
34
|
if (!left || !right) {
|
|
35
35
|
return undefined;
|
|
36
36
|
}
|
|
37
|
-
const
|
|
37
|
+
const keyTypes = {};
|
|
38
38
|
for (const [name, type] of Object.entries(left)) {
|
|
39
39
|
if (Object.hasOwn(right, name)) {
|
|
40
|
-
|
|
40
|
+
keyTypes[name] = Unify(type, right[name]);
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
|
-
return Object.keys(
|
|
43
|
+
return Object.keys(keyTypes).length > 0 ? keyTypes : undefined;
|
|
44
44
|
}
|
|
45
45
|
function Widen(left, right) {
|
|
46
|
-
const
|
|
47
|
-
const
|
|
48
|
-
if (!
|
|
46
|
+
const leftKeys = (0, types_1.KeyTypesOf)(left);
|
|
47
|
+
const rightKeys = (0, types_1.KeyTypesOf)(right);
|
|
48
|
+
if (!leftKeys || !rightKeys) {
|
|
49
49
|
return Unify(left, right);
|
|
50
50
|
}
|
|
51
|
-
const
|
|
52
|
-
for (const [name, type] of Object.entries(
|
|
53
|
-
|
|
54
|
-
? Unify(
|
|
51
|
+
const keyTypes = { ...leftKeys };
|
|
52
|
+
for (const [name, type] of Object.entries(rightKeys)) {
|
|
53
|
+
keyTypes[name] = Object.hasOwn(leftKeys, name)
|
|
54
|
+
? Unify(leftKeys[name], type)
|
|
55
55
|
: type;
|
|
56
56
|
}
|
|
57
|
-
return (0, types_1.JsonOf)(
|
|
57
|
+
return (0, types_1.JsonOf)(keyTypes);
|
|
58
58
|
}
|
|
59
59
|
function Cast(value, target) {
|
|
60
60
|
if (value.type.kind === target.kind) {
|
|
@@ -123,12 +123,12 @@ function UnifyOperands(left, right, operator = EQUALITY) {
|
|
|
123
123
|
return NativePair(left, right, pair, operator);
|
|
124
124
|
}
|
|
125
125
|
const EQUALITY = "=";
|
|
126
|
-
const MIRRORED =
|
|
127
|
-
">"
|
|
128
|
-
"<"
|
|
129
|
-
">="
|
|
130
|
-
"<="
|
|
131
|
-
|
|
126
|
+
const MIRRORED = new Map([
|
|
127
|
+
[">", "<"],
|
|
128
|
+
["<", ">"],
|
|
129
|
+
[">=", "<="],
|
|
130
|
+
["<=", ">="],
|
|
131
|
+
]);
|
|
132
132
|
function NativeSide(native, type) {
|
|
133
133
|
return { sql: native.sql, type };
|
|
134
134
|
}
|
|
@@ -154,7 +154,7 @@ function NativePair(left, right, pair, operator) {
|
|
|
154
154
|
};
|
|
155
155
|
}
|
|
156
156
|
if (right.native && type.kind === right.type.kind) {
|
|
157
|
-
const mirrored = MIRRORED
|
|
157
|
+
const mirrored = MIRRORED.get(operator) ?? operator;
|
|
158
158
|
const converted = right.native.bind(pair.left.sql, mirrored);
|
|
159
159
|
return {
|
|
160
160
|
left: { sql: converted, type },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coerce.js","sourceRoot":"","sources":["../../../src/implementations/database/coerce.ts"],"names":[],"mappings":";;AAqCA,sBAWC;
|
|
1
|
+
{"version":3,"file":"coerce.js","sourceRoot":"","sources":["../../../src/implementations/database/coerce.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import type { OriginResolver } from "./selection";
|
|
|
5
5
|
import { type Compiled, ParamCollector } from "./sql";
|
|
6
6
|
export type SubqueryProvider = (stages: QueryStage[]) => Compiled;
|
|
7
7
|
export type ArgumentBinding = RowSource | SubqueryProvider | Compiled;
|
|
8
|
+
export declare function IsSubqueryProvider(binding: ArgumentBinding): binding is SubqueryProvider;
|
|
8
9
|
type ExpressionCompiler = (stages: QueryStage[], context: DecodingContext, source?: RowSource) => Compiled;
|
|
9
10
|
export type SubqueryCompiler = (stages: QueryStage[], context: DecodingContext) => Compiled;
|
|
10
11
|
type RelationCompiler = (stages: QueryStage[], context: DecodingContext) => Relation;
|
|
@@ -4,8 +4,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.DecodingContext = void 0;
|
|
7
|
+
exports.IsSubqueryProvider = IsSubqueryProvider;
|
|
7
8
|
const node_assert_1 = __importDefault(require("node:assert"));
|
|
8
9
|
const sql_1 = require("./sql");
|
|
10
|
+
function IsSubqueryProvider(binding) {
|
|
11
|
+
return typeof binding === "function";
|
|
12
|
+
}
|
|
9
13
|
const ALIAS_PREFIX = "t";
|
|
10
14
|
class DecodingContext {
|
|
11
15
|
compilers;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/implementations/database/context.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/implementations/database/context.ts"],"names":[],"mappings":";;;;;;AAaA,gDAIC;AAjBD,8DAAiC;AAMjC,+BAAsD;AAOtD,SAAgB,kBAAkB,CAChC,OAAwB;IAExB,OAAO,OAAO,OAAO,KAAK,UAAU,CAAC;AACvC,CAAC;AAoCD,MAAM,YAAY,GAAG,GAAG,CAAC;AAQzB,MAAa,eAAe;IAkBP;IACD;IAlBF,MAAM,GAAG,IAAI,oBAAc,EAAE,CAAC;IAE7B,QAAQ,GAAoC,EAAE,CAAC;IACxD,YAAY,GAAG,CAAC,CAAC;IAazB,YACmB,SAAoB,EACrB,aAA8B;QAD7B,cAAS,GAAT,SAAS,CAAW;QACrB,kBAAa,GAAb,aAAa,CAAiB;IAC7C,CAAC;IAGG,OAAO;QACZ,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IACjE,CAAC;IAEM,SAAS;QACd,OAAO,GAAG,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;IACjD,CAAC;IAEM,IAAI,CAAC,EAAU,EAAE,OAAwB;QAC9C,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC;IAC9B,CAAC;IAEM,MAAM,CAAC,EAAU;QACtB,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAEM,GAAG,CAAC,EAAU;QACnB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC9C,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnB,CAAC,CAAC,SAAS,CAAC;QACd,IAAA,qBAAM,EAAC,OAAO,EAAE,4BAA4B,EAAE,EAAE,CAAC,CAAC;QAClD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEM,UAAU,CAAC,MAAoB,EAAE,MAAkB;QACxD,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC;IAEM,QAAQ,CAAC,MAAoB;QAClC,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;IAGM,QAAQ,CAAC,MAAoB;QAClC,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;CACF;AA3DD,0CA2DC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { MigrationMode } from "../../config";
|
|
2
|
+
import { type TablePlan } from "./ddl";
|
|
3
|
+
export interface ActualColumn {
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly type: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ActualIndex {
|
|
8
|
+
readonly name: string;
|
|
9
|
+
readonly signature?: string;
|
|
10
|
+
readonly valid: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface ActualTable {
|
|
13
|
+
readonly columns: readonly ActualColumn[];
|
|
14
|
+
readonly indexes: readonly ActualIndex[];
|
|
15
|
+
}
|
|
16
|
+
export interface ConvergencePlan {
|
|
17
|
+
statements: string[];
|
|
18
|
+
indexStatements: string[];
|
|
19
|
+
warnings: string[];
|
|
20
|
+
}
|
|
21
|
+
export declare function PlanIndexStatements(schemaName: string, plan: TablePlan, actual: ActualTable): string[];
|
|
22
|
+
export declare function PlanTable(schemaName: string, plan: TablePlan, actual: ActualTable, mode: MigrationMode): ConvergencePlan;
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PlanIndexStatements = PlanIndexStatements;
|
|
4
|
+
exports.PlanTable = PlanTable;
|
|
5
|
+
const coerce_1 = require("./coerce");
|
|
6
|
+
const sql_1 = require("./sql");
|
|
7
|
+
const types_1 = require("./types");
|
|
8
|
+
const utils_1 = require("./utils");
|
|
9
|
+
const identifier_1 = require("./identifier");
|
|
10
|
+
const ddl_1 = require("./ddl");
|
|
11
|
+
const DESTRUCTIVE = "destructive";
|
|
12
|
+
const CAST_PIVOT_TYPE = (0, types_1.PhysicalType)(types_1.TEXT);
|
|
13
|
+
const CANONICAL_TYPES = new Map([
|
|
14
|
+
["text", "text"],
|
|
15
|
+
["double precision", "double precision"],
|
|
16
|
+
["boolean", "boolean"],
|
|
17
|
+
["timestamptz", "timestamp with time zone"],
|
|
18
|
+
["jsonb", "jsonb"],
|
|
19
|
+
]);
|
|
20
|
+
function Canonical(type) {
|
|
21
|
+
return CANONICAL_TYPES.get(type) ?? type;
|
|
22
|
+
}
|
|
23
|
+
function AlterTable(target, action) {
|
|
24
|
+
return `ALTER TABLE ${target} ${action}`;
|
|
25
|
+
}
|
|
26
|
+
function DropIndexSql(schemaName, name) {
|
|
27
|
+
return `DROP INDEX IF EXISTS ${(0, identifier_1.QualifiedName)(schemaName, name)}`;
|
|
28
|
+
}
|
|
29
|
+
function DropIndexConcurrentlySql(schemaName, name) {
|
|
30
|
+
return `DROP INDEX CONCURRENTLY IF EXISTS ${(0, identifier_1.QualifiedName)(schemaName, name)}`;
|
|
31
|
+
}
|
|
32
|
+
function RenameIndexSql(schemaName, from, to) {
|
|
33
|
+
return `ALTER INDEX ${(0, identifier_1.QualifiedName)(schemaName, from)} RENAME TO ${(0, sql_1.QuoteIdentifier)(to)}`;
|
|
34
|
+
}
|
|
35
|
+
function IsRetyped(column, currentType) {
|
|
36
|
+
return Canonical(currentType) !== Canonical(column.type);
|
|
37
|
+
}
|
|
38
|
+
function BackfillSql(target, column, declared) {
|
|
39
|
+
const overflow = (0, sql_1.QuoteIdentifier)(utils_1.EXTRA_COLUMN);
|
|
40
|
+
const key = (0, sql_1.QuoteLiteral)(declared.field);
|
|
41
|
+
const stored = `NULLIF(${(0, sql_1.JsonKey)(overflow, declared.field)}, ${sql_1.JSON_NULL})`;
|
|
42
|
+
const read = (0, coerce_1.Cast)({ sql: stored, type: types_1.OPAQUE }, declared.type).sql;
|
|
43
|
+
const name = (0, sql_1.QuoteIdentifier)(column.name);
|
|
44
|
+
return (`UPDATE ${target} SET ${name} = ${read}, ${overflow} = ${overflow} - ${key}` +
|
|
45
|
+
` WHERE ${name} IS NULL AND ${read} IS NOT NULL`);
|
|
46
|
+
}
|
|
47
|
+
function PlanAddedColumn(target, column, out) {
|
|
48
|
+
if (column.notNull && column.defaultExpression === undefined) {
|
|
49
|
+
throw new Error(`Table ${target} has no '${column.name}' column and one cannot be added without a default, so the table was not created by this adapter; rename it or drop it`);
|
|
50
|
+
}
|
|
51
|
+
out.statements.push(AlterTable(target, `ADD COLUMN IF NOT EXISTS ${(0, ddl_1.ColumnDdl)(column)}`));
|
|
52
|
+
if (column.declared) {
|
|
53
|
+
out.statements.push(BackfillSql(target, column, column.declared));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function PlanAlteredColumn(target, column, current, mode, out) {
|
|
57
|
+
if (!IsRetyped(column, current.type)) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (mode !== DESTRUCTIVE) {
|
|
61
|
+
throw new Error(`Column '${column.name}' on ${target} is ${current.type} but the schema declares ${column.type}; set migrations: "destructive" to alter it`);
|
|
62
|
+
}
|
|
63
|
+
const name = (0, sql_1.QuoteIdentifier)(column.name);
|
|
64
|
+
out.statements.push(AlterTable(target, `ALTER COLUMN ${name} TYPE ${column.type} USING (${name}::${CAST_PIVOT_TYPE}::${column.type})`));
|
|
65
|
+
}
|
|
66
|
+
function PlanRemovedColumns(target, plan, actual, mode, out) {
|
|
67
|
+
const declared = new Set(plan.columns.map((column) => column.name));
|
|
68
|
+
for (const column of actual.columns) {
|
|
69
|
+
if (declared.has(column.name)) {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (mode === DESTRUCTIVE) {
|
|
73
|
+
out.statements.push(AlterTable(target, `DROP COLUMN ${(0, sql_1.QuoteIdentifier)(column.name)}`));
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
out.warnings.push(`Column '${column.name}' on ${target} is no longer declared and was left in place; set migrations: "destructive" to drop it`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function PlanColumns(target, plan, actual, mode, out) {
|
|
80
|
+
const found = new Map(actual.columns.map((column) => [column.name, column]));
|
|
81
|
+
for (const column of plan.columns) {
|
|
82
|
+
const current = found.get(column.name);
|
|
83
|
+
if (!current) {
|
|
84
|
+
PlanAddedColumn(target, column, out);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
PlanAlteredColumn(target, column, current, mode, out);
|
|
88
|
+
}
|
|
89
|
+
PlanRemovedColumns(target, plan, actual, mode, out);
|
|
90
|
+
}
|
|
91
|
+
function RetypesAColumn(plan, actual) {
|
|
92
|
+
const found = new Map(actual.columns.map((column) => [column.name, column]));
|
|
93
|
+
return plan.columns.some((column) => {
|
|
94
|
+
const current = found.get(column.name);
|
|
95
|
+
return current !== undefined && IsRetyped(column, current.type);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
function IsObsolete(index, desired) {
|
|
99
|
+
const wanted = desired.get(index.name);
|
|
100
|
+
return wanted
|
|
101
|
+
? wanted.signature !== index.signature
|
|
102
|
+
: (0, ddl_1.IsAdapterIndex)(index.signature);
|
|
103
|
+
}
|
|
104
|
+
function PlanRetypeDrops(schemaName, plan, actual, out) {
|
|
105
|
+
if (!RetypesAColumn(plan, actual)) {
|
|
106
|
+
return actual.indexes;
|
|
107
|
+
}
|
|
108
|
+
const desired = new Map(plan.indexes.map((index) => [index.name, index]));
|
|
109
|
+
const obsolete = actual.indexes.filter((index) => IsObsolete(index, desired));
|
|
110
|
+
for (const index of obsolete) {
|
|
111
|
+
out.statements.push(DropIndexSql(schemaName, index.name));
|
|
112
|
+
}
|
|
113
|
+
return actual.indexes.filter((index) => !obsolete.includes(index));
|
|
114
|
+
}
|
|
115
|
+
function IsReady(index, found) {
|
|
116
|
+
return found?.valid === true && found.signature === index.signature;
|
|
117
|
+
}
|
|
118
|
+
function ClearSql(schemaName, found) {
|
|
119
|
+
return found ? [DropIndexConcurrentlySql(schemaName, found.name)] : [];
|
|
120
|
+
}
|
|
121
|
+
function ReplaceIndexSql(schemaName, plan, index) {
|
|
122
|
+
const replacement = (0, identifier_1.ReplacementIndexName)(index.name);
|
|
123
|
+
return [
|
|
124
|
+
...(0, ddl_1.CreateIndexSql)(schemaName, plan, index, replacement),
|
|
125
|
+
DropIndexConcurrentlySql(schemaName, index.name),
|
|
126
|
+
RenameIndexSql(schemaName, replacement, index.name),
|
|
127
|
+
];
|
|
128
|
+
}
|
|
129
|
+
function PlanIndexBuild(schemaName, plan, index, state) {
|
|
130
|
+
const { current, replacement } = state;
|
|
131
|
+
if (IsReady(index, current)) {
|
|
132
|
+
return ClearSql(schemaName, replacement);
|
|
133
|
+
}
|
|
134
|
+
if (current === undefined && replacement && IsReady(index, replacement)) {
|
|
135
|
+
return [RenameIndexSql(schemaName, replacement.name, index.name)];
|
|
136
|
+
}
|
|
137
|
+
const cleared = ClearSql(schemaName, replacement);
|
|
138
|
+
if (current?.valid !== true) {
|
|
139
|
+
const rebuilt = (0, ddl_1.CreateIndexSql)(schemaName, plan, index);
|
|
140
|
+
return [...cleared, ...ClearSql(schemaName, current), ...rebuilt];
|
|
141
|
+
}
|
|
142
|
+
return [...cleared, ...ReplaceIndexSql(schemaName, plan, index)];
|
|
143
|
+
}
|
|
144
|
+
function PlanIndexes(schemaName, plan, actual) {
|
|
145
|
+
const found = new Map(actual.map((index) => [index.name, index]));
|
|
146
|
+
const managed = new Set();
|
|
147
|
+
const statements = [];
|
|
148
|
+
for (const index of plan.indexes) {
|
|
149
|
+
const replacement = (0, identifier_1.ReplacementIndexName)(index.name);
|
|
150
|
+
managed.add(index.name).add(replacement);
|
|
151
|
+
const state = {
|
|
152
|
+
current: found.get(index.name),
|
|
153
|
+
replacement: found.get(replacement),
|
|
154
|
+
};
|
|
155
|
+
statements.push(...PlanIndexBuild(schemaName, plan, index, state));
|
|
156
|
+
}
|
|
157
|
+
for (const index of actual) {
|
|
158
|
+
if (!managed.has(index.name) && (0, ddl_1.IsAdapterIndex)(index.signature)) {
|
|
159
|
+
statements.push(DropIndexConcurrentlySql(schemaName, index.name));
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return statements;
|
|
163
|
+
}
|
|
164
|
+
function PlanIndexStatements(schemaName, plan, actual) {
|
|
165
|
+
return PlanIndexes(schemaName, plan, actual.indexes);
|
|
166
|
+
}
|
|
167
|
+
function PlanTable(schemaName, plan, actual, mode) {
|
|
168
|
+
const out = {
|
|
169
|
+
statements: [],
|
|
170
|
+
indexStatements: [],
|
|
171
|
+
warnings: [],
|
|
172
|
+
};
|
|
173
|
+
if (actual.columns.length === 0) {
|
|
174
|
+
out.statements.push((0, ddl_1.CreateTableSql)(schemaName, plan));
|
|
175
|
+
out.indexStatements.push(...PlanIndexes(schemaName, plan, []));
|
|
176
|
+
return out;
|
|
177
|
+
}
|
|
178
|
+
const kept = PlanRetypeDrops(schemaName, plan, actual, out);
|
|
179
|
+
PlanColumns((0, identifier_1.QualifiedName)(schemaName, plan.table), plan, actual, mode, out);
|
|
180
|
+
out.indexStatements.push(...PlanIndexes(schemaName, plan, kept));
|
|
181
|
+
return out;
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=convergence.js.map
|