Files
whatsapp/db_compare.php
2026-03-10 18:42:51 -05:00

93 lines
3.3 KiB
PHP

<?php
/**
* Script de comparación de bases de datos: local vs producción
* Genera la estructura completa de tablas, columnas, índices y constraints
*/
require '/var/www/html/config/config.php';
// Conexión producción (usa la config normal del sistema)
$pdoProd = new PDO(
'mysql:host='.DB_HOST.';port='.DB_PORT.';dbname='.DB_NAME.';charset=utf8mb4',
DB_USER, DB_PASS,
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]
);
// Conexión local (MariaDB del docker-compose dev)
$localHost = 'whatsapp-dev-mysql';
$localUser = 'root';
$localPass = 'root_password_2026';
$localDb = DB_NAME;
$pdoLocal = null;
try {
$pdoLocal = new PDO(
"mysql:host={$localHost};port=3306;dbname={$localDb};charset=utf8mb4",
$localUser, $localPass,
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]
);
} catch (Exception $e) {
// Si el host no es accesible desde el contenedor app, intentar con la dirección de red interna
$localHost = '172.17.0.1'; // docker bridge gateway
try {
$pdoLocal = new PDO(
"mysql:host={$localHost};port=3306;dbname={$localDb};charset=utf8mb4",
$localUser, $localPass,
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]
);
} catch (Exception $e2) {
echo json_encode(['local_error' => $e2->getMessage()]);
// Continuar solo con producción
}
}
function getSchema(PDO $pdo, string $dbName): array {
// Tablas
$tables = $pdo->query("SHOW TABLES")->fetchAll(PDO::FETCH_COLUMN);
$schema = [];
foreach ($tables as $table) {
// Columnas
$cols = $pdo->query("SHOW FULL COLUMNS FROM `$table`")->fetchAll();
// Índices
$indexes = $pdo->query("SHOW INDEX FROM `$table`")->fetchAll();
// CREATE TABLE para referencia exacta
$create = $pdo->query("SHOW CREATE TABLE `$table`")->fetch();
$schema[$table] = [
'columns' => $cols,
'indexes' => $indexes,
'create_sql' => $create['Create Table'] ?? '',
];
}
return $schema;
}
function getRowCounts(PDO $pdo): array {
$tables = $pdo->query("SHOW TABLES")->fetchAll(PDO::FETCH_COLUMN);
$counts = [];
foreach ($tables as $t) {
$r = $pdo->query("SELECT COUNT(*) as n FROM `$t`")->fetch();
$counts[$t] = (int)($r['n'] ?? 0);
}
return $counts;
}
$prodSchema = getSchema($pdoProd, DB_NAME);
$prodCounts = getRowCounts($pdoProd);
$localSchema = $pdoLocal ? getSchema($pdoLocal, $localDb) : null;
$localCounts = $pdoLocal ? getRowCounts($pdoLocal) : null;
$output = [
'prod_tables' => array_keys($prodSchema),
'local_tables' => $localSchema ? array_keys($localSchema) : null,
'prod_counts' => $prodCounts,
'local_counts' => $localCounts,
'prod_schema' => $prodSchema,
'local_schema' => $localSchema,
];
file_put_contents('/tmp/db_scan_result.json', json_encode($output, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
echo "DONE: " . count($prodSchema) . " prod tables" . ($localSchema ? ", " . count($localSchema) . " local tables" : ", local not available") . PHP_EOL;
echo "Output saved to /tmp/db_scan_result.json" . PHP_EOL;