. */ namespace SP\Storage\Database; use SP\Storage\File\FileException; use SP\Storage\File\FileHandler; /** * Class MysqlFileParser * * @package SP\Storage */ final class MySQLFileParser implements DatabaseFileInterface { /** * @var FileHandler */ private $fileHandler; /** * MySQLFileParser constructor. * * @param FileHandler $fileHandler */ public function __construct(FileHandler $fileHandler) { $this->fileHandler = $fileHandler; } /** * Parses a database script file and returns an array of lines parsed * * @param string $delimiter * * @return array * @throws FileException */ public function parse($delimiter = ';') { $queries = []; $query = ''; $delimiterLength = strlen($delimiter); $this->fileHandler->checkIsReadable(); $handle = $this->fileHandler->open('rb'); 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 = ''; } } else { if (!$end) { $query .= $buffer . PHP_EOL; } elseif ($end && strpos($buffer, 'DELIMITER') === false) { $queries[] = $query . trim(substr_replace($buffer, '', $length - $delimiterLength), $delimiterLength); $query = ''; } } } } $this->fileHandler->close(); return $queries; } }