relq 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +862 -0
- package/dist/addons/buffer.js +1869 -0
- package/dist/addons/pg-cursor.js +1425 -0
- package/dist/addons/pg-format.js +2248 -0
- package/dist/addons/pg.js +4790 -0
- package/dist/bin/relq.js +2 -0
- package/dist/cjs/cache/index.cjs +9 -0
- package/dist/cjs/cache/query-cache.cjs +311 -0
- package/dist/cjs/cli/commands/add.cjs +82 -0
- package/dist/cjs/cli/commands/commit.cjs +145 -0
- package/dist/cjs/cli/commands/diff.cjs +84 -0
- package/dist/cjs/cli/commands/export.cjs +333 -0
- package/dist/cjs/cli/commands/fetch.cjs +59 -0
- package/dist/cjs/cli/commands/generate.cjs +242 -0
- package/dist/cjs/cli/commands/history.cjs +165 -0
- package/dist/cjs/cli/commands/import.cjs +524 -0
- package/dist/cjs/cli/commands/init.cjs +437 -0
- package/dist/cjs/cli/commands/introspect.cjs +142 -0
- package/dist/cjs/cli/commands/log.cjs +62 -0
- package/dist/cjs/cli/commands/migrate.cjs +167 -0
- package/dist/cjs/cli/commands/pull.cjs +410 -0
- package/dist/cjs/cli/commands/push.cjs +165 -0
- package/dist/cjs/cli/commands/rollback.cjs +169 -0
- package/dist/cjs/cli/commands/status.cjs +110 -0
- package/dist/cjs/cli/commands/sync.cjs +79 -0
- package/dist/cjs/cli/index.cjs +275 -0
- package/dist/cjs/cli/utils/change-tracker.cjs +446 -0
- package/dist/cjs/cli/utils/commit-manager.cjs +239 -0
- package/dist/cjs/cli/utils/config-loader.cjs +127 -0
- package/dist/cjs/cli/utils/env-loader.cjs +62 -0
- package/dist/cjs/cli/utils/fast-introspect.cjs +398 -0
- package/dist/cjs/cli/utils/git-utils.cjs +404 -0
- package/dist/cjs/cli/utils/migration-generator.cjs +269 -0
- package/dist/cjs/cli/utils/relqignore.cjs +114 -0
- package/dist/cjs/cli/utils/repo-manager.cjs +515 -0
- package/dist/cjs/cli/utils/schema-comparator.cjs +313 -0
- package/dist/cjs/cli/utils/schema-diff.cjs +284 -0
- package/dist/cjs/cli/utils/schema-hash.cjs +108 -0
- package/dist/cjs/cli/utils/schema-introspect.cjs +455 -0
- package/dist/cjs/cli/utils/snapshot-manager.cjs +223 -0
- package/dist/cjs/cli/utils/spinner.cjs +108 -0
- package/dist/cjs/cli/utils/sql-generator.cjs +520 -0
- package/dist/cjs/cli/utils/sql-parser.cjs +999 -0
- package/dist/cjs/cli/utils/type-generator.cjs +2061 -0
- package/dist/cjs/condition/array-condition-builder.cjs +503 -0
- package/dist/cjs/condition/array-numeric-condition-builder.cjs +186 -0
- package/dist/cjs/condition/array-specialized-condition-builder.cjs +206 -0
- package/dist/cjs/condition/array-string-condition-builder.cjs +146 -0
- package/dist/cjs/condition/base-condition-builder.cjs +2 -0
- package/dist/cjs/condition/condition-collector.cjs +284 -0
- package/dist/cjs/condition/fulltext-condition-builder.cjs +61 -0
- package/dist/cjs/condition/geometric-condition-builder.cjs +208 -0
- package/dist/cjs/condition/index.cjs +25 -0
- package/dist/cjs/condition/jsonb-condition-builder.cjs +160 -0
- package/dist/cjs/condition/network-condition-builder.cjs +230 -0
- package/dist/cjs/condition/range-condition-builder.cjs +82 -0
- package/dist/cjs/config/config.cjs +190 -0
- package/dist/cjs/config/index.cjs +9 -0
- package/dist/cjs/constants/pg-values.cjs +68 -0
- package/dist/cjs/copy/copy-builder.cjs +316 -0
- package/dist/cjs/copy/index.cjs +6 -0
- package/dist/cjs/core/query-builder.cjs +440 -0
- package/dist/cjs/core/relq-client.cjs +1831 -0
- package/dist/cjs/core/typed-kuery-client.cjs +2 -0
- package/dist/cjs/count/count-builder.cjs +88 -0
- package/dist/cjs/count/index.cjs +5 -0
- package/dist/cjs/cte/cte-builder.cjs +89 -0
- package/dist/cjs/cte/index.cjs +5 -0
- package/dist/cjs/ddl/function.cjs +48 -0
- package/dist/cjs/ddl/index.cjs +7 -0
- package/dist/cjs/ddl/sql.cjs +54 -0
- package/dist/cjs/delete/delete-builder.cjs +135 -0
- package/dist/cjs/delete/index.cjs +5 -0
- package/dist/cjs/errors/relq-errors.cjs +329 -0
- package/dist/cjs/examples/fulltext-search-test.cjs +122 -0
- package/dist/cjs/explain/explain-builder.cjs +99 -0
- package/dist/cjs/explain/index.cjs +5 -0
- package/dist/cjs/function/create-function-builder.cjs +196 -0
- package/dist/cjs/function/index.cjs +6 -0
- package/dist/cjs/functions/advanced-functions.cjs +241 -0
- package/dist/cjs/functions/case-builder.cjs +66 -0
- package/dist/cjs/functions/geometric-functions.cjs +104 -0
- package/dist/cjs/functions/index.cjs +184 -0
- package/dist/cjs/functions/network-functions.cjs +86 -0
- package/dist/cjs/functions/sql-functions.cjs +431 -0
- package/dist/cjs/index.cjs +164 -0
- package/dist/cjs/indexing/create-index-builder.cjs +187 -0
- package/dist/cjs/indexing/drop-index-builder.cjs +89 -0
- package/dist/cjs/indexing/index-types.cjs +2 -0
- package/dist/cjs/indexing/index.cjs +8 -0
- package/dist/cjs/insert/conflict-builder.cjs +173 -0
- package/dist/cjs/insert/index.cjs +5 -0
- package/dist/cjs/insert/insert-builder.cjs +254 -0
- package/dist/cjs/introspect/index.cjs +229 -0
- package/dist/cjs/maintenance/index.cjs +6 -0
- package/dist/cjs/maintenance/vacuum-builder.cjs +166 -0
- package/dist/cjs/pubsub/index.cjs +7 -0
- package/dist/cjs/pubsub/listen-notify-builder.cjs +57 -0
- package/dist/cjs/pubsub/listener-connection.cjs +180 -0
- package/dist/cjs/raw/index.cjs +5 -0
- package/dist/cjs/raw/raw-query-builder.cjs +27 -0
- package/dist/cjs/schema/index.cjs +15 -0
- package/dist/cjs/schema/schema-builder.cjs +1167 -0
- package/dist/cjs/schema-builder.cjs +21 -0
- package/dist/cjs/schema-definition/column-types.cjs +829 -0
- package/dist/cjs/schema-definition/index.cjs +62 -0
- package/dist/cjs/schema-definition/introspection.cjs +620 -0
- package/dist/cjs/schema-definition/partitions.cjs +129 -0
- package/dist/cjs/schema-definition/pg-enum.cjs +76 -0
- package/dist/cjs/schema-definition/pg-function.cjs +91 -0
- package/dist/cjs/schema-definition/pg-sequence.cjs +56 -0
- package/dist/cjs/schema-definition/pg-trigger.cjs +108 -0
- package/dist/cjs/schema-definition/relations.cjs +98 -0
- package/dist/cjs/schema-definition/sql-expressions.cjs +202 -0
- package/dist/cjs/schema-definition/table-definition.cjs +636 -0
- package/dist/cjs/select/aggregate-builder.cjs +179 -0
- package/dist/cjs/select/index.cjs +5 -0
- package/dist/cjs/select/select-builder.cjs +233 -0
- package/dist/cjs/sequence/index.cjs +7 -0
- package/dist/cjs/sequence/sequence-builder.cjs +264 -0
- package/dist/cjs/table/alter-table-builder.cjs +146 -0
- package/dist/cjs/table/constraint-builder.cjs +102 -0
- package/dist/cjs/table/create-table-builder.cjs +248 -0
- package/dist/cjs/table/index.cjs +17 -0
- package/dist/cjs/table/partition-builder.cjs +131 -0
- package/dist/cjs/table/truncate-builder.cjs +70 -0
- package/dist/cjs/transaction/index.cjs +6 -0
- package/dist/cjs/transaction/transaction-builder.cjs +78 -0
- package/dist/cjs/trigger/create-trigger-builder.cjs +174 -0
- package/dist/cjs/trigger/index.cjs +6 -0
- package/dist/cjs/types/aggregate-types.cjs +2 -0
- package/dist/cjs/types/config-types.cjs +40 -0
- package/dist/cjs/types/inference-types.cjs +18 -0
- package/dist/cjs/types/pagination-types.cjs +7 -0
- package/dist/cjs/types/result-types.cjs +2 -0
- package/dist/cjs/types/schema-types.cjs +2 -0
- package/dist/cjs/types/subscription-types.cjs +2 -0
- package/dist/cjs/types.cjs +2 -0
- package/dist/cjs/update/array-update-builder.cjs +205 -0
- package/dist/cjs/update/index.cjs +13 -0
- package/dist/cjs/update/update-builder.cjs +195 -0
- package/dist/cjs/utils/case-converter.cjs +58 -0
- package/dist/cjs/utils/environment-detection.cjs +120 -0
- package/dist/cjs/utils/index.cjs +10 -0
- package/dist/cjs/utils/pool-defaults.cjs +106 -0
- package/dist/cjs/utils/type-coercion.cjs +118 -0
- package/dist/cjs/view/create-view-builder.cjs +180 -0
- package/dist/cjs/view/index.cjs +7 -0
- package/dist/cjs/window/index.cjs +5 -0
- package/dist/cjs/window/window-builder.cjs +80 -0
- package/dist/config.cjs +1 -0
- package/dist/config.d.ts +655 -0
- package/dist/config.js +1 -0
- package/dist/esm/cache/index.js +1 -0
- package/dist/esm/cache/query-cache.js +303 -0
- package/dist/esm/cli/commands/add.js +78 -0
- package/dist/esm/cli/commands/commit.js +109 -0
- package/dist/esm/cli/commands/diff.js +81 -0
- package/dist/esm/cli/commands/export.js +297 -0
- package/dist/esm/cli/commands/fetch.js +56 -0
- package/dist/esm/cli/commands/generate.js +206 -0
- package/dist/esm/cli/commands/history.js +129 -0
- package/dist/esm/cli/commands/import.js +488 -0
- package/dist/esm/cli/commands/init.js +401 -0
- package/dist/esm/cli/commands/introspect.js +106 -0
- package/dist/esm/cli/commands/log.js +59 -0
- package/dist/esm/cli/commands/migrate.js +131 -0
- package/dist/esm/cli/commands/pull.js +374 -0
- package/dist/esm/cli/commands/push.js +129 -0
- package/dist/esm/cli/commands/rollback.js +133 -0
- package/dist/esm/cli/commands/status.js +107 -0
- package/dist/esm/cli/commands/sync.js +76 -0
- package/dist/esm/cli/index.js +240 -0
- package/dist/esm/cli/utils/change-tracker.js +405 -0
- package/dist/esm/cli/utils/commit-manager.js +191 -0
- package/dist/esm/cli/utils/config-loader.js +86 -0
- package/dist/esm/cli/utils/env-loader.js +57 -0
- package/dist/esm/cli/utils/fast-introspect.js +362 -0
- package/dist/esm/cli/utils/git-utils.js +347 -0
- package/dist/esm/cli/utils/migration-generator.js +263 -0
- package/dist/esm/cli/utils/relqignore.js +74 -0
- package/dist/esm/cli/utils/repo-manager.js +444 -0
- package/dist/esm/cli/utils/schema-comparator.js +307 -0
- package/dist/esm/cli/utils/schema-diff.js +276 -0
- package/dist/esm/cli/utils/schema-hash.js +69 -0
- package/dist/esm/cli/utils/schema-introspect.js +418 -0
- package/dist/esm/cli/utils/snapshot-manager.js +179 -0
- package/dist/esm/cli/utils/spinner.js +101 -0
- package/dist/esm/cli/utils/sql-generator.js +504 -0
- package/dist/esm/cli/utils/sql-parser.js +992 -0
- package/dist/esm/cli/utils/type-generator.js +2058 -0
- package/dist/esm/condition/array-condition-builder.js +495 -0
- package/dist/esm/condition/array-numeric-condition-builder.js +182 -0
- package/dist/esm/condition/array-specialized-condition-builder.js +200 -0
- package/dist/esm/condition/array-string-condition-builder.js +142 -0
- package/dist/esm/condition/base-condition-builder.js +1 -0
- package/dist/esm/condition/condition-collector.js +275 -0
- package/dist/esm/condition/fulltext-condition-builder.js +53 -0
- package/dist/esm/condition/geometric-condition-builder.js +200 -0
- package/dist/esm/condition/index.js +7 -0
- package/dist/esm/condition/jsonb-condition-builder.js +152 -0
- package/dist/esm/condition/network-condition-builder.js +222 -0
- package/dist/esm/condition/range-condition-builder.js +74 -0
- package/dist/esm/config/config.js +150 -0
- package/dist/esm/config/index.js +1 -0
- package/dist/esm/constants/pg-values.js +63 -0
- package/dist/esm/copy/copy-builder.js +308 -0
- package/dist/esm/copy/index.js +1 -0
- package/dist/esm/core/query-builder.js +426 -0
- package/dist/esm/core/relq-client.js +1791 -0
- package/dist/esm/core/typed-kuery-client.js +1 -0
- package/dist/esm/count/count-builder.js +81 -0
- package/dist/esm/count/index.js +1 -0
- package/dist/esm/cte/cte-builder.js +82 -0
- package/dist/esm/cte/index.js +1 -0
- package/dist/esm/ddl/function.js +45 -0
- package/dist/esm/ddl/index.js +2 -0
- package/dist/esm/ddl/sql.js +51 -0
- package/dist/esm/delete/delete-builder.js +128 -0
- package/dist/esm/delete/index.js +1 -0
- package/dist/esm/errors/relq-errors.js +310 -0
- package/dist/esm/examples/fulltext-search-test.js +117 -0
- package/dist/esm/explain/explain-builder.js +95 -0
- package/dist/esm/explain/index.js +1 -0
- package/dist/esm/function/create-function-builder.js +188 -0
- package/dist/esm/function/index.js +1 -0
- package/dist/esm/functions/advanced-functions.js +231 -0
- package/dist/esm/functions/case-builder.js +58 -0
- package/dist/esm/functions/geometric-functions.js +97 -0
- package/dist/esm/functions/index.js +171 -0
- package/dist/esm/functions/network-functions.js +79 -0
- package/dist/esm/functions/sql-functions.js +421 -0
- package/dist/esm/index.js +34 -0
- package/dist/esm/indexing/create-index-builder.js +180 -0
- package/dist/esm/indexing/drop-index-builder.js +81 -0
- package/dist/esm/indexing/index-types.js +1 -0
- package/dist/esm/indexing/index.js +2 -0
- package/dist/esm/insert/conflict-builder.js +162 -0
- package/dist/esm/insert/index.js +1 -0
- package/dist/esm/insert/insert-builder.js +247 -0
- package/dist/esm/introspect/index.js +224 -0
- package/dist/esm/maintenance/index.js +1 -0
- package/dist/esm/maintenance/vacuum-builder.js +158 -0
- package/dist/esm/pubsub/index.js +1 -0
- package/dist/esm/pubsub/listen-notify-builder.js +48 -0
- package/dist/esm/pubsub/listener-connection.js +173 -0
- package/dist/esm/raw/index.js +1 -0
- package/dist/esm/raw/raw-query-builder.js +20 -0
- package/dist/esm/schema/index.js +1 -0
- package/dist/esm/schema/schema-builder.js +1150 -0
- package/dist/esm/schema-builder.js +2 -0
- package/dist/esm/schema-definition/column-types.js +738 -0
- package/dist/esm/schema-definition/index.js +10 -0
- package/dist/esm/schema-definition/introspection.js +614 -0
- package/dist/esm/schema-definition/partitions.js +123 -0
- package/dist/esm/schema-definition/pg-enum.js +70 -0
- package/dist/esm/schema-definition/pg-function.js +85 -0
- package/dist/esm/schema-definition/pg-sequence.js +50 -0
- package/dist/esm/schema-definition/pg-trigger.js +102 -0
- package/dist/esm/schema-definition/relations.js +90 -0
- package/dist/esm/schema-definition/sql-expressions.js +193 -0
- package/dist/esm/schema-definition/table-definition.js +630 -0
- package/dist/esm/select/aggregate-builder.js +172 -0
- package/dist/esm/select/index.js +1 -0
- package/dist/esm/select/select-builder.js +226 -0
- package/dist/esm/sequence/index.js +1 -0
- package/dist/esm/sequence/sequence-builder.js +255 -0
- package/dist/esm/table/alter-table-builder.js +138 -0
- package/dist/esm/table/constraint-builder.js +95 -0
- package/dist/esm/table/create-table-builder.js +241 -0
- package/dist/esm/table/index.js +5 -0
- package/dist/esm/table/partition-builder.js +121 -0
- package/dist/esm/table/truncate-builder.js +63 -0
- package/dist/esm/transaction/index.js +1 -0
- package/dist/esm/transaction/transaction-builder.js +70 -0
- package/dist/esm/trigger/create-trigger-builder.js +166 -0
- package/dist/esm/trigger/index.js +1 -0
- package/dist/esm/types/aggregate-types.js +1 -0
- package/dist/esm/types/config-types.js +36 -0
- package/dist/esm/types/inference-types.js +12 -0
- package/dist/esm/types/pagination-types.js +4 -0
- package/dist/esm/types/result-types.js +1 -0
- package/dist/esm/types/schema-types.js +1 -0
- package/dist/esm/types/subscription-types.js +1 -0
- package/dist/esm/types.js +1 -0
- package/dist/esm/update/array-update-builder.js +192 -0
- package/dist/esm/update/index.js +2 -0
- package/dist/esm/update/update-builder.js +188 -0
- package/dist/esm/utils/case-converter.js +55 -0
- package/dist/esm/utils/environment-detection.js +113 -0
- package/dist/esm/utils/index.js +2 -0
- package/dist/esm/utils/pool-defaults.js +100 -0
- package/dist/esm/utils/type-coercion.js +110 -0
- package/dist/esm/view/create-view-builder.js +171 -0
- package/dist/esm/view/index.js +1 -0
- package/dist/esm/window/index.js +1 -0
- package/dist/esm/window/window-builder.js +73 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +10341 -0
- package/dist/index.js +1 -0
- package/dist/schema-builder.cjs +1 -0
- package/dist/schema-builder.d.ts +2272 -0
- package/dist/schema-builder.js +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.normalizeSchema = normalizeSchema;
|
|
37
|
+
exports.generateSchemaHash = generateSchemaHash;
|
|
38
|
+
exports.generateShortHash = generateShortHash;
|
|
39
|
+
exports.schemasMatch = schemasMatch;
|
|
40
|
+
const crypto = __importStar(require("crypto"));
|
|
41
|
+
function normalizeSchema(schema) {
|
|
42
|
+
const userTables = schema.tables.filter(t => !t.name.startsWith('_relq') &&
|
|
43
|
+
!t.name.startsWith('relq_'));
|
|
44
|
+
const tables = userTables
|
|
45
|
+
.map(normalizeTable)
|
|
46
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
47
|
+
const extensions = [...schema.extensions].sort();
|
|
48
|
+
return { tables, extensions };
|
|
49
|
+
}
|
|
50
|
+
function normalizeTable(table) {
|
|
51
|
+
const columns = table.columns
|
|
52
|
+
.map(normalizeColumn)
|
|
53
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
54
|
+
const indexes = (table.indexes || [])
|
|
55
|
+
.map(normalizeIndex)
|
|
56
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
57
|
+
const constraints = (table.constraints || [])
|
|
58
|
+
.map(normalizeConstraint)
|
|
59
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
60
|
+
return {
|
|
61
|
+
name: table.name,
|
|
62
|
+
columns,
|
|
63
|
+
indexes,
|
|
64
|
+
constraints,
|
|
65
|
+
partitionType: table.partitionType,
|
|
66
|
+
partitionKey: table.partitionKey?.sort(),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function normalizeColumn(col) {
|
|
70
|
+
return {
|
|
71
|
+
name: col.name,
|
|
72
|
+
type: col.dataType.toUpperCase(),
|
|
73
|
+
nullable: col.isNullable,
|
|
74
|
+
defaultValue: col.defaultValue || undefined,
|
|
75
|
+
isPrimaryKey: col.isPrimaryKey,
|
|
76
|
+
isUnique: col.isUnique,
|
|
77
|
+
length: col.maxLength || undefined,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function normalizeIndex(idx) {
|
|
81
|
+
return {
|
|
82
|
+
name: idx.name,
|
|
83
|
+
columns: [...idx.columns].sort(),
|
|
84
|
+
unique: idx.isUnique,
|
|
85
|
+
type: idx.type?.toUpperCase(),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function normalizeConstraint(con) {
|
|
89
|
+
return {
|
|
90
|
+
name: con.name,
|
|
91
|
+
type: con.type.toUpperCase(),
|
|
92
|
+
definition: con.definition || undefined,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function generateSchemaHash(schema) {
|
|
96
|
+
const normalized = normalizeSchema(schema);
|
|
97
|
+
const json = JSON.stringify(normalized, null, 0);
|
|
98
|
+
return crypto
|
|
99
|
+
.createHash('sha1')
|
|
100
|
+
.update(json, 'utf8')
|
|
101
|
+
.digest('hex');
|
|
102
|
+
}
|
|
103
|
+
function generateShortHash(schema) {
|
|
104
|
+
return generateSchemaHash(schema).substring(0, 7);
|
|
105
|
+
}
|
|
106
|
+
function schemasMatch(schema1, schema2) {
|
|
107
|
+
return generateSchemaHash(schema1) === generateSchemaHash(schema2);
|
|
108
|
+
}
|
|
@@ -0,0 +1,455 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.introspectDatabase = introspectDatabase;
|
|
37
|
+
exports.tableHasData = tableHasData;
|
|
38
|
+
async function introspectDatabase(connection, onProgress, options) {
|
|
39
|
+
const { includeFunctions = false, includeTriggers = false } = options || {};
|
|
40
|
+
const { Pool } = await Promise.resolve().then(() => __importStar(require("../../../addons/pg.js")));
|
|
41
|
+
onProgress?.('connecting', connection.database);
|
|
42
|
+
const pool = new Pool({
|
|
43
|
+
host: connection.host,
|
|
44
|
+
port: connection.port || 5432,
|
|
45
|
+
database: connection.database,
|
|
46
|
+
user: connection.user,
|
|
47
|
+
password: connection.password,
|
|
48
|
+
connectionString: connection.url,
|
|
49
|
+
ssl: connection.ssl,
|
|
50
|
+
});
|
|
51
|
+
try {
|
|
52
|
+
onProgress?.('fetching_tables');
|
|
53
|
+
const tablesResult = await pool.query(`
|
|
54
|
+
SELECT
|
|
55
|
+
t.table_name,
|
|
56
|
+
t.table_schema,
|
|
57
|
+
(SELECT reltuples::bigint FROM pg_class WHERE relname = t.table_name) as row_count
|
|
58
|
+
FROM information_schema.tables t
|
|
59
|
+
WHERE t.table_schema = 'public'
|
|
60
|
+
AND t.table_type = 'BASE TABLE'
|
|
61
|
+
ORDER BY t.table_name;
|
|
62
|
+
`);
|
|
63
|
+
const tables = [];
|
|
64
|
+
const partitionNamesResult = await pool.query(`
|
|
65
|
+
SELECT c.relname as name
|
|
66
|
+
FROM pg_class c
|
|
67
|
+
JOIN pg_namespace n ON c.relnamespace = n.oid
|
|
68
|
+
WHERE n.nspname = 'public' AND c.relispartition = true;
|
|
69
|
+
`);
|
|
70
|
+
const partitionTableNames = new Set(partitionNamesResult.rows.map((r) => r.name));
|
|
71
|
+
const nonPartitionTables = tablesResult.rows.filter((r) => !partitionTableNames.has(r.table_name) && !r.table_name.startsWith('_relq'));
|
|
72
|
+
const totalTables = nonPartitionTables.length;
|
|
73
|
+
let tableIndex = 0;
|
|
74
|
+
for (let i = 0; i < tablesResult.rows.length; i++) {
|
|
75
|
+
const row = tablesResult.rows[i];
|
|
76
|
+
const tableName = row.table_name;
|
|
77
|
+
const tableSchema = row.table_schema;
|
|
78
|
+
const rowCount = parseInt(row.row_count) || 0;
|
|
79
|
+
const isPartition = partitionTableNames.has(tableName);
|
|
80
|
+
const isInternal = tableName.startsWith('_relq');
|
|
81
|
+
if (!isPartition && !isInternal) {
|
|
82
|
+
tableIndex++;
|
|
83
|
+
onProgress?.('parsing_table', `${tableName} (${tableIndex}/${totalTables})`);
|
|
84
|
+
}
|
|
85
|
+
const columnsResult = await pool.query(`
|
|
86
|
+
SELECT
|
|
87
|
+
c.column_name,
|
|
88
|
+
c.data_type,
|
|
89
|
+
c.udt_name,
|
|
90
|
+
c.is_nullable,
|
|
91
|
+
c.column_default,
|
|
92
|
+
c.character_maximum_length,
|
|
93
|
+
c.numeric_precision,
|
|
94
|
+
c.numeric_scale,
|
|
95
|
+
COALESCE(pk.is_pk, false) as is_primary_key,
|
|
96
|
+
COALESCE(uq.is_unique, false) as is_unique,
|
|
97
|
+
fk.foreign_table,
|
|
98
|
+
fk.foreign_column,
|
|
99
|
+
col_description(pgc.oid, c.ordinal_position::int) as column_comment
|
|
100
|
+
FROM information_schema.columns c
|
|
101
|
+
JOIN pg_class pgc ON pgc.relname = c.table_name
|
|
102
|
+
JOIN pg_namespace pgn ON pgn.oid = pgc.relnamespace AND pgn.nspname = c.table_schema
|
|
103
|
+
LEFT JOIN (
|
|
104
|
+
SELECT kcu.column_name, true as is_pk
|
|
105
|
+
FROM information_schema.table_constraints tc
|
|
106
|
+
JOIN information_schema.key_column_usage kcu
|
|
107
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
108
|
+
WHERE tc.table_name = $1 AND tc.constraint_type = 'PRIMARY KEY'
|
|
109
|
+
) pk ON pk.column_name = c.column_name
|
|
110
|
+
LEFT JOIN (
|
|
111
|
+
SELECT kcu.column_name, true as is_unique
|
|
112
|
+
FROM information_schema.table_constraints tc
|
|
113
|
+
JOIN information_schema.key_column_usage kcu
|
|
114
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
115
|
+
WHERE tc.table_name = $1 AND tc.constraint_type = 'UNIQUE'
|
|
116
|
+
) uq ON uq.column_name = c.column_name
|
|
117
|
+
LEFT JOIN (
|
|
118
|
+
SELECT
|
|
119
|
+
kcu.column_name,
|
|
120
|
+
ccu.table_name as foreign_table,
|
|
121
|
+
ccu.column_name as foreign_column
|
|
122
|
+
FROM information_schema.table_constraints tc
|
|
123
|
+
JOIN information_schema.key_column_usage kcu
|
|
124
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
125
|
+
JOIN information_schema.constraint_column_usage ccu
|
|
126
|
+
ON tc.constraint_name = ccu.constraint_name
|
|
127
|
+
WHERE tc.table_name = $1 AND tc.constraint_type = 'FOREIGN KEY'
|
|
128
|
+
) fk ON fk.column_name = c.column_name
|
|
129
|
+
WHERE c.table_name = $1 AND c.table_schema = $2
|
|
130
|
+
ORDER BY c.ordinal_position;
|
|
131
|
+
`, [tableName, tableSchema]);
|
|
132
|
+
const columns = columnsResult.rows.map(col => ({
|
|
133
|
+
name: col.column_name,
|
|
134
|
+
dataType: col.udt_name || col.data_type,
|
|
135
|
+
isNullable: col.is_nullable === 'YES',
|
|
136
|
+
defaultValue: col.column_default,
|
|
137
|
+
isPrimaryKey: col.is_primary_key,
|
|
138
|
+
isUnique: col.is_unique,
|
|
139
|
+
maxLength: col.character_maximum_length,
|
|
140
|
+
precision: col.numeric_precision,
|
|
141
|
+
scale: col.numeric_scale,
|
|
142
|
+
references: col.foreign_table ? {
|
|
143
|
+
table: col.foreign_table,
|
|
144
|
+
column: col.foreign_column,
|
|
145
|
+
} : null,
|
|
146
|
+
comment: col.column_comment || undefined,
|
|
147
|
+
}));
|
|
148
|
+
const indexesResult = await pool.query(`
|
|
149
|
+
SELECT
|
|
150
|
+
i.relname as index_name,
|
|
151
|
+
array_agg(a.attname ORDER BY k.n) as columns,
|
|
152
|
+
ix.indisunique as is_unique,
|
|
153
|
+
ix.indisprimary as is_primary,
|
|
154
|
+
am.amname as index_type
|
|
155
|
+
FROM pg_index ix
|
|
156
|
+
JOIN pg_class t ON t.oid = ix.indrelid
|
|
157
|
+
JOIN pg_class i ON i.oid = ix.indexrelid
|
|
158
|
+
JOIN pg_am am ON am.oid = i.relam
|
|
159
|
+
JOIN LATERAL unnest(ix.indkey) WITH ORDINALITY AS k(attnum, n) ON true
|
|
160
|
+
JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = k.attnum
|
|
161
|
+
WHERE t.relname = $1
|
|
162
|
+
GROUP BY i.relname, ix.indisunique, ix.indisprimary, am.amname
|
|
163
|
+
ORDER BY i.relname;
|
|
164
|
+
`, [tableName]);
|
|
165
|
+
const indexes = indexesResult.rows.map(idx => ({
|
|
166
|
+
name: idx.index_name,
|
|
167
|
+
columns: idx.columns,
|
|
168
|
+
isUnique: idx.is_unique,
|
|
169
|
+
isPrimary: idx.is_primary,
|
|
170
|
+
type: idx.index_type,
|
|
171
|
+
}));
|
|
172
|
+
const constraintsResult = await pool.query(`
|
|
173
|
+
SELECT
|
|
174
|
+
con.conname as name,
|
|
175
|
+
CASE con.contype
|
|
176
|
+
WHEN 'p' THEN 'PRIMARY KEY'
|
|
177
|
+
WHEN 'f' THEN 'FOREIGN KEY'
|
|
178
|
+
WHEN 'u' THEN 'UNIQUE'
|
|
179
|
+
WHEN 'c' THEN 'CHECK'
|
|
180
|
+
WHEN 'x' THEN 'EXCLUDE'
|
|
181
|
+
END as type,
|
|
182
|
+
array_agg(a.attname ORDER BY u.attposition) as columns,
|
|
183
|
+
pg_get_constraintdef(con.oid) as definition,
|
|
184
|
+
conf.relname as referenced_table
|
|
185
|
+
FROM pg_constraint con
|
|
186
|
+
JOIN pg_class c ON c.oid = con.conrelid
|
|
187
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
188
|
+
LEFT JOIN pg_class conf ON conf.oid = con.confrelid
|
|
189
|
+
LEFT JOIN unnest(con.conkey) WITH ORDINALITY u(attnum, attposition) ON true
|
|
190
|
+
LEFT JOIN pg_attribute a ON a.attrelid = c.oid AND a.attnum = u.attnum
|
|
191
|
+
WHERE c.relname = $1 AND n.nspname = 'public'
|
|
192
|
+
GROUP BY con.oid, con.conname, con.contype, conf.relname
|
|
193
|
+
ORDER BY con.conname;
|
|
194
|
+
`, [tableName]);
|
|
195
|
+
const constraints = constraintsResult.rows.map(c => ({
|
|
196
|
+
name: c.name,
|
|
197
|
+
type: c.type,
|
|
198
|
+
columns: c.columns || [],
|
|
199
|
+
definition: c.definition || '',
|
|
200
|
+
referencedTable: c.referenced_table,
|
|
201
|
+
}));
|
|
202
|
+
const partitionCheckResult = await pool.query(`
|
|
203
|
+
SELECT
|
|
204
|
+
c.relkind = 'p' as is_partitioned,
|
|
205
|
+
CASE pt.partstrat
|
|
206
|
+
WHEN 'r' THEN 'RANGE'
|
|
207
|
+
WHEN 'l' THEN 'LIST'
|
|
208
|
+
WHEN 'h' THEN 'HASH'
|
|
209
|
+
END as partition_type,
|
|
210
|
+
array_agg(a.attname) as partition_key
|
|
211
|
+
FROM pg_class c
|
|
212
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
213
|
+
LEFT JOIN pg_partitioned_table pt ON pt.partrelid = c.oid
|
|
214
|
+
LEFT JOIN unnest(pt.partattrs) WITH ORDINALITY pk(attnum, ord) ON true
|
|
215
|
+
LEFT JOIN pg_attribute a ON a.attrelid = c.oid AND a.attnum = pk.attnum
|
|
216
|
+
WHERE c.relname = $1 AND n.nspname = 'public'
|
|
217
|
+
GROUP BY c.relkind, pt.partstrat;
|
|
218
|
+
`, [tableName]);
|
|
219
|
+
const partitionInfo = partitionCheckResult.rows[0] || {};
|
|
220
|
+
let partitionKey;
|
|
221
|
+
if (partitionInfo.partition_key) {
|
|
222
|
+
partitionKey = Array.isArray(partitionInfo.partition_key)
|
|
223
|
+
? partitionInfo.partition_key.filter(Boolean)
|
|
224
|
+
: typeof partitionInfo.partition_key === 'string'
|
|
225
|
+
? [partitionInfo.partition_key]
|
|
226
|
+
: undefined;
|
|
227
|
+
}
|
|
228
|
+
tables.push({
|
|
229
|
+
name: tableName,
|
|
230
|
+
schema: tableSchema,
|
|
231
|
+
columns,
|
|
232
|
+
indexes,
|
|
233
|
+
constraints,
|
|
234
|
+
rowCount,
|
|
235
|
+
isPartitioned: partitionInfo.is_partitioned || false,
|
|
236
|
+
partitionType: partitionInfo.partition_type,
|
|
237
|
+
partitionKey,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
onProgress?.('fetching_extensions');
|
|
241
|
+
const extensionsResult = await pool.query(`
|
|
242
|
+
SELECT extname FROM pg_extension WHERE extname != 'plpgsql';
|
|
243
|
+
`);
|
|
244
|
+
const extensions = extensionsResult.rows.map(r => r.extname);
|
|
245
|
+
let functions = [];
|
|
246
|
+
if (includeFunctions) {
|
|
247
|
+
onProgress?.('fetching_functions');
|
|
248
|
+
const functionsResult = await pool.query(`
|
|
249
|
+
SELECT
|
|
250
|
+
p.proname as name,
|
|
251
|
+
n.nspname as schema,
|
|
252
|
+
pg_get_function_result(p.oid) as return_type,
|
|
253
|
+
pg_get_function_arguments(p.oid) as arg_types,
|
|
254
|
+
l.lanname as language,
|
|
255
|
+
pg_get_functiondef(p.oid) as definition,
|
|
256
|
+
p.prokind = 'a' as is_aggregate,
|
|
257
|
+
p.provolatile as volatility
|
|
258
|
+
FROM pg_proc p
|
|
259
|
+
JOIN pg_namespace n ON p.pronamespace = n.oid
|
|
260
|
+
JOIN pg_language l ON p.prolang = l.oid
|
|
261
|
+
WHERE n.nspname = 'public'
|
|
262
|
+
AND p.prokind IN ('f', 'a')
|
|
263
|
+
ORDER BY p.proname;
|
|
264
|
+
`);
|
|
265
|
+
functions = functionsResult.rows.map(f => ({
|
|
266
|
+
name: f.name,
|
|
267
|
+
schema: f.schema,
|
|
268
|
+
returnType: f.return_type,
|
|
269
|
+
argTypes: f.arg_types ? f.arg_types.split(', ') : [],
|
|
270
|
+
language: f.language,
|
|
271
|
+
definition: f.definition || '',
|
|
272
|
+
isAggregate: f.is_aggregate || false,
|
|
273
|
+
volatility: f.volatility === 'i' ? 'IMMUTABLE' : f.volatility === 's' ? 'STABLE' : 'VOLATILE',
|
|
274
|
+
}));
|
|
275
|
+
}
|
|
276
|
+
let triggers = [];
|
|
277
|
+
if (includeTriggers) {
|
|
278
|
+
const triggersResult = await pool.query(`
|
|
279
|
+
SELECT
|
|
280
|
+
t.tgname as name,
|
|
281
|
+
c.relname as table_name,
|
|
282
|
+
CASE
|
|
283
|
+
WHEN t.tgtype & 2 > 0 THEN 'BEFORE'
|
|
284
|
+
WHEN t.tgtype & 64 > 0 THEN 'INSTEAD OF'
|
|
285
|
+
ELSE 'AFTER'
|
|
286
|
+
END as timing,
|
|
287
|
+
CASE
|
|
288
|
+
WHEN t.tgtype & 4 > 0 THEN 'INSERT'
|
|
289
|
+
WHEN t.tgtype & 8 > 0 THEN 'DELETE'
|
|
290
|
+
WHEN t.tgtype & 16 > 0 THEN 'UPDATE'
|
|
291
|
+
ELSE 'UNKNOWN'
|
|
292
|
+
END as event,
|
|
293
|
+
p.proname as function_name,
|
|
294
|
+
pg_get_triggerdef(t.oid) as definition,
|
|
295
|
+
t.tgenabled != 'D' as is_enabled
|
|
296
|
+
FROM pg_trigger t
|
|
297
|
+
JOIN pg_class c ON t.tgrelid = c.oid
|
|
298
|
+
JOIN pg_namespace n ON c.relnamespace = n.oid
|
|
299
|
+
JOIN pg_proc p ON t.tgfoid = p.oid
|
|
300
|
+
WHERE n.nspname = 'public'
|
|
301
|
+
AND NOT t.tgisinternal
|
|
302
|
+
ORDER BY c.relname, t.tgname;
|
|
303
|
+
`);
|
|
304
|
+
triggers = triggersResult.rows.map(t => ({
|
|
305
|
+
name: t.name,
|
|
306
|
+
tableName: t.table_name,
|
|
307
|
+
timing: t.timing,
|
|
308
|
+
event: t.event,
|
|
309
|
+
functionName: t.function_name,
|
|
310
|
+
definition: t.definition || '',
|
|
311
|
+
isEnabled: t.is_enabled,
|
|
312
|
+
}));
|
|
313
|
+
}
|
|
314
|
+
const policiesResult = await pool.query(`
|
|
315
|
+
SELECT
|
|
316
|
+
pol.polname as name,
|
|
317
|
+
c.relname as table_name,
|
|
318
|
+
CASE pol.polcmd
|
|
319
|
+
WHEN '*' THEN 'ALL'
|
|
320
|
+
WHEN 'r' THEN 'SELECT'
|
|
321
|
+
WHEN 'a' THEN 'INSERT'
|
|
322
|
+
WHEN 'w' THEN 'UPDATE'
|
|
323
|
+
WHEN 'd' THEN 'DELETE'
|
|
324
|
+
END as command,
|
|
325
|
+
array_agg(r.rolname) as roles,
|
|
326
|
+
pg_get_expr(pol.polqual, pol.polrelid) as using_expr,
|
|
327
|
+
pg_get_expr(pol.polwithcheck, pol.polrelid) as with_check
|
|
328
|
+
FROM pg_policy pol
|
|
329
|
+
JOIN pg_class c ON pol.polrelid = c.oid
|
|
330
|
+
JOIN pg_namespace n ON c.relnamespace = n.oid
|
|
331
|
+
LEFT JOIN unnest(pol.polroles) WITH ORDINALITY pr(oid, ord) ON true
|
|
332
|
+
LEFT JOIN pg_roles r ON r.oid = pr.oid
|
|
333
|
+
WHERE n.nspname = 'public'
|
|
334
|
+
GROUP BY pol.polname, c.relname, pol.polcmd, pol.polqual, pol.polwithcheck, pol.polrelid
|
|
335
|
+
ORDER BY c.relname, pol.polname;
|
|
336
|
+
`);
|
|
337
|
+
const policies = policiesResult.rows.map(p => ({
|
|
338
|
+
name: p.name,
|
|
339
|
+
tableName: p.table_name,
|
|
340
|
+
command: p.command,
|
|
341
|
+
roles: p.roles?.filter(Boolean) || [],
|
|
342
|
+
using: p.using_expr,
|
|
343
|
+
withCheck: p.with_check,
|
|
344
|
+
}));
|
|
345
|
+
const partitionsResult = await pool.query(`
|
|
346
|
+
SELECT
|
|
347
|
+
c.relname as name,
|
|
348
|
+
parent.relname as parent_table,
|
|
349
|
+
CASE pt.partstrat
|
|
350
|
+
WHEN 'r' THEN 'RANGE'
|
|
351
|
+
WHEN 'l' THEN 'LIST'
|
|
352
|
+
WHEN 'h' THEN 'HASH'
|
|
353
|
+
END as partition_type,
|
|
354
|
+
pg_get_expr(c.relpartbound, c.oid) as partition_bound
|
|
355
|
+
FROM pg_class c
|
|
356
|
+
JOIN pg_inherits i ON c.oid = i.inhrelid
|
|
357
|
+
JOIN pg_class parent ON parent.oid = i.inhparent
|
|
358
|
+
JOIN pg_namespace n ON c.relnamespace = n.oid
|
|
359
|
+
LEFT JOIN pg_partitioned_table pt ON pt.partrelid = parent.oid
|
|
360
|
+
WHERE n.nspname = 'public'
|
|
361
|
+
AND c.relispartition
|
|
362
|
+
ORDER BY parent.relname, c.relname;
|
|
363
|
+
`);
|
|
364
|
+
const partitions = partitionsResult.rows.map(p => ({
|
|
365
|
+
name: p.name,
|
|
366
|
+
parentTable: p.parent_table,
|
|
367
|
+
partitionType: p.partition_type || 'RANGE',
|
|
368
|
+
partitionKey: [],
|
|
369
|
+
partitionBound: p.partition_bound || '',
|
|
370
|
+
}));
|
|
371
|
+
const foreignServersResult = await pool.query(`
|
|
372
|
+
SELECT
|
|
373
|
+
s.srvname as name,
|
|
374
|
+
f.fdwname as foreign_data_wrapper,
|
|
375
|
+
s.srvoptions as options
|
|
376
|
+
FROM pg_foreign_server s
|
|
377
|
+
JOIN pg_foreign_data_wrapper f ON f.oid = s.srvfdw
|
|
378
|
+
ORDER BY s.srvname;
|
|
379
|
+
`);
|
|
380
|
+
const foreignServers = foreignServersResult.rows.map(s => ({
|
|
381
|
+
name: s.name,
|
|
382
|
+
foreignDataWrapper: s.foreign_data_wrapper,
|
|
383
|
+
options: parseOptions(s.options),
|
|
384
|
+
}));
|
|
385
|
+
const foreignTablesResult = await pool.query(`
|
|
386
|
+
SELECT
|
|
387
|
+
c.relname as name,
|
|
388
|
+
n.nspname as schema,
|
|
389
|
+
s.srvname as server_name,
|
|
390
|
+
ft.ftoptions as options
|
|
391
|
+
FROM pg_foreign_table ft
|
|
392
|
+
JOIN pg_class c ON c.oid = ft.ftrelid
|
|
393
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
394
|
+
JOIN pg_foreign_server s ON s.oid = ft.ftserver
|
|
395
|
+
WHERE n.nspname = 'public'
|
|
396
|
+
ORDER BY c.relname;
|
|
397
|
+
`);
|
|
398
|
+
const foreignTables = foreignTablesResult.rows.map(t => ({
|
|
399
|
+
name: t.name,
|
|
400
|
+
schema: t.schema,
|
|
401
|
+
serverName: t.server_name,
|
|
402
|
+
columns: [],
|
|
403
|
+
options: parseOptions(t.options),
|
|
404
|
+
}));
|
|
405
|
+
return {
|
|
406
|
+
tables,
|
|
407
|
+
enums: [],
|
|
408
|
+
domains: [],
|
|
409
|
+
compositeTypes: [],
|
|
410
|
+
sequences: [],
|
|
411
|
+
functions,
|
|
412
|
+
triggers,
|
|
413
|
+
policies,
|
|
414
|
+
partitions,
|
|
415
|
+
foreignServers,
|
|
416
|
+
foreignTables,
|
|
417
|
+
extensions
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
finally {
|
|
421
|
+
await pool.end();
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
function parseOptions(options) {
|
|
425
|
+
if (!options)
|
|
426
|
+
return {};
|
|
427
|
+
const result = {};
|
|
428
|
+
for (const opt of options) {
|
|
429
|
+
const [key, value] = opt.split('=');
|
|
430
|
+
if (key)
|
|
431
|
+
result[key] = value || '';
|
|
432
|
+
}
|
|
433
|
+
return result;
|
|
434
|
+
}
|
|
435
|
+
async function tableHasData(connection, tableName) {
|
|
436
|
+
const { Pool } = await Promise.resolve().then(() => __importStar(require("../../../addons/pg.js")));
|
|
437
|
+
const pool = new Pool({
|
|
438
|
+
host: connection.host,
|
|
439
|
+
port: connection.port || 5432,
|
|
440
|
+
database: connection.database,
|
|
441
|
+
user: connection.user,
|
|
442
|
+
password: connection.password,
|
|
443
|
+
connectionString: connection.url,
|
|
444
|
+
});
|
|
445
|
+
try {
|
|
446
|
+
const result = await pool.query(`SELECT EXISTS(SELECT 1 FROM "${tableName}" LIMIT 1) as has_data`);
|
|
447
|
+
return result.rows[0]?.has_data || false;
|
|
448
|
+
}
|
|
449
|
+
catch {
|
|
450
|
+
return false;
|
|
451
|
+
}
|
|
452
|
+
finally {
|
|
453
|
+
await pool.end();
|
|
454
|
+
}
|
|
455
|
+
}
|