addArgument('file', InputArgument::REQUIRED, 'O caminho do arquivo SQL a ser importado');
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
$file = $input->getArgument('file');
if (!file_exists($file)) {
$output->writeln("Arquivo não encontrado: {$file}");
return Command::FAILURE;
}
$output->writeln("Importando arquivo: {$file}");
try {
$sql = file_get_contents($file);
if (!$sql) {
$output->writeln("Falha ao ler o arquivo SQL ou arquivo vazio.");
return Command::FAILURE;
}
$connection = Capsule::connection();
$queries = $this->splitSqlQueries($sql);
$totalQueries = count($queries);
$successCount = 0;
$output->writeln("Total de queries encontradas: {$totalQueries}");
foreach ($queries as $index => $query) {
$query = trim($query);
if (empty($query)) {
continue;
}
try {
$connection->statement($query);
$successCount++;
$output->writeln("Query " . ($index + 1) . "/{$totalQueries} executada com sucesso");
} catch (\Exception $e) {
$output->writeln("Erro na query " . ($index + 1) . ": " . $e->getMessage() . "");
$output->writeln("Query: " . substr($query, 0, 100) . "...");
}
}
$output->writeln("Importação concluída. {$successCount}/{$totalQueries} queries executadas com sucesso.");
return Command::SUCCESS;
} catch (\Exception $e) {
$output->writeln("Erro ao importar arquivo: " . $e->getMessage() . "");
return Command::FAILURE;
}
}
private function splitSqlQueries(string $sql): array
{
$queries = [];
$current = '';
$inString = false;
$stringChar = '';
$length = strlen($sql);
for ($i = 0; $i < $length; $i++) {
$char = $sql[$i];
if (($char === "'" || $char === '"') && ($i === 0 || $sql[$i - 1] !== '\\')) {
if (!$inString) {
$inString = true;
$stringChar = $char;
} elseif ($char === $stringChar) {
$inString = false;
}
}
if (!$inString && $char === ';') {
$queries[] = trim($current);
$current = '';
} else {
$current .= $char;
}
}
$current = trim($current);
if (!empty($current)) {
$queries[] = $current;
}
return array_filter($queries, function($query) {
return !empty(trim($query));
});
}
}