writeln("Arquivo de destino não encontrado: $targetFile");
return Command::FAILURE;
}
if (!file_exists($sourceFile)) {
$output->writeln("Arquivo de origem não encontrado: $sourceFile");
return Command::FAILURE;
}
$output->writeln("Iniciando a extração das tabelas sis_*** de $sourceFile...");
$sisTablesDefinitions = $this->extractSisTables($sourceFile);
if (empty($sisTablesDefinitions)) {
$output->writeln("Nenhuma tabela sis_*** encontrada em $sourceFile.");
return Command::FAILURE;
}
$output->writeln("Encontradas " . count($sisTablesDefinitions) . " tabelas sis_***. Substituindo em $targetFile...");
$this->replaceSisTables($targetFile, $sisTablesDefinitions, $output);
$output->writeln("Operação concluída com sucesso!");
return Command::SUCCESS;
}
private function extractSisTables(string $filePath): array
{
$handle = fopen($filePath, 'r');
if (!$handle) return [];
$tables = [];
$currentTable = null;
$capture = false;
$buffer = "";
while (($line = fgets($handle)) !== false) {
// Detecta início de um CREATE TABLE sis_***
if (preg_match("/CREATE TABLE `?(sis_[^`\s(]+)`?/i", $line, $matches)) {
$currentTable = $matches[1];
$capture = true;
$buffer = $line;
continue;
}
if ($capture) {
$buffer .= $line;
// Detecta fim do CREATE TABLE (assume-se que termina com ); ou ); seguido de comentários/inserts se for dump compactado,
// mas para simplificar, buscamos o padrão );
if (preg_match("/\);/", $line)) {
$capture = false;
$tables[$currentTable] = $buffer;
$buffer = "";
$currentTable = null;
}
}
}
fclose($handle);
return $tables;
}
private function replaceSisTables(string $filePath, array $definitions, OutputInterface $output): void
{
$tempFile = $filePath . '.tmp';
$inHandle = fopen($filePath, 'r');
$outHandle = fopen($tempFile, 'w');
$skip = false;
$replacedCount = 0;
while (($line = fgets($inHandle)) !== false) {
// Verifica se a linha inicia uma tabela que queremos substituir
if (preg_match("/CREATE TABLE `?(sis_[^`\s(]+)`?/i", $line, $matches)) {
$tableName = $matches[1];
if (isset($definitions[$tableName])) {
$output->writeln("Substituindo tabela: $tableName");
fwrite($outHandle, $definitions[$tableName]);
$skip = true;
$replacedCount++;
unset($definitions[$tableName]); // Marca como usada
continue;
}
}
// Se estiver pulando, ignora as linhas até o fim da definição da tabela
if ($skip) {
if (preg_match("/\);/", $line)) {
$skip = false;
}
continue;
}
fwrite($outHandle, $line);
}
// Se sobraram tabelas no source que não existiam no target, podemos adicioná-las ao final ou apenas informar
if (!empty($definitions)) {
$output->writeln("Adicionando novas tabelas sis_*** que não existiam no destino...");
foreach ($definitions as $tableName => $def) {
$output->writeln("Adicionando: $tableName");
fwrite($outHandle, "\n" . $def . "\n");
$replacedCount++;
}
}
fclose($inHandle);
fclose($outHandle);
rename($tempFile, $filePath);
$output->writeln("Total de tabelas processadas: $replacedCount");
}
}