@javalabs/prisma-client 1.0.4 → 1.0.6
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/dist/scripts/data-migration/batch-migrator.d.ts +14 -19
- package/dist/scripts/data-migration/batch-migrator.js +98 -297
- package/dist/scripts/data-migration/batch-migrator.js.map +1 -1
- package/dist/scripts/data-migration/data-transformer.d.ts +16 -7
- package/dist/scripts/data-migration/data-transformer.js +169 -133
- package/dist/scripts/data-migration/data-transformer.js.map +1 -1
- package/dist/scripts/data-migration/db-connector.d.ts +6 -1
- package/dist/scripts/data-migration/db-connector.js +44 -8
- package/dist/scripts/data-migration/db-connector.js.map +1 -1
- package/dist/scripts/data-migration/dependency-resolver.d.ts +10 -10
- package/dist/scripts/data-migration/dependency-resolver.js +92 -211
- package/dist/scripts/data-migration/dependency-resolver.js.map +1 -1
- package/dist/scripts/data-migration/foreign-key-manager.d.ts +6 -5
- package/dist/scripts/data-migration/foreign-key-manager.js +108 -18
- package/dist/scripts/data-migration/foreign-key-manager.js.map +1 -1
- package/dist/scripts/data-migration/migration-config.json +63 -0
- package/dist/scripts/data-migration/migration-tool.d.ts +25 -6
- package/dist/scripts/data-migration/migration-tool.js +78 -38
- package/dist/scripts/data-migration/migration-tool.js.map +1 -1
- package/dist/scripts/data-migration/multi-source-migrator.d.ts +17 -0
- package/dist/scripts/data-migration/multi-source-migrator.js +130 -0
- package/dist/scripts/data-migration/multi-source-migrator.js.map +1 -0
- package/dist/scripts/data-migration/schema-utils.d.ts +3 -3
- package/dist/scripts/data-migration/schema-utils.js +62 -19
- package/dist/scripts/data-migration/schema-utils.js.map +1 -1
- package/dist/scripts/data-migration/tenant-migrator.js +9 -2
- package/dist/scripts/data-migration/tenant-migrator.js.map +1 -1
- package/dist/scripts/data-migration/typecast-manager.d.ts +7 -3
- package/dist/scripts/data-migration/typecast-manager.js +169 -25
- package/dist/scripts/data-migration/typecast-manager.js.map +1 -1
- package/dist/scripts/data-migration/types.d.ts +68 -2
- package/dist/scripts/fix-table-indexes.d.ts +26 -0
- package/dist/scripts/fix-table-indexes.js +460 -0
- package/dist/scripts/fix-table-indexes.js.map +1 -0
- package/dist/scripts/multi-db-migration.d.ts +1 -0
- package/dist/scripts/multi-db-migration.js +55 -0
- package/dist/scripts/multi-db-migration.js.map +1 -0
- package/dist/scripts/run-migration.js +41 -75
- package/dist/scripts/run-migration.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/migration-config.json +40 -72
- package/{migration-config-public.json → migration-config.json.bk} +14 -14
- package/package.json +6 -3
- package/src/scripts/data-migration/batch-migrator.ts +192 -513
- package/src/scripts/data-migration/data-transformer.ts +252 -203
- package/src/scripts/data-migration/db-connector.ts +66 -13
- package/src/scripts/data-migration/dependency-resolver.ts +121 -266
- package/src/scripts/data-migration/foreign-key-manager.ts +214 -32
- package/src/scripts/data-migration/migration-config.json +63 -0
- package/src/scripts/data-migration/migration-tool.ts +377 -225
- package/src/scripts/data-migration/schema-utils.ts +94 -32
- package/src/scripts/data-migration/tenant-migrator.ts +12 -5
- package/src/scripts/data-migration/typecast-manager.ts +186 -31
- package/src/scripts/data-migration/types.ts +78 -5
- package/src/scripts/dumps/source_dump_20250428_145606.sql +323 -0
- package/src/scripts/fix-table-indexes.ts +602 -0
- package/src/scripts/post-migration-validator.ts +206 -107
- package/src/scripts/run-migration.ts +87 -101
|
@@ -3,13 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.SchemaUtils = void 0;
|
|
4
4
|
const common_1 = require("@nestjs/common");
|
|
5
5
|
class SchemaUtils {
|
|
6
|
-
constructor(
|
|
7
|
-
this.
|
|
8
|
-
this.targetPool = targetPool;
|
|
6
|
+
constructor(connections) {
|
|
7
|
+
this.connections = connections;
|
|
9
8
|
this.logger = new common_1.Logger("SchemaUtils");
|
|
10
9
|
}
|
|
11
10
|
async getTableSchema(tableName, dbType, schema = "public") {
|
|
12
|
-
const pool = dbType === "source"
|
|
11
|
+
const pool = dbType === "source"
|
|
12
|
+
? this.connections.sourcePool
|
|
13
|
+
: this.connections.targetPool;
|
|
13
14
|
const query = `
|
|
14
15
|
SELECT
|
|
15
16
|
c.table_name,
|
|
@@ -49,7 +50,9 @@ class SchemaUtils {
|
|
|
49
50
|
FROM information_schema.schemata
|
|
50
51
|
WHERE schema_name = $1
|
|
51
52
|
`;
|
|
52
|
-
const result = await this.targetPool.query(query, [
|
|
53
|
+
const result = await this.connections.targetPool.query(query, [
|
|
54
|
+
schemaName,
|
|
55
|
+
]);
|
|
53
56
|
return result.rows.length > 0;
|
|
54
57
|
}
|
|
55
58
|
catch (error) {
|
|
@@ -65,9 +68,11 @@ class SchemaUtils {
|
|
|
65
68
|
WHERE table_schema = $1
|
|
66
69
|
AND table_type = 'BASE TABLE'
|
|
67
70
|
`;
|
|
68
|
-
const result = await this.targetPool.query(query, [
|
|
71
|
+
const result = await this.connections.targetPool.query(query, [
|
|
72
|
+
schemaName,
|
|
73
|
+
]);
|
|
69
74
|
this.logger.log(`Found ${result.rows.length} tables in schema ${schemaName}`);
|
|
70
|
-
result.rows.forEach(row => {
|
|
75
|
+
result.rows.forEach((row) => {
|
|
71
76
|
this.logger.log(`Table in schema ${schemaName}: ${row.table_name}`);
|
|
72
77
|
});
|
|
73
78
|
return result.rows.map((row) => row.table_name);
|
|
@@ -87,7 +92,10 @@ class SchemaUtils {
|
|
|
87
92
|
WHERE t.typname = $1
|
|
88
93
|
AND n.nspname = $2
|
|
89
94
|
`;
|
|
90
|
-
const result = await this.targetPool.query(query, [
|
|
95
|
+
const result = await this.connections.targetPool.query(query, [
|
|
96
|
+
enumName,
|
|
97
|
+
schemaName,
|
|
98
|
+
]);
|
|
91
99
|
return result.rows.map((row) => row.enumlabel);
|
|
92
100
|
}
|
|
93
101
|
catch (error) {
|
|
@@ -96,10 +104,10 @@ class SchemaUtils {
|
|
|
96
104
|
}
|
|
97
105
|
}
|
|
98
106
|
async executeQuery(query, params = []) {
|
|
99
|
-
return this.targetPool.query(query, params);
|
|
107
|
+
return this.connections.targetPool.query(query, params);
|
|
100
108
|
}
|
|
101
109
|
async queryTargetDb(query, params) {
|
|
102
|
-
return this.targetPool.query(query, params);
|
|
110
|
+
return this.connections.targetPool.query(query, params);
|
|
103
111
|
}
|
|
104
112
|
async createMissingColumns(tableName, schema, columns) {
|
|
105
113
|
for (const column of columns) {
|
|
@@ -107,11 +115,11 @@ class SchemaUtils {
|
|
|
107
115
|
const query = `
|
|
108
116
|
ALTER TABLE "${schema}"."${tableName}"
|
|
109
117
|
ADD COLUMN IF NOT EXISTS "${column.column_name}" ${column.data_type}
|
|
110
|
-
${column.is_nullable ===
|
|
111
|
-
${column.column_default ? `DEFAULT ${column.column_default}` :
|
|
118
|
+
${column.is_nullable === "NO" ? "NOT NULL" : ""}
|
|
119
|
+
${column.column_default ? `DEFAULT ${column.column_default}` : ""}
|
|
112
120
|
`;
|
|
113
|
-
await this.targetPool.query(query);
|
|
114
|
-
if (column.constraint_type ===
|
|
121
|
+
await this.connections.targetPool.query(query);
|
|
122
|
+
if (column.constraint_type === "UNIQUE") {
|
|
115
123
|
const constraintName = `${tableName}_${column.column_name}_unique`;
|
|
116
124
|
const uniqueQuery = `
|
|
117
125
|
DO $$
|
|
@@ -124,7 +132,7 @@ class SchemaUtils {
|
|
|
124
132
|
END IF;
|
|
125
133
|
END $$;
|
|
126
134
|
`;
|
|
127
|
-
await this.targetPool.query(uniqueQuery);
|
|
135
|
+
await this.connections.targetPool.query(uniqueQuery);
|
|
128
136
|
}
|
|
129
137
|
}
|
|
130
138
|
catch (error) {
|
|
@@ -135,10 +143,10 @@ class SchemaUtils {
|
|
|
135
143
|
}
|
|
136
144
|
async createSchema(schemaName) {
|
|
137
145
|
try {
|
|
138
|
-
await this.targetPool.query(`CREATE SCHEMA IF NOT EXISTS "${schemaName}"`);
|
|
146
|
+
await this.connections.targetPool.query(`CREATE SCHEMA IF NOT EXISTS "${schemaName}"`);
|
|
139
147
|
const tables = await this.getPublicTables();
|
|
140
148
|
for (const table of tables) {
|
|
141
|
-
await this.targetPool.query(`
|
|
149
|
+
await this.connections.targetPool.query(`
|
|
142
150
|
CREATE TABLE IF NOT EXISTS "${schemaName}"."${table}" (
|
|
143
151
|
LIKE public."${table}" INCLUDING ALL
|
|
144
152
|
);
|
|
@@ -152,12 +160,47 @@ class SchemaUtils {
|
|
|
152
160
|
}
|
|
153
161
|
}
|
|
154
162
|
async getPublicTables() {
|
|
155
|
-
const result = await this.targetPool.query(`
|
|
163
|
+
const result = await this.connections.targetPool.query(`
|
|
156
164
|
SELECT tablename
|
|
157
165
|
FROM pg_tables
|
|
158
166
|
WHERE schemaname = 'public'
|
|
159
167
|
`);
|
|
160
|
-
return result.rows.map(row => row.tablename);
|
|
168
|
+
return result.rows.map((row) => row.tablename);
|
|
169
|
+
}
|
|
170
|
+
async getTableColumns(schema, table) {
|
|
171
|
+
const query = `
|
|
172
|
+
SELECT
|
|
173
|
+
column_name,
|
|
174
|
+
data_type,
|
|
175
|
+
is_nullable,
|
|
176
|
+
column_default,
|
|
177
|
+
character_maximum_length,
|
|
178
|
+
numeric_precision,
|
|
179
|
+
numeric_scale
|
|
180
|
+
FROM information_schema.columns
|
|
181
|
+
WHERE table_schema = $1
|
|
182
|
+
AND table_name = $2
|
|
183
|
+
ORDER BY ordinal_position;
|
|
184
|
+
`;
|
|
185
|
+
try {
|
|
186
|
+
const result = await this.connections.sourcePool.query(query, [
|
|
187
|
+
schema,
|
|
188
|
+
table,
|
|
189
|
+
]);
|
|
190
|
+
return result.rows.map((row) => ({
|
|
191
|
+
column_name: row.column_name,
|
|
192
|
+
data_type: row.data_type,
|
|
193
|
+
is_nullable: row.is_nullable,
|
|
194
|
+
column_default: row.column_default,
|
|
195
|
+
character_maximum_length: row.character_maximum_length,
|
|
196
|
+
numeric_precision: row.numeric_precision,
|
|
197
|
+
numeric_scale: row.numeric_scale,
|
|
198
|
+
}));
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
this.logger.error(`Error obteniendo columnas para ${schema}.${table}: ${error.message}`);
|
|
202
|
+
throw error;
|
|
203
|
+
}
|
|
161
204
|
}
|
|
162
205
|
}
|
|
163
206
|
exports.SchemaUtils = SchemaUtils;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-utils.js","sourceRoot":"","sources":["../../../src/scripts/data-migration/schema-utils.ts"],"names":[],"mappings":";;;AAAA,2CAAwC;AAGxC,MAAa,WAAW;IAGtB,YAA6B,
|
|
1
|
+
{"version":3,"file":"schema-utils.js","sourceRoot":"","sources":["../../../src/scripts/data-migration/schema-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -90,11 +90,18 @@ class TenantMigrator {
|
|
|
90
90
|
const bIndex = sortedTables.indexOf(b.name);
|
|
91
91
|
return aIndex - bIndex;
|
|
92
92
|
})
|
|
93
|
-
.filter(entity => sortedTables.includes(entity.name));
|
|
93
|
+
.filter((entity) => sortedTables.includes(entity.name));
|
|
94
94
|
this.logger.log(`Migration order: ${orderedEntities.map((e) => e.name).join(" -> ")}`);
|
|
95
95
|
this.logger.log(`Discovered ${entityTypes.length} entity types for migration`);
|
|
96
96
|
for (const entity of orderedEntities) {
|
|
97
|
-
await this.batchMigrator.migrateEntityDataInBatches(
|
|
97
|
+
await this.batchMigrator.migrateEntityDataInBatches("public", tenantId, {
|
|
98
|
+
type: "tenant",
|
|
99
|
+
idField: entity.idField,
|
|
100
|
+
sourceTable: entity.name,
|
|
101
|
+
targetTable: entity.name,
|
|
102
|
+
filterColumn: entity.filterColumn,
|
|
103
|
+
via: entity.filterVia,
|
|
104
|
+
}, providerId === null || providerId === void 0 ? void 0 : providerId.toString());
|
|
98
105
|
}
|
|
99
106
|
this.logger.log(`Completed migration for tenant ${tenantId}`);
|
|
100
107
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenant-migrator.js","sourceRoot":"","sources":["../../../src/scripts/data-migration/tenant-migrator.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tenant-migrator.js","sourceRoot":"","sources":["../../../src/scripts/data-migration/tenant-migrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import { ColumnSchema } from "./types";
|
|
2
1
|
export declare class TypecastManager {
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
private readonly prisma;
|
|
3
|
+
private readonly cache;
|
|
4
|
+
private readonly compatibilityMap;
|
|
5
|
+
getTypecastForColumn(tableName: string, columnName: string): Promise<string | undefined>;
|
|
6
|
+
private loadTableSchema;
|
|
7
|
+
areTypesCompatible(sourceType: string, targetType: string): boolean;
|
|
8
|
+
castValue(value: any, sourceType: string, targetType: string): any;
|
|
5
9
|
}
|
|
@@ -1,34 +1,178 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.TypecastManager = void 0;
|
|
4
|
+
const client_1 = require("@prisma/client");
|
|
4
5
|
class TypecastManager {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
6
|
+
constructor() {
|
|
7
|
+
this.prisma = new client_1.PrismaClient();
|
|
8
|
+
this.cache = new Map();
|
|
9
|
+
this.compatibilityMap = {
|
|
10
|
+
integer: ["bigint", "smallint", "numeric", "decimal"],
|
|
11
|
+
bigint: ["integer", "numeric", "decimal"],
|
|
12
|
+
smallint: ["integer", "bigint", "numeric", "decimal"],
|
|
13
|
+
numeric: [
|
|
14
|
+
"integer",
|
|
15
|
+
"bigint",
|
|
16
|
+
"smallint",
|
|
17
|
+
"decimal",
|
|
18
|
+
"real",
|
|
19
|
+
"double precision",
|
|
20
|
+
],
|
|
21
|
+
decimal: [
|
|
22
|
+
"numeric",
|
|
23
|
+
"integer",
|
|
24
|
+
"bigint",
|
|
25
|
+
"smallint",
|
|
26
|
+
"real",
|
|
27
|
+
"double precision",
|
|
28
|
+
],
|
|
29
|
+
real: ["numeric", "decimal", "double precision"],
|
|
30
|
+
"double precision": ["numeric", "decimal", "real"],
|
|
31
|
+
"character varying": ["text", "char", "varchar"],
|
|
32
|
+
varchar: ["text", "character varying", "char"],
|
|
33
|
+
char: ["text", "character varying", "varchar"],
|
|
34
|
+
text: ["character varying", "varchar", "char"],
|
|
35
|
+
timestamp: [
|
|
36
|
+
"timestamptz",
|
|
37
|
+
"timestamp without time zone",
|
|
38
|
+
"timestamp with time zone",
|
|
39
|
+
],
|
|
40
|
+
timestamptz: [
|
|
41
|
+
"timestamp",
|
|
42
|
+
"timestamp without time zone",
|
|
43
|
+
"timestamp with time zone",
|
|
44
|
+
],
|
|
45
|
+
date: ["timestamp", "timestamptz"],
|
|
46
|
+
boolean: ["bool"],
|
|
47
|
+
json: ["jsonb"],
|
|
48
|
+
jsonb: ["json"],
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
async getTypecastForColumn(tableName, columnName) {
|
|
52
|
+
if (!this.cache.has(tableName)) {
|
|
53
|
+
await this.loadTableSchema(tableName);
|
|
54
|
+
}
|
|
55
|
+
const tableSchema = this.cache.get(tableName);
|
|
56
|
+
return tableSchema === null || tableSchema === void 0 ? void 0 : tableSchema.get(columnName);
|
|
57
|
+
}
|
|
58
|
+
async loadTableSchema(tableName) {
|
|
59
|
+
const columns = await this.prisma.$queryRawUnsafe(`
|
|
60
|
+
SELECT column_name, data_type, udt_name, is_nullable
|
|
61
|
+
FROM information_schema.columns
|
|
62
|
+
WHERE table_name = '${tableName}'
|
|
63
|
+
`);
|
|
64
|
+
const tableSchema = new Map();
|
|
65
|
+
for (const column of columns) {
|
|
66
|
+
const { column_name, data_type, udt_name, is_nullable } = column;
|
|
67
|
+
let typecast;
|
|
68
|
+
switch (data_type.toLowerCase()) {
|
|
69
|
+
case "timestamp with time zone":
|
|
70
|
+
case "timestamp without time zone":
|
|
71
|
+
case "timestamptz":
|
|
72
|
+
typecast = "::timestamp with time zone";
|
|
73
|
+
break;
|
|
74
|
+
case "timestamp":
|
|
75
|
+
typecast = "::timestamp";
|
|
76
|
+
break;
|
|
77
|
+
case "integer":
|
|
78
|
+
typecast = "::integer";
|
|
79
|
+
break;
|
|
80
|
+
case "bigint":
|
|
81
|
+
typecast = "::bigint";
|
|
82
|
+
break;
|
|
83
|
+
case "boolean":
|
|
84
|
+
typecast = "::boolean";
|
|
85
|
+
break;
|
|
86
|
+
case "numeric":
|
|
87
|
+
case "decimal":
|
|
88
|
+
typecast = "::numeric";
|
|
89
|
+
break;
|
|
90
|
+
case "double precision":
|
|
91
|
+
typecast = "::double precision";
|
|
92
|
+
break;
|
|
93
|
+
case "text":
|
|
94
|
+
case "character varying":
|
|
95
|
+
case "varchar":
|
|
96
|
+
typecast = "::text";
|
|
97
|
+
break;
|
|
98
|
+
case "date":
|
|
99
|
+
typecast = "::date";
|
|
100
|
+
break;
|
|
101
|
+
case "time":
|
|
102
|
+
case "time without time zone":
|
|
103
|
+
typecast = "::time";
|
|
104
|
+
break;
|
|
105
|
+
case "time with time zone":
|
|
106
|
+
typecast = "::timetz";
|
|
107
|
+
break;
|
|
108
|
+
case "json":
|
|
109
|
+
typecast = "::json";
|
|
110
|
+
break;
|
|
111
|
+
case "jsonb":
|
|
112
|
+
typecast = "::jsonb";
|
|
113
|
+
break;
|
|
114
|
+
case "uuid":
|
|
115
|
+
typecast = "::uuid";
|
|
116
|
+
break;
|
|
117
|
+
default:
|
|
118
|
+
if (udt_name.startsWith("_")) {
|
|
119
|
+
typecast = `::${udt_name.substring(1)}[]`;
|
|
120
|
+
}
|
|
121
|
+
else if (udt_name.startsWith("enum_")) {
|
|
122
|
+
typecast = `::${udt_name}`;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
typecast = undefined;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
tableSchema.set(column_name, typecast);
|
|
129
|
+
}
|
|
130
|
+
this.cache.set(tableName, tableSchema);
|
|
131
|
+
}
|
|
132
|
+
areTypesCompatible(sourceType, targetType) {
|
|
133
|
+
if (sourceType.toLowerCase() === targetType.toLowerCase()) {
|
|
134
|
+
return true;
|
|
28
135
|
}
|
|
136
|
+
const compatibleTypes = this.compatibilityMap[sourceType.toLowerCase()] || [];
|
|
137
|
+
return compatibleTypes.includes(targetType.toLowerCase());
|
|
29
138
|
}
|
|
30
|
-
|
|
31
|
-
|
|
139
|
+
castValue(value, sourceType, targetType) {
|
|
140
|
+
if (value === null || value === undefined) {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
try {
|
|
144
|
+
switch (targetType.toLowerCase()) {
|
|
145
|
+
case "integer":
|
|
146
|
+
case "bigint":
|
|
147
|
+
case "smallint":
|
|
148
|
+
return parseInt(value, 10);
|
|
149
|
+
case "numeric":
|
|
150
|
+
case "decimal":
|
|
151
|
+
case "real":
|
|
152
|
+
case "double precision":
|
|
153
|
+
return parseFloat(value);
|
|
154
|
+
case "boolean":
|
|
155
|
+
return Boolean(value);
|
|
156
|
+
case "json":
|
|
157
|
+
case "jsonb":
|
|
158
|
+
return typeof value === "string" ? JSON.parse(value) : value;
|
|
159
|
+
case "timestamp":
|
|
160
|
+
case "timestamptz":
|
|
161
|
+
return new Date(value).toISOString();
|
|
162
|
+
case "date":
|
|
163
|
+
return new Date(value).toISOString().split("T")[0];
|
|
164
|
+
case "text":
|
|
165
|
+
case "character varying":
|
|
166
|
+
case "varchar":
|
|
167
|
+
case "char":
|
|
168
|
+
return String(value);
|
|
169
|
+
default:
|
|
170
|
+
return value;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
throw new Error(`Error al convertir valor "${value}" de ${sourceType} a ${targetType}: ${error.message}`);
|
|
175
|
+
}
|
|
32
176
|
}
|
|
33
177
|
}
|
|
34
178
|
exports.TypecastManager = TypecastManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typecast-manager.js","sourceRoot":"","sources":["../../../src/scripts/data-migration/typecast-manager.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"typecast-manager.js","sourceRoot":"","sources":["../../../src/scripts/data-migration/typecast-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
import { Pool } from "pg";
|
|
2
2
|
import { PrismaClient } from "@prisma/client";
|
|
3
|
+
export interface DatabaseConnection {
|
|
4
|
+
pool?: Pool;
|
|
5
|
+
prisma?: PrismaClient;
|
|
6
|
+
query: (sql: string, params?: any[]) => Promise<any>;
|
|
7
|
+
sourceId: string;
|
|
8
|
+
}
|
|
3
9
|
export interface DatabaseConnections {
|
|
4
|
-
|
|
10
|
+
sourceConnections?: DatabaseConnection[];
|
|
11
|
+
sourcePool?: Pool;
|
|
5
12
|
targetPool: Pool;
|
|
6
|
-
sourcePrisma: PrismaClient;
|
|
7
13
|
targetPrisma: PrismaClient;
|
|
14
|
+
sourcePrisma?: PrismaClient;
|
|
8
15
|
}
|
|
9
16
|
export interface ColumnSchema {
|
|
10
17
|
table_name: string;
|
|
@@ -32,3 +39,62 @@ export interface EnumCastValue {
|
|
|
32
39
|
value: any;
|
|
33
40
|
enumType: string;
|
|
34
41
|
}
|
|
42
|
+
export interface MigrationOptions {
|
|
43
|
+
publicOnly?: boolean;
|
|
44
|
+
multiTenant?: boolean;
|
|
45
|
+
sourceSchema?: string;
|
|
46
|
+
targetSchema?: string;
|
|
47
|
+
forceSingleTenant?: boolean;
|
|
48
|
+
configPath?: string;
|
|
49
|
+
batchSize?: number;
|
|
50
|
+
retryAttempts?: number;
|
|
51
|
+
validateData?: boolean;
|
|
52
|
+
logLevel?: "debug" | "info" | "warn" | "error";
|
|
53
|
+
}
|
|
54
|
+
export interface ColumnConfig {
|
|
55
|
+
sourceColumn?: string;
|
|
56
|
+
targetColumn?: string;
|
|
57
|
+
type?: string;
|
|
58
|
+
nullable?: boolean;
|
|
59
|
+
defaultValue?: any;
|
|
60
|
+
transform?: (value: any) => any;
|
|
61
|
+
}
|
|
62
|
+
export interface TableConfig {
|
|
63
|
+
type: "public" | "filteredPublic" | "tenantInfo" | "tenant";
|
|
64
|
+
idField: string;
|
|
65
|
+
filterColumn?: string;
|
|
66
|
+
via?: string;
|
|
67
|
+
providerLink?: string;
|
|
68
|
+
tenantKey?: string;
|
|
69
|
+
dependencies?: string[];
|
|
70
|
+
sourceTable?: string;
|
|
71
|
+
targetTable?: string;
|
|
72
|
+
columns?: Record<string, ColumnConfig>;
|
|
73
|
+
skipIfExists?: boolean;
|
|
74
|
+
batchSize?: number;
|
|
75
|
+
}
|
|
76
|
+
export interface ExtendedTableConfig extends TableConfig {
|
|
77
|
+
processed?: boolean;
|
|
78
|
+
retryCount?: number;
|
|
79
|
+
lastError?: Error;
|
|
80
|
+
}
|
|
81
|
+
export interface ExtendedMigrationConfig {
|
|
82
|
+
tables: Record<string, ExtendedTableConfig>;
|
|
83
|
+
version: string;
|
|
84
|
+
sourceSchema?: string;
|
|
85
|
+
targetSchema?: string;
|
|
86
|
+
}
|
|
87
|
+
export interface MigrationConfig {
|
|
88
|
+
commonSchema: string;
|
|
89
|
+
tables: Record<string, TableConfig>;
|
|
90
|
+
tenantInfo: {
|
|
91
|
+
sourceTable: string;
|
|
92
|
+
tenantIdColumn: string;
|
|
93
|
+
providerIdColumn: string;
|
|
94
|
+
};
|
|
95
|
+
migrationPriorities?: {
|
|
96
|
+
high?: string[];
|
|
97
|
+
medium?: string[];
|
|
98
|
+
low?: string[];
|
|
99
|
+
};
|
|
100
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare class TableIndexFixer {
|
|
2
|
+
private readonly targetUrl;
|
|
3
|
+
private readonly logger;
|
|
4
|
+
private readonly targetPool;
|
|
5
|
+
private readonly logDir;
|
|
6
|
+
private readonly logPath;
|
|
7
|
+
private fixedIndexes;
|
|
8
|
+
constructor(targetUrl?: string);
|
|
9
|
+
fixIndexes(): Promise<void>;
|
|
10
|
+
private getSchemas;
|
|
11
|
+
private fixIndexesForSchema;
|
|
12
|
+
private getTablesForSchema;
|
|
13
|
+
private fixIndexesForTable;
|
|
14
|
+
private ensureCriticalUserTableIndexes;
|
|
15
|
+
private fixUserTableSequences;
|
|
16
|
+
private removeRedundantIndexes;
|
|
17
|
+
private fixSequences;
|
|
18
|
+
private getTableInfo;
|
|
19
|
+
private getTableIndexes;
|
|
20
|
+
private createIndex;
|
|
21
|
+
private fixCommonIndexIssues;
|
|
22
|
+
private getTableColumns;
|
|
23
|
+
private fixForeignKeyIndexes;
|
|
24
|
+
private saveFixLog;
|
|
25
|
+
private cleanup;
|
|
26
|
+
}
|