. */ namespace SP\Infrastructure\Database; use SP\Infrastructure\File\FileException; use SP\Infrastructure\File\FileHandler; use SP\Infrastructure\File\FileHandlerInterface; /** * Class MysqlFileParser * * @package SP\Storage */ final class MySQLFileParser implements DatabaseFileInterface { private FileHandler $fileHandler; public function __construct(FileHandlerInterface $fileHandler) { $this->fileHandler = $fileHandler; } /** * Parses a database script file and returns an array of lines parsed * * @throws FileException */ public function parse(string $delimiter = ';'): array { $queries = []; $query = ''; $delimiterLength = strlen($delimiter); $this->fileHandler->checkIsReadable(); $handle = $this->fileHandler->open(); while (($buffer = fgets($handle)) !== false) { $buffer = trim($buffer); $length = strlen($buffer); if ($length > 0 && strpos($buffer, '--') !== 0 ) { // CHecks if delimiter based EOL is reached $end = strrpos($buffer, $delimiter) === $length - $delimiterLength; // Checks if line is an SQL statement wrapped by a comment if (preg_match('#^(?/\*!\d+.*\*/)#', $buffer, $matches)) { if (!$end) { $query .= $matches['stmt'].PHP_EOL; } else { $queries[] = $query.$matches['stmt']; $query = ''; } } elseif (!$end) { $query .= $buffer.PHP_EOL; } elseif (strpos($buffer, 'DELIMITER') === false) { $queries[] = $query. trim( substr_replace($buffer, '', $length - $delimiterLength), $delimiterLength ); $query = ''; } } } $this->fileHandler->close(); return $queries; } }