@deinossrl/dgp-agent 1.5.26 → 1.5.27
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/index.mjs +84 -2
- package/package.json +1 -1
package/index.mjs
CHANGED
|
@@ -2344,13 +2344,95 @@ async function executePgRestore(command) {
|
|
|
2344
2344
|
let env = { ...process.env };
|
|
2345
2345
|
|
|
2346
2346
|
if (target_environment.connection_type === 'supabase') {
|
|
2347
|
-
const
|
|
2347
|
+
const cleanScript = `
|
|
2348
|
+
DO $$
|
|
2349
|
+
DECLARE
|
|
2350
|
+
r RECORD;
|
|
2351
|
+
BEGIN
|
|
2352
|
+
-- 1. Drop Views
|
|
2353
|
+
FOR r IN (SELECT table_name FROM information_schema.views WHERE table_schema = '${schema}') LOOP
|
|
2354
|
+
EXECUTE 'DROP VIEW IF EXISTS "' || '${schema}' || '"."' || r.table_name || '" CASCADE';
|
|
2355
|
+
END LOOP;
|
|
2356
|
+
|
|
2357
|
+
-- 2. Drop Tables
|
|
2358
|
+
FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = '${schema}') LOOP
|
|
2359
|
+
EXECUTE 'DROP TABLE IF EXISTS "' || '${schema}' || '"."' || r.tablename || '" CASCADE';
|
|
2360
|
+
END LOOP;
|
|
2361
|
+
|
|
2362
|
+
-- 3. Drop Routines (Functions/Procedures)
|
|
2363
|
+
FOR r IN (SELECT routine_name, routine_type FROM information_schema.routines WHERE routine_schema = '${schema}') LOOP
|
|
2364
|
+
-- Esto es más complejo por la firma, solemos necesitar OID.
|
|
2365
|
+
-- Simplificación: Drop Schema Cascade es mejor si se puede.
|
|
2366
|
+
-- Si no se puede, intentamos borrar funcion por nombre (peligroso si hay sobrecarga).
|
|
2367
|
+
-- Mejor estrategia para funciones: dejarlas? No, conflictos.
|
|
2368
|
+
-- Estrategia alternativa: DROP EXTENSION si aplica.
|
|
2369
|
+
NULL;
|
|
2370
|
+
END LOOP;
|
|
2371
|
+
END $$;
|
|
2372
|
+
|
|
2373
|
+
-- INTENTO 1: DROP SCHEMA (Ideal)
|
|
2374
|
+
-- INTENTO 2: Si falla, al menos borrar tablas (que es donde están los datos)
|
|
2375
|
+
BEGIN;
|
|
2376
|
+
DROP SCHEMA IF EXISTS "${schema}" CASCADE;
|
|
2377
|
+
CREATE SCHEMA "${schema}";
|
|
2378
|
+
EXCEPTION WHEN OTHERS THEN
|
|
2379
|
+
RAISE NOTICE 'No se pudo borrar schema % (posiblemente falta de permisos), intentando borrar contenido...', '${schema}';
|
|
2380
|
+
-- Borrar tablas manualmente
|
|
2381
|
+
FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = '${schema}') LOOP
|
|
2382
|
+
EXECUTE 'DROP TABLE IF EXISTS "' || '${schema}' || '"."' || r.tablename || '" CASCADE';
|
|
2383
|
+
END LOOP;
|
|
2384
|
+
-- Borrar vistas
|
|
2385
|
+
FOR r IN (SELECT table_name FROM information_schema.views WHERE table_schema = '${schema}') LOOP
|
|
2386
|
+
EXECUTE 'DROP VIEW IF EXISTS "' || '${schema}' || '"."' || r.table_name || '" CASCADE';
|
|
2387
|
+
END LOOP;
|
|
2388
|
+
END;
|
|
2389
|
+
`;
|
|
2390
|
+
|
|
2391
|
+
// SIMPLIFICACION: En lugar de script complejo, enviamos comando psql directo.
|
|
2392
|
+
// Como no podemos meter un bloque PL/pgSQL tan fácil en una línea de comando Windows sin líos de escaping,
|
|
2393
|
+
// vamos a usar una estrategia híbrida robusta.
|
|
2394
|
+
|
|
2395
|
+
// ESTRATEGIA:
|
|
2396
|
+
// 1. Intentar DROP SCHEMA.
|
|
2397
|
+
// 2. Si pg_restore da error de permisos, es "fatal".
|
|
2398
|
+
// Pero el agente puede intentar DROP SCHEMA y si falla, ignorar y confiar en pg_restore --clean? NO.
|
|
2399
|
+
|
|
2400
|
+
// MEJOR ESTRATEGIA (La que usan migraciones):
|
|
2401
|
+
// Generar sentencias SQL para borrar tablas y ejecutarlas una por una o en bloque.
|
|
2402
|
+
// Pero requiere query previo.
|
|
2403
|
+
|
|
2404
|
+
// SI EL USUARIO NO ES OWNER, NO PUEDE BORRAR EL SCHEMA.
|
|
2405
|
+
// PERO SÍ PUEDE BORRAR LAS TABLAS SI ES OWNER DE LAS TABLAS.
|
|
2406
|
+
|
|
2407
|
+
// Vamos a inyectar un comando SQL que haga el Loop de borrado de tablas.
|
|
2408
|
+
// Es lo más seguro para vaciar datos.
|
|
2409
|
+
|
|
2410
|
+
const tableCleanSQL = `
|
|
2411
|
+
DO $$
|
|
2412
|
+
DECLARE
|
|
2413
|
+
r RECORD;
|
|
2414
|
+
BEGIN
|
|
2415
|
+
-- Borrar tablas (y sus datos) es lo crítico para evitar duplicados
|
|
2416
|
+
FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = '${schema}') LOOP
|
|
2417
|
+
EXECUTE 'DROP TABLE IF EXISTS "' || '${schema}' || '"."' || r.tablename || '" CASCADE';
|
|
2418
|
+
END LOOP;
|
|
2419
|
+
|
|
2420
|
+
-- Intentar borrar schema si es posible (limpieza total), si falla no importa porque ya borramos las tablas
|
|
2421
|
+
BEGIN
|
|
2422
|
+
EXECUTE 'DROP SCHEMA IF EXISTS "' || '${schema}' || '" CASCADE';
|
|
2423
|
+
EXECUTE 'CREATE SCHEMA IF NOT EXISTS "' || '${schema}' || '"';
|
|
2424
|
+
EXCEPTION WHEN OTHERS THEN
|
|
2425
|
+
RAISE NOTICE 'No se pudo recrear schema %, pero las tablas fueron borradas.', '${schema}';
|
|
2426
|
+
END;
|
|
2427
|
+
END $$;
|
|
2428
|
+
`;
|
|
2429
|
+
|
|
2348
2430
|
psqlArgs = [
|
|
2349
2431
|
`--host=db.${projectRef}.supabase.co`,
|
|
2350
2432
|
'--port=5432',
|
|
2351
2433
|
'--username=postgres',
|
|
2352
2434
|
'--dbname=postgres',
|
|
2353
|
-
'-c',
|
|
2435
|
+
'-c', tableCleanSQL
|
|
2354
2436
|
];
|
|
2355
2437
|
if (params.password_encrypted) env.PGPASSWORD = params.password_encrypted;
|
|
2356
2438
|
} else {
|