@javalabs/prisma-client 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/README.md +220 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/prisma-factory.service.d.ts +9 -0
- package/dist/prisma-factory.service.js +47 -0
- package/dist/prisma-factory.service.js.map +1 -0
- package/dist/prisma.module.d.ts +2 -0
- package/dist/prisma.module.js +23 -0
- package/dist/prisma.module.js.map +1 -0
- package/dist/prisma.service.d.ts +6 -0
- package/dist/prisma.service.js +27 -0
- package/dist/prisma.service.js.map +1 -0
- package/dist/scripts/create-tenant-schemas.d.ts +1 -0
- package/dist/scripts/create-tenant-schemas.js +117 -0
- package/dist/scripts/create-tenant-schemas.js.map +1 -0
- package/dist/scripts/data-migration/batch-migrator.d.ts +25 -0
- package/dist/scripts/data-migration/batch-migrator.js +333 -0
- package/dist/scripts/data-migration/batch-migrator.js.map +1 -0
- package/dist/scripts/data-migration/data-transformer.d.ts +17 -0
- package/dist/scripts/data-migration/data-transformer.js +242 -0
- package/dist/scripts/data-migration/data-transformer.js.map +1 -0
- package/dist/scripts/data-migration/db-connector.d.ts +7 -0
- package/dist/scripts/data-migration/db-connector.js +58 -0
- package/dist/scripts/data-migration/db-connector.js.map +1 -0
- package/dist/scripts/data-migration/dependency-manager.d.ts +9 -0
- package/dist/scripts/data-migration/dependency-manager.js +86 -0
- package/dist/scripts/data-migration/dependency-manager.js.map +1 -0
- package/dist/scripts/data-migration/dependency-resolver.d.ts +18 -0
- package/dist/scripts/data-migration/dependency-resolver.js +251 -0
- package/dist/scripts/data-migration/dependency-resolver.js.map +1 -0
- package/dist/scripts/data-migration/entity-discovery.d.ts +11 -0
- package/dist/scripts/data-migration/entity-discovery.js +152 -0
- package/dist/scripts/data-migration/entity-discovery.js.map +1 -0
- package/dist/scripts/data-migration/foreign-key-manager.d.ts +17 -0
- package/dist/scripts/data-migration/foreign-key-manager.js +70 -0
- package/dist/scripts/data-migration/foreign-key-manager.js.map +1 -0
- package/dist/scripts/data-migration/migration-phases.d.ts +5 -0
- package/dist/scripts/data-migration/migration-phases.js +55 -0
- package/dist/scripts/data-migration/migration-phases.js.map +1 -0
- package/dist/scripts/data-migration/migration-tool.d.ts +29 -0
- package/dist/scripts/data-migration/migration-tool.js +250 -0
- package/dist/scripts/data-migration/migration-tool.js.map +1 -0
- package/dist/scripts/data-migration/phase-generator.d.ts +15 -0
- package/dist/scripts/data-migration/phase-generator.js +187 -0
- package/dist/scripts/data-migration/phase-generator.js.map +1 -0
- package/dist/scripts/data-migration/schema-utils.d.ts +18 -0
- package/dist/scripts/data-migration/schema-utils.js +164 -0
- package/dist/scripts/data-migration/schema-utils.js.map +1 -0
- package/dist/scripts/data-migration/tenant-migrator.d.ts +15 -0
- package/dist/scripts/data-migration/tenant-migrator.js +110 -0
- package/dist/scripts/data-migration/tenant-migrator.js.map +1 -0
- package/dist/scripts/data-migration/typecast-manager.d.ts +5 -0
- package/dist/scripts/data-migration/typecast-manager.js +35 -0
- package/dist/scripts/data-migration/typecast-manager.js.map +1 -0
- package/dist/scripts/data-migration/types.d.ts +34 -0
- package/dist/scripts/data-migration/types.js +3 -0
- package/dist/scripts/data-migration/types.js.map +1 -0
- package/dist/scripts/data-migration.d.ts +22 -0
- package/dist/scripts/data-migration.js +593 -0
- package/dist/scripts/data-migration.js.map +1 -0
- package/dist/scripts/drop-database.d.ts +10 -0
- package/dist/scripts/drop-database.js +81 -0
- package/dist/scripts/drop-database.js.map +1 -0
- package/dist/scripts/error-handler.d.ts +12 -0
- package/dist/scripts/error-handler.js +82 -0
- package/dist/scripts/error-handler.js.map +1 -0
- package/dist/scripts/fix-data-types.d.ts +10 -0
- package/dist/scripts/fix-data-types.js +185 -0
- package/dist/scripts/fix-data-types.js.map +1 -0
- package/dist/scripts/fix-enum-values.d.ts +17 -0
- package/dist/scripts/fix-enum-values.js +234 -0
- package/dist/scripts/fix-enum-values.js.map +1 -0
- package/dist/scripts/fix-schema-discrepancies.d.ts +21 -0
- package/dist/scripts/fix-schema-discrepancies.js +240 -0
- package/dist/scripts/fix-schema-discrepancies.js.map +1 -0
- package/dist/scripts/migrate-schema-structure.d.ts +1 -0
- package/dist/scripts/migrate-schema-structure.js +76 -0
- package/dist/scripts/migrate-schema-structure.js.map +1 -0
- package/dist/scripts/post-migration-validator.d.ts +21 -0
- package/dist/scripts/post-migration-validator.js +341 -0
- package/dist/scripts/post-migration-validator.js.map +1 -0
- package/dist/scripts/pre-migration-validator.d.ts +25 -0
- package/dist/scripts/pre-migration-validator.js +491 -0
- package/dist/scripts/pre-migration-validator.js.map +1 -0
- package/dist/scripts/reset-database.d.ts +17 -0
- package/dist/scripts/reset-database.js +202 -0
- package/dist/scripts/reset-database.js.map +1 -0
- package/dist/scripts/retry-failed-migrations.d.ts +14 -0
- package/dist/scripts/retry-failed-migrations.js +301 -0
- package/dist/scripts/retry-failed-migrations.js.map +1 -0
- package/dist/scripts/run-migration.d.ts +1 -0
- package/dist/scripts/run-migration.js +525 -0
- package/dist/scripts/run-migration.js.map +1 -0
- package/dist/scripts/schema-sync.d.ts +1 -0
- package/dist/scripts/schema-sync.js +85 -0
- package/dist/scripts/schema-sync.js.map +1 -0
- package/dist/scripts/sync-enum-types.d.ts +13 -0
- package/dist/scripts/sync-enum-types.js +139 -0
- package/dist/scripts/sync-enum-types.js.map +1 -0
- package/dist/scripts/sync-enum-values.d.ts +20 -0
- package/dist/scripts/sync-enum-values.js +336 -0
- package/dist/scripts/sync-enum-values.js.map +1 -0
- package/dist/scripts/truncate-database.d.ts +10 -0
- package/dist/scripts/truncate-database.js +100 -0
- package/dist/scripts/truncate-database.js.map +1 -0
- package/dist/scripts/verify-migration-setup.d.ts +11 -0
- package/dist/scripts/verify-migration-setup.js +120 -0
- package/dist/scripts/verify-migration-setup.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/migration-config-public.json +95 -0
- package/migration-config.json +95 -0
- package/package.json +33 -0
- package/prisma/migrations/migration_lock.toml +3 -0
- package/prisma/schema.prisma +360 -0
- package/src/index.ts +23 -0
- package/src/prisma-factory.service.ts +41 -0
- package/src/prisma.module.ts +10 -0
- package/src/prisma.service.ts +17 -0
- package/src/scripts/create-tenant-schemas.ts +146 -0
- package/src/scripts/data-migration/batch-migrator.ts +569 -0
- package/src/scripts/data-migration/data-transformer.ts +377 -0
- package/src/scripts/data-migration/db-connector.ts +67 -0
- package/src/scripts/data-migration/dependency-resolver.ts +319 -0
- package/src/scripts/data-migration/entity-discovery.ts +197 -0
- package/src/scripts/data-migration/foreign-key-manager.ts +95 -0
- package/src/scripts/data-migration/migration-tool.ts +357 -0
- package/src/scripts/data-migration/schema-utils.ts +186 -0
- package/src/scripts/data-migration/tenant-migrator.ts +194 -0
- package/src/scripts/data-migration/typecast-manager.ts +38 -0
- package/src/scripts/data-migration/types.ts +40 -0
- package/src/scripts/drop-database.ts +105 -0
- package/src/scripts/dump-source-db.sh +62 -0
- package/src/scripts/dumps/source_dump_20250413_112626.sql +1527 -0
- package/src/scripts/error-handler.ts +118 -0
- package/src/scripts/fix-data-types.ts +242 -0
- package/src/scripts/fix-enum-values.ts +357 -0
- package/src/scripts/fix-schema-discrepancies.ts +318 -0
- package/src/scripts/migrate-schema-structure.ts +90 -0
- package/src/scripts/post-migration-validator.ts +427 -0
- package/src/scripts/pre-migration-validator.ts +611 -0
- package/src/scripts/reset-database.ts +264 -0
- package/src/scripts/retry-failed-migrations.ts +416 -0
- package/src/scripts/run-migration.ts +691 -0
- package/src/scripts/schema-sync.ts +129 -0
- package/src/scripts/sync-enum-types.ts +171 -0
- package/src/scripts/sync-enum-values.ts +563 -0
- package/src/scripts/truncate-database.ts +124 -0
- package/src/scripts/verify-migration-setup.ts +136 -0
- package/tsconfig.json +18 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { Logger } from "@nestjs/common";
|
|
2
|
+
import { DatabaseConnector } from "./data-migration/db-connector";
|
|
3
|
+
import * as fs from "fs";
|
|
4
|
+
import * as path from "path";
|
|
5
|
+
|
|
6
|
+
async function main() {
|
|
7
|
+
const logger = new Logger("SchemaSyncTool");
|
|
8
|
+
logger.log("Starting schema synchronization");
|
|
9
|
+
|
|
10
|
+
// Crear conexiones a las bases de datos
|
|
11
|
+
const connections = DatabaseConnector.createConnections();
|
|
12
|
+
|
|
13
|
+
try {
|
|
14
|
+
// Obtener todas las tablas de la base de datos origen
|
|
15
|
+
const sourceTables = await getTablesFromDatabase(connections.sourcePool);
|
|
16
|
+
logger.log(`Found ${sourceTables.length} tables in source database`);
|
|
17
|
+
|
|
18
|
+
// Obtener todas las tablas de la base de datos destino
|
|
19
|
+
const targetTables = await getTablesFromDatabase(connections.targetPool);
|
|
20
|
+
logger.log(`Found ${targetTables.length} tables in target database`);
|
|
21
|
+
|
|
22
|
+
// Comparar esquemas y generar SQL para sincronizar
|
|
23
|
+
const syncScript = await generateSyncScript(
|
|
24
|
+
connections.sourcePool,
|
|
25
|
+
connections.targetPool,
|
|
26
|
+
sourceTables,
|
|
27
|
+
targetTables
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
// Guardar el script SQL
|
|
31
|
+
const timestamp = new Date().toISOString().replace(/:/g, "-").split(".")[0];
|
|
32
|
+
const filePath = path.join(
|
|
33
|
+
process.cwd(),
|
|
34
|
+
`schema-sync-${timestamp}.sql`
|
|
35
|
+
);
|
|
36
|
+
fs.writeFileSync(filePath, syncScript);
|
|
37
|
+
|
|
38
|
+
logger.log(`Schema synchronization script saved to ${filePath}`);
|
|
39
|
+
logger.log("Review the script and execute it manually to synchronize schemas");
|
|
40
|
+
|
|
41
|
+
} catch (error) {
|
|
42
|
+
logger.error(`Error in schema synchronization: ${error.message}`, error.stack);
|
|
43
|
+
} finally {
|
|
44
|
+
// Cerrar conexiones
|
|
45
|
+
await DatabaseConnector.cleanup(connections);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async function getTablesFromDatabase(pool: any): Promise<string[]> {
|
|
50
|
+
const query = `
|
|
51
|
+
SELECT table_name
|
|
52
|
+
FROM information_schema.tables
|
|
53
|
+
WHERE table_schema = 'public'
|
|
54
|
+
AND table_type = 'BASE TABLE'
|
|
55
|
+
`;
|
|
56
|
+
|
|
57
|
+
const result = await pool.query(query);
|
|
58
|
+
return result.rows.map(row => row.table_name);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async function generateSyncScript(
|
|
62
|
+
sourcePool: any,
|
|
63
|
+
targetPool: any,
|
|
64
|
+
sourceTables: string[],
|
|
65
|
+
targetTables: string[]
|
|
66
|
+
): Promise<string> {
|
|
67
|
+
let script = "-- Schema synchronization script\n\n";
|
|
68
|
+
|
|
69
|
+
// Procesar cada tabla de la fuente
|
|
70
|
+
for (const table of sourceTables) {
|
|
71
|
+
// Obtener columnas de la tabla fuente
|
|
72
|
+
const sourceColumns = await getTableColumns(sourcePool, table);
|
|
73
|
+
|
|
74
|
+
if (targetTables.includes(table)) {
|
|
75
|
+
// La tabla existe en ambas bases de datos, comparar columnas
|
|
76
|
+
const targetColumns = await getTableColumns(targetPool, table);
|
|
77
|
+
|
|
78
|
+
// Encontrar columnas que faltan en el destino
|
|
79
|
+
const missingColumns = sourceColumns.filter(
|
|
80
|
+
sourceCol => !targetColumns.some(targetCol => targetCol.column_name === sourceCol.column_name)
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
// Generar SQL para agregar columnas faltantes
|
|
84
|
+
for (const column of missingColumns) {
|
|
85
|
+
script += `-- Adding missing column ${column.column_name} to table ${table}\n`;
|
|
86
|
+
script += `ALTER TABLE "${table}" ADD COLUMN "${column.column_name}" ${column.data_type}`;
|
|
87
|
+
|
|
88
|
+
// Agregar restricciones si es necesario
|
|
89
|
+
if (column.is_nullable === 'NO') {
|
|
90
|
+
script += " NOT NULL";
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
script += ";\n\n";
|
|
94
|
+
}
|
|
95
|
+
} else {
|
|
96
|
+
// La tabla no existe en el destino, generar SQL para crearla
|
|
97
|
+
script += `-- Table ${table} does not exist in target database\n`;
|
|
98
|
+
script += `-- Consider running a full schema migration instead\n\n`;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return script;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
async function getTableColumns(pool: any, table: string): Promise<any[]> {
|
|
106
|
+
const query = `
|
|
107
|
+
SELECT
|
|
108
|
+
column_name,
|
|
109
|
+
data_type,
|
|
110
|
+
is_nullable,
|
|
111
|
+
column_default
|
|
112
|
+
FROM
|
|
113
|
+
information_schema.columns
|
|
114
|
+
WHERE
|
|
115
|
+
table_schema = 'public'
|
|
116
|
+
AND table_name = $1
|
|
117
|
+
ORDER BY
|
|
118
|
+
ordinal_position
|
|
119
|
+
`;
|
|
120
|
+
|
|
121
|
+
const result = await pool.query(query, [table]);
|
|
122
|
+
return result.rows;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Ejecutar el script
|
|
126
|
+
main().catch(e => {
|
|
127
|
+
console.error(e);
|
|
128
|
+
process.exit(1);
|
|
129
|
+
});
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import * as pg from 'pg';
|
|
2
|
+
import * as dotenv from 'dotenv';
|
|
3
|
+
import { Logger } from '@nestjs/common';
|
|
4
|
+
|
|
5
|
+
dotenv.config();
|
|
6
|
+
|
|
7
|
+
export class EnumSynchronizer {
|
|
8
|
+
private readonly logger = new Logger('EnumSynchronizer');
|
|
9
|
+
private readonly sourcePool: pg.Pool;
|
|
10
|
+
private readonly targetPool: pg.Pool;
|
|
11
|
+
|
|
12
|
+
constructor(
|
|
13
|
+
private readonly sourceUrl: string = process.env.SOURCE_DATABASE_URL,
|
|
14
|
+
private readonly targetUrl: string = process.env.DATABASE_URL
|
|
15
|
+
) {
|
|
16
|
+
this.sourcePool = new pg.Pool({
|
|
17
|
+
connectionString: this.sourceUrl,
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
this.targetPool = new pg.Pool({
|
|
21
|
+
connectionString: this.targetUrl,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async synchronizeEnums() {
|
|
26
|
+
try {
|
|
27
|
+
this.logger.log('Starting enum synchronization');
|
|
28
|
+
|
|
29
|
+
// Obtener todos los tipos enum en la base de datos de origen
|
|
30
|
+
const sourceEnumsResult = await this.sourcePool.query(`
|
|
31
|
+
SELECT t.typname AS enum_name
|
|
32
|
+
FROM pg_type t
|
|
33
|
+
JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
|
|
34
|
+
WHERE t.typtype = 'e'
|
|
35
|
+
AND n.nspname = 'public'
|
|
36
|
+
`);
|
|
37
|
+
|
|
38
|
+
this.logger.log(`Found ${sourceEnumsResult.rows.length} enum types in source database`);
|
|
39
|
+
|
|
40
|
+
// Para cada tipo enum, sincronizar sus valores
|
|
41
|
+
for (const enumRow of sourceEnumsResult.rows) {
|
|
42
|
+
const enumName = enumRow.enum_name;
|
|
43
|
+
await this.synchronizeEnumType(enumName);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
this.logger.log('Enum synchronization completed successfully');
|
|
47
|
+
} catch (error) {
|
|
48
|
+
this.logger.error(`Error during enum synchronization: ${error.message}`, error.stack);
|
|
49
|
+
} finally {
|
|
50
|
+
await this.cleanup();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
private async synchronizeEnumType(enumName: string) {
|
|
55
|
+
this.logger.log(`Synchronizing enum type: ${enumName}`);
|
|
56
|
+
|
|
57
|
+
try {
|
|
58
|
+
// Obtener valores del enum en la base de datos de origen
|
|
59
|
+
const sourceEnumValuesResult = await this.sourcePool.query(`
|
|
60
|
+
SELECT e.enumlabel
|
|
61
|
+
FROM pg_enum e
|
|
62
|
+
JOIN pg_type t ON e.enumtypid = t.oid
|
|
63
|
+
WHERE t.typname = $1
|
|
64
|
+
ORDER BY e.enumsortorder
|
|
65
|
+
`, [enumName]);
|
|
66
|
+
|
|
67
|
+
const sourceEnumValues = sourceEnumValuesResult.rows.map(row => row.enumlabel);
|
|
68
|
+
this.logger.log(`Source enum ${enumName} has values: ${sourceEnumValues.join(', ')}`);
|
|
69
|
+
|
|
70
|
+
// Verificar si el enum existe en la base de datos de destino
|
|
71
|
+
const targetEnumExistsResult = await this.targetPool.query(`
|
|
72
|
+
SELECT 1
|
|
73
|
+
FROM pg_type t
|
|
74
|
+
JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
|
|
75
|
+
WHERE t.typtype = 'e'
|
|
76
|
+
AND t.typname = $1
|
|
77
|
+
AND n.nspname = 'public'
|
|
78
|
+
LIMIT 1
|
|
79
|
+
`, [enumName]);
|
|
80
|
+
|
|
81
|
+
if (targetEnumExistsResult.rows.length === 0) {
|
|
82
|
+
// Si el enum no existe en el destino, crearlo
|
|
83
|
+
await this.createEnumType(enumName, sourceEnumValues);
|
|
84
|
+
} else {
|
|
85
|
+
// Si el enum existe, actualizar sus valores
|
|
86
|
+
await this.updateEnumValues(enumName, sourceEnumValues);
|
|
87
|
+
}
|
|
88
|
+
} catch (error) {
|
|
89
|
+
this.logger.error(`Error synchronizing enum type ${enumName}: ${error.message}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
private async createEnumType(enumName: string, values: string[]) {
|
|
94
|
+
this.logger.log(`Creating enum type ${enumName} in target database`);
|
|
95
|
+
|
|
96
|
+
try {
|
|
97
|
+
// Escapar los valores para la consulta SQL
|
|
98
|
+
const escapedValues = values.map(value => `'${value.replace(/'/g, "''")}'`).join(', ');
|
|
99
|
+
|
|
100
|
+
// Crear el tipo enum
|
|
101
|
+
await this.targetPool.query(`
|
|
102
|
+
CREATE TYPE ${enumName} AS ENUM (${escapedValues})
|
|
103
|
+
`);
|
|
104
|
+
|
|
105
|
+
this.logger.log(`Successfully created enum type ${enumName} with values: ${values.join(', ')}`);
|
|
106
|
+
} catch (error) {
|
|
107
|
+
this.logger.error(`Error creating enum type ${enumName}: ${error.message}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
private async updateEnumValues(enumName: string, sourceValues: string[]) {
|
|
112
|
+
this.logger.log(`Updating enum type ${enumName} in target database`);
|
|
113
|
+
|
|
114
|
+
try {
|
|
115
|
+
// Obtener valores actuales del enum en la base de datos de destino
|
|
116
|
+
const targetEnumValuesResult = await this.targetPool.query(`
|
|
117
|
+
SELECT e.enumlabel
|
|
118
|
+
FROM pg_enum e
|
|
119
|
+
JOIN pg_type t ON e.enumtypid = t.oid
|
|
120
|
+
WHERE t.typname = $1
|
|
121
|
+
ORDER BY e.enumsortorder
|
|
122
|
+
`, [enumName]);
|
|
123
|
+
|
|
124
|
+
const targetEnumValues = targetEnumValuesResult.rows.map(row => row.enumlabel);
|
|
125
|
+
this.logger.log(`Target enum ${enumName} has values: ${targetEnumValues.join(', ')}`);
|
|
126
|
+
|
|
127
|
+
// Encontrar valores que están en el origen pero no en el destino
|
|
128
|
+
const missingValues = sourceValues.filter(value => !targetEnumValues.includes(value));
|
|
129
|
+
|
|
130
|
+
if (missingValues.length === 0) {
|
|
131
|
+
this.logger.log(`Enum type ${enumName} is already up to date`);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
this.logger.log(`Adding ${missingValues.length} new values to enum ${enumName}: ${missingValues.join(', ')}`);
|
|
136
|
+
|
|
137
|
+
// Agregar los valores faltantes al enum
|
|
138
|
+
for (const value of missingValues) {
|
|
139
|
+
await this.targetPool.query(`
|
|
140
|
+
ALTER TYPE ${enumName} ADD VALUE '${value.replace(/'/g, "''")}'
|
|
141
|
+
`);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
this.logger.log(`Successfully updated enum type ${enumName}`);
|
|
145
|
+
} catch (error) {
|
|
146
|
+
this.logger.error(`Error updating enum type ${enumName}: ${error.message}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
private async cleanup() {
|
|
151
|
+
this.logger.log('Cleaning up database connections');
|
|
152
|
+
await this.sourcePool.end();
|
|
153
|
+
await this.targetPool.end();
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Script para ejecutar desde línea de comandos
|
|
158
|
+
if (require.main === module) {
|
|
159
|
+
const run = async () => {
|
|
160
|
+
try {
|
|
161
|
+
const synchronizer = new EnumSynchronizer();
|
|
162
|
+
await synchronizer.synchronizeEnums();
|
|
163
|
+
process.exit(0);
|
|
164
|
+
} catch (error) {
|
|
165
|
+
console.error('Error:', error.message);
|
|
166
|
+
process.exit(1);
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
run();
|
|
171
|
+
}
|