. */ namespace SP\Infrastructure\Database; use SP\Domain\Database\Ports\DatabaseFileInterface; use SP\Domain\File\Ports\FileHandlerInterface; use SP\Infrastructure\File\FileException; /** * Class MysqlFileParser */ final readonly class MysqlFileParser implements DatabaseFileInterface { public function __construct(private FileHandlerInterface $fileHandler) { } /** * Parses a database script file and yields the queries parsed * * @throws FileException */ public function parse(string $delimiter = ';'): iterable { $this->fileHandler->checkIsReadable(); $query = []; $delimiterLength = strlen($delimiter); foreach ($this->fileHandler->read() as $data) { $line = trim($data); $lineLength = strlen($line); if ($lineLength > 0 && !(str_starts_with($line, '--') || str_starts_with($line, 'DELIMITER'))) { if (substr($line, -$delimiterLength) === $delimiter) { $query[] = substr($line, 0, $lineLength - $delimiterLength); yield implode(' ', $query); $query = []; } else { $query[] = $line; } } } } }