@javalabs/prisma-client 1.0.18 → 1.0.20

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.
Files changed (101) hide show
  1. package/.github/CODEOWNERS +1 -0
  2. package/README.md +269 -269
  3. package/dist/index.d.ts +1 -1
  4. package/dist/prisma.service.d.ts +1 -1
  5. package/dist/scripts/add-uuid-to-table.js +32 -32
  6. package/dist/scripts/data-migration/batch-migrator.js +12 -12
  7. package/dist/scripts/data-migration/data-transformer.js +14 -14
  8. package/dist/scripts/data-migration/dependency-resolver.js +23 -23
  9. package/dist/scripts/data-migration/entity-discovery.js +68 -68
  10. package/dist/scripts/data-migration/foreign-key-manager.js +23 -23
  11. package/dist/scripts/data-migration/migration-tool.js +5 -5
  12. package/dist/scripts/data-migration/schema-utils.js +74 -74
  13. package/dist/scripts/data-migration/typecast-manager.js +4 -4
  14. package/dist/scripts/database-initializer.js +5 -5
  15. package/dist/scripts/drop-database.js +5 -5
  16. package/dist/scripts/fix-data-types.js +53 -53
  17. package/dist/scripts/fix-enum-values.js +34 -34
  18. package/dist/scripts/fix-schema-discrepancies.js +40 -40
  19. package/dist/scripts/fix-table-indexes.js +81 -81
  20. package/dist/scripts/migrate-schema-structure.js +4 -4
  21. package/dist/scripts/migrate-uuid.js +19 -19
  22. package/dist/scripts/post-migration-validator.js +49 -49
  23. package/dist/scripts/pre-migration-validator.js +107 -107
  24. package/dist/scripts/reset-database.js +21 -21
  25. package/dist/scripts/retry-failed-migrations.js +28 -28
  26. package/dist/scripts/run-migration.js +5 -5
  27. package/dist/scripts/schema-sync.js +18 -18
  28. package/dist/scripts/sequence-sync-cli.js +55 -55
  29. package/dist/scripts/sequence-synchronizer.js +20 -20
  30. package/dist/scripts/sync-enum-types.js +30 -30
  31. package/dist/scripts/sync-enum-values.js +52 -52
  32. package/dist/scripts/truncate-database.js +10 -10
  33. package/dist/scripts/verify-migration-setup.js +10 -10
  34. package/dist/tsconfig.tsbuildinfo +1 -1
  35. package/migration-config.json +63 -63
  36. package/migration-config.json.bk +95 -95
  37. package/migrations/add_reserved_amount.sql +8 -0
  38. package/package.json +44 -44
  39. package/prisma/migrations/add_uuid_to_transactions.sql +13 -13
  40. package/prisma/schema.prisma +601 -554
  41. package/src/index.ts +23 -23
  42. package/src/prisma-factory.service.ts +40 -40
  43. package/src/prisma.module.ts +9 -9
  44. package/src/prisma.service.ts +16 -16
  45. package/src/scripts/add-uuid-to-table.ts +138 -138
  46. package/src/scripts/create-tenant-schemas.ts +145 -145
  47. package/src/scripts/data-migration/batch-migrator.ts +248 -248
  48. package/src/scripts/data-migration/data-transformer.ts +426 -426
  49. package/src/scripts/data-migration/db-connector.ts +120 -120
  50. package/src/scripts/data-migration/dependency-resolver.ts +174 -174
  51. package/src/scripts/data-migration/entity-discovery.ts +196 -196
  52. package/src/scripts/data-migration/foreign-key-manager.ts +277 -277
  53. package/src/scripts/data-migration/migration-config.json +63 -63
  54. package/src/scripts/data-migration/migration-tool.ts +509 -509
  55. package/src/scripts/data-migration/schema-utils.ts +248 -248
  56. package/src/scripts/data-migration/tenant-migrator.ts +201 -201
  57. package/src/scripts/data-migration/typecast-manager.ts +193 -193
  58. package/src/scripts/data-migration/types.ts +113 -113
  59. package/src/scripts/database-initializer.ts +49 -49
  60. package/src/scripts/drop-database.ts +104 -104
  61. package/src/scripts/dump-source-db.sh +61 -61
  62. package/src/scripts/encrypt-user-passwords.ts +36 -36
  63. package/src/scripts/error-handler.ts +117 -117
  64. package/src/scripts/fix-data-types.ts +241 -241
  65. package/src/scripts/fix-enum-values.ts +357 -357
  66. package/src/scripts/fix-schema-discrepancies.ts +317 -317
  67. package/src/scripts/fix-table-indexes.ts +601 -601
  68. package/src/scripts/migrate-schema-structure.ts +90 -90
  69. package/src/scripts/migrate-uuid.ts +76 -76
  70. package/src/scripts/post-migration-validator.ts +526 -526
  71. package/src/scripts/pre-migration-validator.ts +610 -610
  72. package/src/scripts/reset-database.ts +263 -263
  73. package/src/scripts/retry-failed-migrations.ts +416 -416
  74. package/src/scripts/run-migration.ts +707 -707
  75. package/src/scripts/schema-sync.ts +128 -128
  76. package/src/scripts/sequence-sync-cli.ts +416 -416
  77. package/src/scripts/sequence-synchronizer.ts +127 -127
  78. package/src/scripts/sync-enum-types.ts +170 -170
  79. package/src/scripts/sync-enum-values.ts +563 -563
  80. package/src/scripts/truncate-database.ts +123 -123
  81. package/src/scripts/verify-migration-setup.ts +135 -135
  82. package/tsconfig.json +17 -17
  83. package/dist/scripts/data-migration/dependency-manager.d.ts +0 -9
  84. package/dist/scripts/data-migration/dependency-manager.js +0 -86
  85. package/dist/scripts/data-migration/dependency-manager.js.map +0 -1
  86. package/dist/scripts/data-migration/migration-config.json +0 -63
  87. package/dist/scripts/data-migration/migration-phases.d.ts +0 -5
  88. package/dist/scripts/data-migration/migration-phases.js +0 -55
  89. package/dist/scripts/data-migration/migration-phases.js.map +0 -1
  90. package/dist/scripts/data-migration/multi-source-migrator.d.ts +0 -17
  91. package/dist/scripts/data-migration/multi-source-migrator.js +0 -130
  92. package/dist/scripts/data-migration/multi-source-migrator.js.map +0 -1
  93. package/dist/scripts/data-migration/phase-generator.d.ts +0 -15
  94. package/dist/scripts/data-migration/phase-generator.js +0 -187
  95. package/dist/scripts/data-migration/phase-generator.js.map +0 -1
  96. package/dist/scripts/data-migration.d.ts +0 -22
  97. package/dist/scripts/data-migration.js +0 -593
  98. package/dist/scripts/data-migration.js.map +0 -1
  99. package/dist/scripts/multi-db-migration.d.ts +0 -1
  100. package/dist/scripts/multi-db-migration.js +0 -55
  101. package/dist/scripts/multi-db-migration.js.map +0 -1
@@ -64,13 +64,13 @@ class BatchMigrator {
64
64
  }
65
65
  }
66
66
  async fetchBatch(sourceSchema, tableConfig, offset, limit) {
67
- const query = `
68
- SELECT *
69
- FROM "${sourceSchema}"."${tableConfig.sourceTable}"
70
- ${this.buildWhereClause(tableConfig)}
71
- ORDER BY "${tableConfig.idField}"
72
- LIMIT ${limit}
73
- OFFSET ${offset}
67
+ const query = `
68
+ SELECT *
69
+ FROM "${sourceSchema}"."${tableConfig.sourceTable}"
70
+ ${this.buildWhereClause(tableConfig)}
71
+ ORDER BY "${tableConfig.idField}"
72
+ LIMIT ${limit}
73
+ OFFSET ${offset}
74
74
  `;
75
75
  const result = await this.connections.sourcePool.query(query);
76
76
  return result.rows;
@@ -121,11 +121,11 @@ class BatchMigrator {
121
121
  const columns = Object.keys(record);
122
122
  const values = Object.values(record);
123
123
  const placeholders = values.map((_, i) => `$${i + 1}`).join(", ");
124
- const query = `
125
- INSERT INTO "${schema}"."${table}"
126
- (${columns.map((col) => `"${col}"`).join(", ")})
127
- VALUES (${placeholders})
128
- ON CONFLICT DO NOTHING
124
+ const query = `
125
+ INSERT INTO "${schema}"."${table}"
126
+ (${columns.map((col) => `"${col}"`).join(", ")})
127
+ VALUES (${placeholders})
128
+ ON CONFLICT DO NOTHING
129
129
  `;
130
130
  await client.query(query, values);
131
131
  }
@@ -55,12 +55,12 @@ class DataTransformer {
55
55
  }
56
56
  }
57
57
  async getEnumTypeName(tableName, columnName) {
58
- const result = await this.connections.sourcePool.query(`
59
- SELECT udt_name
60
- FROM information_schema.columns
61
- WHERE table_name = $1
62
- AND column_name = $2
63
- AND table_schema = 'public'
58
+ const result = await this.connections.sourcePool.query(`
59
+ SELECT udt_name
60
+ FROM information_schema.columns
61
+ WHERE table_name = $1
62
+ AND column_name = $2
63
+ AND table_schema = 'public'
64
64
  `, [tableName.replace(/^public\./, ""), columnName]);
65
65
  if (result.rows.length === 0) {
66
66
  throw new Error(`No se encontró el tipo de enum para ${tableName}.${columnName}`);
@@ -88,14 +88,14 @@ class DataTransformer {
88
88
  if (enumDefaults[enumType]) {
89
89
  return enumDefaults[enumType];
90
90
  }
91
- const query = `
92
- SELECT e.enumlabel
93
- FROM pg_type t
94
- JOIN pg_enum e ON t.oid = e.enumtypid
95
- JOIN pg_namespace n ON n.oid = t.typnamespace
96
- WHERE t.typname = $1 AND n.nspname = $2
97
- ORDER BY e.enumsortorder
98
- LIMIT 1
91
+ const query = `
92
+ SELECT e.enumlabel
93
+ FROM pg_type t
94
+ JOIN pg_enum e ON t.oid = e.enumtypid
95
+ JOIN pg_namespace n ON n.oid = t.typnamespace
96
+ WHERE t.typname = $1 AND n.nspname = $2
97
+ ORDER BY e.enumsortorder
98
+ LIMIT 1
99
99
  `;
100
100
  const result = await this.schemaUtils.queryTargetDb(query, [
101
101
  enumType,
@@ -74,11 +74,11 @@ class DependencyResolver {
74
74
  this.tableOrder.push(table);
75
75
  }
76
76
  async getAllTables() {
77
- const query = `
78
- SELECT table_name
79
- FROM information_schema.tables
80
- WHERE table_schema = 'public'
81
- AND table_type = 'BASE TABLE'
77
+ const query = `
78
+ SELECT table_name
79
+ FROM information_schema.tables
80
+ WHERE table_schema = 'public'
81
+ AND table_type = 'BASE TABLE'
82
82
  `;
83
83
  const result = await this.sourcePool.query(query);
84
84
  return result.rows.map((row) => row.table_name);
@@ -88,17 +88,17 @@ class DependencyResolver {
88
88
  const dependencies = new Set();
89
89
  const configDeps = ((_c = (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.tables) === null || _b === void 0 ? void 0 : _b[table]) === null || _c === void 0 ? void 0 : _c.dependencies) || [];
90
90
  configDeps.forEach((dep) => dependencies.add(dep));
91
- const query = `
92
- SELECT
93
- ccu.table_name AS foreign_table
94
- FROM
95
- information_schema.table_constraints tc
96
- JOIN information_schema.constraint_column_usage ccu
97
- ON ccu.constraint_name = tc.constraint_name
98
- WHERE
99
- tc.constraint_type = 'FOREIGN KEY'
100
- AND tc.table_name = $1
101
- AND tc.table_schema = 'public'
91
+ const query = `
92
+ SELECT
93
+ ccu.table_name AS foreign_table
94
+ FROM
95
+ information_schema.table_constraints tc
96
+ JOIN information_schema.constraint_column_usage ccu
97
+ ON ccu.constraint_name = tc.constraint_name
98
+ WHERE
99
+ tc.constraint_type = 'FOREIGN KEY'
100
+ AND tc.table_name = $1
101
+ AND tc.table_schema = 'public'
102
102
  `;
103
103
  try {
104
104
  const result = await this.sourcePool.query(query, [table]);
@@ -111,13 +111,13 @@ class DependencyResolver {
111
111
  }
112
112
  async validateDependencies(table, dependencies) {
113
113
  for (const dep of dependencies) {
114
- const query = `
115
- SELECT EXISTS (
116
- SELECT 1
117
- FROM information_schema.tables
118
- WHERE table_schema = 'public'
119
- AND table_name = $1
120
- )
114
+ const query = `
115
+ SELECT EXISTS (
116
+ SELECT 1
117
+ FROM information_schema.tables
118
+ WHERE table_schema = 'public'
119
+ AND table_name = $1
120
+ )
121
121
  `;
122
122
  const result = await this.sourcePool.query(query, [dep]);
123
123
  if (!result.rows[0].exists) {
@@ -43,13 +43,13 @@ class EntityDiscovery {
43
43
  }
44
44
  }
45
45
  async getPrimaryKey(schemaName, tableName) {
46
- const query = `
47
- SELECT a.attname
48
- FROM pg_index i
49
- JOIN pg_attribute a ON a.attrelid = i.indrelid
50
- AND a.attnum = ANY(i.indkey)
51
- WHERE i.indrelid = '"${schemaName}"."${tableName}"'::regclass
52
- AND i.indisprimary;
46
+ const query = `
47
+ SELECT a.attname
48
+ FROM pg_index i
49
+ JOIN pg_attribute a ON a.attrelid = i.indrelid
50
+ AND a.attnum = ANY(i.indkey)
51
+ WHERE i.indrelid = '"${schemaName}"."${tableName}"'::regclass
52
+ AND i.indisprimary;
53
53
  `;
54
54
  try {
55
55
  const { rows } = await this.targetPool.query(query);
@@ -61,23 +61,23 @@ class EntityDiscovery {
61
61
  }
62
62
  }
63
63
  async getForeignKeys(schemaName, tableName) {
64
- const query = `
65
- SELECT
66
- kcu.column_name,
67
- ccu.table_name AS foreign_table_name,
68
- ccu.column_name AS foreign_column_name
69
- FROM
70
- information_schema.table_constraints tc
71
- JOIN information_schema.key_column_usage kcu
72
- ON tc.constraint_name = kcu.constraint_name
73
- AND tc.table_schema = kcu.table_schema
74
- JOIN information_schema.constraint_column_usage ccu
75
- ON ccu.constraint_name = tc.constraint_name
76
- AND ccu.table_schema = tc.table_schema
77
- WHERE
78
- tc.constraint_type = 'FOREIGN KEY'
79
- AND tc.table_schema = $1
80
- AND tc.table_name = $2;
64
+ const query = `
65
+ SELECT
66
+ kcu.column_name,
67
+ ccu.table_name AS foreign_table_name,
68
+ ccu.column_name AS foreign_column_name
69
+ FROM
70
+ information_schema.table_constraints tc
71
+ JOIN information_schema.key_column_usage kcu
72
+ ON tc.constraint_name = kcu.constraint_name
73
+ AND tc.table_schema = kcu.table_schema
74
+ JOIN information_schema.constraint_column_usage ccu
75
+ ON ccu.constraint_name = tc.constraint_name
76
+ AND ccu.table_schema = tc.table_schema
77
+ WHERE
78
+ tc.constraint_type = 'FOREIGN KEY'
79
+ AND tc.table_schema = $1
80
+ AND tc.table_name = $2;
81
81
  `;
82
82
  try {
83
83
  const { rows } = await this.targetPool.query(query, [schemaName, tableName]);
@@ -89,50 +89,50 @@ class EntityDiscovery {
89
89
  }
90
90
  }
91
91
  async findJoinTables(schemaName, sourceTable, targetTable) {
92
- const query = `
93
- WITH source_fks AS (
94
- SELECT
95
- tc.table_name,
96
- kcu.column_name,
97
- ccu.table_name AS referenced_table
98
- FROM
99
- information_schema.table_constraints tc
100
- JOIN information_schema.key_column_usage kcu
101
- ON tc.constraint_name = kcu.constraint_name
102
- AND tc.table_schema = kcu.table_schema
103
- JOIN information_schema.constraint_column_usage ccu
104
- ON ccu.constraint_name = tc.constraint_name
105
- AND ccu.table_schema = tc.table_schema
106
- WHERE
107
- tc.constraint_type = 'FOREIGN KEY'
108
- AND tc.table_schema = $1
109
- AND ccu.table_name = $2
110
- ),
111
- target_fks AS (
112
- SELECT
113
- tc.table_name,
114
- kcu.column_name,
115
- ccu.table_name AS referenced_table
116
- FROM
117
- information_schema.table_constraints tc
118
- JOIN information_schema.key_column_usage kcu
119
- ON tc.constraint_name = kcu.constraint_name
120
- AND tc.table_schema = kcu.table_schema
121
- JOIN information_schema.constraint_column_usage ccu
122
- ON ccu.constraint_name = tc.constraint_name
123
- AND ccu.table_schema = tc.table_schema
124
- WHERE
125
- tc.constraint_type = 'FOREIGN KEY'
126
- AND tc.table_schema = $1
127
- AND ccu.table_name = $3
128
- )
129
- SELECT
130
- s.table_name AS join_table,
131
- s.column_name AS source_column,
132
- t.column_name AS target_column
133
- FROM
134
- source_fks s
135
- JOIN target_fks t ON s.table_name = t.table_name
92
+ const query = `
93
+ WITH source_fks AS (
94
+ SELECT
95
+ tc.table_name,
96
+ kcu.column_name,
97
+ ccu.table_name AS referenced_table
98
+ FROM
99
+ information_schema.table_constraints tc
100
+ JOIN information_schema.key_column_usage kcu
101
+ ON tc.constraint_name = kcu.constraint_name
102
+ AND tc.table_schema = kcu.table_schema
103
+ JOIN information_schema.constraint_column_usage ccu
104
+ ON ccu.constraint_name = tc.constraint_name
105
+ AND ccu.table_schema = tc.table_schema
106
+ WHERE
107
+ tc.constraint_type = 'FOREIGN KEY'
108
+ AND tc.table_schema = $1
109
+ AND ccu.table_name = $2
110
+ ),
111
+ target_fks AS (
112
+ SELECT
113
+ tc.table_name,
114
+ kcu.column_name,
115
+ ccu.table_name AS referenced_table
116
+ FROM
117
+ information_schema.table_constraints tc
118
+ JOIN information_schema.key_column_usage kcu
119
+ ON tc.constraint_name = kcu.constraint_name
120
+ AND tc.table_schema = kcu.table_schema
121
+ JOIN information_schema.constraint_column_usage ccu
122
+ ON ccu.constraint_name = tc.constraint_name
123
+ AND ccu.table_schema = tc.table_schema
124
+ WHERE
125
+ tc.constraint_type = 'FOREIGN KEY'
126
+ AND tc.table_schema = $1
127
+ AND ccu.table_name = $3
128
+ )
129
+ SELECT
130
+ s.table_name AS join_table,
131
+ s.column_name AS source_column,
132
+ t.column_name AS target_column
133
+ FROM
134
+ source_fks s
135
+ JOIN target_fks t ON s.table_name = t.table_name
136
136
  `;
137
137
  try {
138
138
  const { rows } = await this.targetPool.query(query, [
@@ -15,23 +15,23 @@ class ForeignKeyManager {
15
15
  }
16
16
  try {
17
17
  this.logger.log(`Obteniendo dependencias de llaves foráneas para ${schemaName}.${tableName}`);
18
- const query = `
19
- SELECT
20
- kcu.column_name,
21
- ccu.table_name AS foreign_table_name,
22
- ccu.column_name AS foreign_column_name
23
- FROM
24
- information_schema.table_constraints tc
25
- JOIN information_schema.key_column_usage kcu
26
- ON tc.constraint_name = kcu.constraint_name
27
- AND tc.table_schema = kcu.table_schema
28
- JOIN information_schema.constraint_column_usage ccu
29
- ON ccu.constraint_name = tc.constraint_name
30
- AND ccu.table_schema = tc.table_schema
31
- WHERE
32
- tc.constraint_type = 'FOREIGN KEY'
33
- AND tc.table_schema = $1
34
- AND tc.table_name = $2;
18
+ const query = `
19
+ SELECT
20
+ kcu.column_name,
21
+ ccu.table_name AS foreign_table_name,
22
+ ccu.column_name AS foreign_column_name
23
+ FROM
24
+ information_schema.table_constraints tc
25
+ JOIN information_schema.key_column_usage kcu
26
+ ON tc.constraint_name = kcu.constraint_name
27
+ AND tc.table_schema = kcu.table_schema
28
+ JOIN information_schema.constraint_column_usage ccu
29
+ ON ccu.constraint_name = tc.constraint_name
30
+ AND ccu.table_schema = tc.table_schema
31
+ WHERE
32
+ tc.constraint_type = 'FOREIGN KEY'
33
+ AND tc.table_schema = $1
34
+ AND tc.table_name = $2;
35
35
  `;
36
36
  const { rows } = await this.connections.targetPool.query(query, [
37
37
  schemaName,
@@ -42,7 +42,7 @@ class ForeignKeyManager {
42
42
  foreignTable: row.foreign_table_name,
43
43
  foreignColumn: row.foreign_column_name,
44
44
  }));
45
- this.logger.log(`Encontradas ${dependencies.length} dependencias para ${schemaName}.${tableName}:
45
+ this.logger.log(`Encontradas ${dependencies.length} dependencias para ${schemaName}.${tableName}:
46
46
  ${dependencies
47
47
  .map((d) => `\n - ${d.column} -> ${d.foreignTable}.${d.foreignColumn}`)
48
48
  .join("")}`);
@@ -81,7 +81,7 @@ class ForeignKeyManager {
81
81
  }
82
82
  }
83
83
  if (missingDependencies.length > 0) {
84
- this.logger.debug(`Registro ${recordId}: Faltan ${missingDependencies.length} dependencias:
84
+ this.logger.debug(`Registro ${recordId}: Faltan ${missingDependencies.length} dependencias:
85
85
  ${missingDependencies.map((dep) => `\n - ${dep}`).join("")}`);
86
86
  }
87
87
  else {
@@ -141,10 +141,10 @@ class ForeignKeyManager {
141
141
  }
142
142
  async checkTableExists(tableName) {
143
143
  try {
144
- const result = await this.connections.sourcePool.query(`SELECT EXISTS (
145
- SELECT FROM information_schema.tables
146
- WHERE table_schema = 'public'
147
- AND table_name = $1
144
+ const result = await this.connections.sourcePool.query(`SELECT EXISTS (
145
+ SELECT FROM information_schema.tables
146
+ WHERE table_schema = 'public'
147
+ AND table_name = $1
148
148
  )`, [tableName]);
149
149
  const exists = result.rows[0].exists;
150
150
  this.logger.debug(`Verificación de existencia de tabla ${tableName}: ${exists ? "EXISTE" : "NO EXISTE"}`);
@@ -113,11 +113,11 @@ class DataMigrationTool {
113
113
  }
114
114
  }
115
115
  this.logger.debug(`Validation check: Using ${transactionTableKey}.${transactionProviderFk} referencing ${providerTableKey}.${providerIdColumn}`);
116
- const query = `
117
- SELECT t."${tablesConfig[transactionTableKey].idField}" AS transaction_id, t."${transactionProviderFk}"
118
- FROM "${transactionTableKey}" t
119
- LEFT JOIN "${providerTableKey}" p ON t."${transactionProviderFk}" = p."${providerIdColumn}"
120
- WHERE t."${transactionProviderFk}" IS NOT NULL AND p."${providerIdColumn}" IS NULL;
116
+ const query = `
117
+ SELECT t."${tablesConfig[transactionTableKey].idField}" AS transaction_id, t."${transactionProviderFk}"
118
+ FROM "${transactionTableKey}" t
119
+ LEFT JOIN "${providerTableKey}" p ON t."${transactionProviderFk}" = p."${providerIdColumn}"
120
+ WHERE t."${transactionProviderFk}" IS NOT NULL AND p."${providerIdColumn}" IS NULL;
121
121
  `;
122
122
  const invalidTransactions = (await this.connections.sourcePrisma.$queryRawUnsafe(query));
123
123
  if (invalidTransactions.length > 0) {
@@ -11,28 +11,28 @@ class SchemaUtils {
11
11
  const pool = dbType === "source"
12
12
  ? this.connections.sourcePool
13
13
  : this.connections.targetPool;
14
- const query = `
15
- SELECT
16
- c.table_name,
17
- c.column_name,
18
- c.data_type,
19
- c.udt_name,
20
- c.character_maximum_length,
21
- c.is_nullable,
22
- c.column_default,
23
- tc.constraint_type
24
- FROM
25
- information_schema.columns c
26
- LEFT JOIN information_schema.constraint_column_usage ccu
27
- ON c.column_name = ccu.column_name
28
- AND c.table_name = ccu.table_name
29
- LEFT JOIN information_schema.table_constraints tc
30
- ON ccu.constraint_name = tc.constraint_name
31
- WHERE
32
- c.table_schema = $1
33
- AND c.table_name = $2
34
- ORDER BY
35
- c.ordinal_position
14
+ const query = `
15
+ SELECT
16
+ c.table_name,
17
+ c.column_name,
18
+ c.data_type,
19
+ c.udt_name,
20
+ c.character_maximum_length,
21
+ c.is_nullable,
22
+ c.column_default,
23
+ tc.constraint_type
24
+ FROM
25
+ information_schema.columns c
26
+ LEFT JOIN information_schema.constraint_column_usage ccu
27
+ ON c.column_name = ccu.column_name
28
+ AND c.table_name = ccu.table_name
29
+ LEFT JOIN information_schema.table_constraints tc
30
+ ON ccu.constraint_name = tc.constraint_name
31
+ WHERE
32
+ c.table_schema = $1
33
+ AND c.table_name = $2
34
+ ORDER BY
35
+ c.ordinal_position
36
36
  `;
37
37
  try {
38
38
  const result = await pool.query(query, [schema, tableName]);
@@ -45,10 +45,10 @@ class SchemaUtils {
45
45
  }
46
46
  async checkSchemaExists(schemaName) {
47
47
  try {
48
- const query = `
49
- SELECT schema_name
50
- FROM information_schema.schemata
51
- WHERE schema_name = $1
48
+ const query = `
49
+ SELECT schema_name
50
+ FROM information_schema.schemata
51
+ WHERE schema_name = $1
52
52
  `;
53
53
  const result = await this.connections.targetPool.query(query, [
54
54
  schemaName,
@@ -62,11 +62,11 @@ class SchemaUtils {
62
62
  }
63
63
  async getTargetTables(schemaName) {
64
64
  try {
65
- const query = `
66
- SELECT table_name
67
- FROM information_schema.tables
68
- WHERE table_schema = $1
69
- AND table_type = 'BASE TABLE'
65
+ const query = `
66
+ SELECT table_name
67
+ FROM information_schema.tables
68
+ WHERE table_schema = $1
69
+ AND table_type = 'BASE TABLE'
70
70
  `;
71
71
  const result = await this.connections.targetPool.query(query, [
72
72
  schemaName,
@@ -84,13 +84,13 @@ class SchemaUtils {
84
84
  }
85
85
  async getEnumValues(schemaName, enumName) {
86
86
  try {
87
- const query = `
88
- SELECT e.enumlabel
89
- FROM pg_type t
90
- JOIN pg_enum e ON t.oid = e.enumtypid
91
- JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
92
- WHERE t.typname = $1
93
- AND n.nspname = $2
87
+ const query = `
88
+ SELECT e.enumlabel
89
+ FROM pg_type t
90
+ JOIN pg_enum e ON t.oid = e.enumtypid
91
+ JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
92
+ WHERE t.typname = $1
93
+ AND n.nspname = $2
94
94
  `;
95
95
  const result = await this.connections.targetPool.query(query, [
96
96
  enumName,
@@ -112,25 +112,25 @@ class SchemaUtils {
112
112
  async createMissingColumns(tableName, schema, columns) {
113
113
  for (const column of columns) {
114
114
  try {
115
- const query = `
116
- ALTER TABLE "${schema}"."${tableName}"
117
- ADD COLUMN IF NOT EXISTS "${column.column_name}" ${column.data_type}
118
- ${column.is_nullable === "NO" ? "NOT NULL" : ""}
119
- ${column.column_default ? `DEFAULT ${column.column_default}` : ""}
115
+ const query = `
116
+ ALTER TABLE "${schema}"."${tableName}"
117
+ ADD COLUMN IF NOT EXISTS "${column.column_name}" ${column.data_type}
118
+ ${column.is_nullable === "NO" ? "NOT NULL" : ""}
119
+ ${column.column_default ? `DEFAULT ${column.column_default}` : ""}
120
120
  `;
121
121
  await this.connections.targetPool.query(query);
122
122
  if (column.constraint_type === "UNIQUE") {
123
123
  const constraintName = `${tableName}_${column.column_name}_unique`;
124
- const uniqueQuery = `
125
- DO $$
126
- BEGIN
127
- IF NOT EXISTS (
128
- SELECT 1 FROM pg_constraint WHERE conname = '${constraintName}'
129
- ) THEN
130
- ALTER TABLE "${schema}"."${tableName}"
131
- ADD CONSTRAINT "${constraintName}" UNIQUE ("${column.column_name}");
132
- END IF;
133
- END $$;
124
+ const uniqueQuery = `
125
+ DO $$
126
+ BEGIN
127
+ IF NOT EXISTS (
128
+ SELECT 1 FROM pg_constraint WHERE conname = '${constraintName}'
129
+ ) THEN
130
+ ALTER TABLE "${schema}"."${tableName}"
131
+ ADD CONSTRAINT "${constraintName}" UNIQUE ("${column.column_name}");
132
+ END IF;
133
+ END $$;
134
134
  `;
135
135
  await this.connections.targetPool.query(uniqueQuery);
136
136
  }
@@ -146,10 +146,10 @@ class SchemaUtils {
146
146
  await this.connections.targetPool.query(`CREATE SCHEMA IF NOT EXISTS "${schemaName}"`);
147
147
  const tables = await this.getPublicTables();
148
148
  for (const table of tables) {
149
- await this.connections.targetPool.query(`
150
- CREATE TABLE IF NOT EXISTS "${schemaName}"."${table}" (
151
- LIKE public."${table}" INCLUDING ALL
152
- );
149
+ await this.connections.targetPool.query(`
150
+ CREATE TABLE IF NOT EXISTS "${schemaName}"."${table}" (
151
+ LIKE public."${table}" INCLUDING ALL
152
+ );
153
153
  `);
154
154
  }
155
155
  this.logger.log(`Created schema ${schemaName} with all tables`);
@@ -160,27 +160,27 @@ class SchemaUtils {
160
160
  }
161
161
  }
162
162
  async getPublicTables() {
163
- const result = await this.connections.targetPool.query(`
164
- SELECT tablename
165
- FROM pg_tables
166
- WHERE schemaname = 'public'
163
+ const result = await this.connections.targetPool.query(`
164
+ SELECT tablename
165
+ FROM pg_tables
166
+ WHERE schemaname = 'public'
167
167
  `);
168
168
  return result.rows.map((row) => row.tablename);
169
169
  }
170
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;
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
184
  `;
185
185
  try {
186
186
  const result = await this.connections.sourcePool.query(query, [
@@ -56,10 +56,10 @@ class TypecastManager {
56
56
  return tableSchema === null || tableSchema === void 0 ? void 0 : tableSchema.get(columnName);
57
57
  }
58
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}'
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
63
  `);
64
64
  const tableSchema = new Map();
65
65
  for (const column of columns) {
@@ -14,11 +14,11 @@ class DatabaseInitializer {
14
14
  const { Pool } = await Promise.resolve().then(() => require("pg"));
15
15
  const pool = new Pool({ connectionString: this.databaseUrl });
16
16
  try {
17
- const result = await pool.query(`
18
- SELECT COUNT(*)
19
- FROM information_schema.tables
20
- WHERE table_schema = 'public'
21
- AND table_type = 'BASE TABLE'
17
+ const result = await pool.query(`
18
+ SELECT COUNT(*)
19
+ FROM information_schema.tables
20
+ WHERE table_schema = 'public'
21
+ AND table_type = 'BASE TABLE'
22
22
  `);
23
23
  const tableCount = parseInt(result.rows[0].count);
24
24
  if (tableCount === 0) {
@@ -41,11 +41,11 @@ class DatabaseDropTool {
41
41
  async terminateConnections(dbName) {
42
42
  this.logger.log(`Terminating all connections to database: ${dbName}`);
43
43
  try {
44
- await this.adminPool.query(`
45
- SELECT pg_terminate_backend(pg_stat_activity.pid)
46
- FROM pg_stat_activity
47
- WHERE pg_stat_activity.datname = $1
48
- AND pid <> pg_backend_pid()
44
+ await this.adminPool.query(`
45
+ SELECT pg_terminate_backend(pg_stat_activity.pid)
46
+ FROM pg_stat_activity
47
+ WHERE pg_stat_activity.datname = $1
48
+ AND pid <> pg_backend_pid()
49
49
  `, [dbName]);
50
50
  this.logger.log("All connections terminated successfully");
51
51
  }