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"); } }