diff --git a/src/Database/Helpers.php b/src/Database/Helpers.php index 8e60c46ec..b802c218f 100644 --- a/src/Database/Helpers.php +++ b/src/Database/Helpers.php @@ -177,9 +177,10 @@ public static function detectType(string $type): string /** * Import SQL dump from file - extremely fast. + * @param $onProgress function (int $count, ?float $percent): void * @return int count of commands */ - public static function loadFromFile(Connection $connection, $file): int + public static function loadFromFile(Connection $connection, string $file, callable $onProgress = NULL): int { @set_time_limit(0); // @ function may be disabled @@ -188,12 +189,14 @@ public static function loadFromFile(Connection $connection, $file): int throw new Nette\FileNotFoundException("Cannot open file '$file'."); } - $count = 0; + $stat = fstat($handle); + $count = $size = 0; $delimiter = ';'; $sql = ''; $pdo = $connection->getPdo(); // native query without logging while (!feof($handle)) { $s = (string) fgets($handle); + $size += strlen($s); if (!strncasecmp($s, 'DELIMITER ', 10)) { $delimiter = trim(substr($s, 10)); @@ -202,6 +205,9 @@ public static function loadFromFile(Connection $connection, $file): int $pdo->exec($sql); $sql = ''; $count++; + if ($onProgress) { + $onProgress($count, isset($stat['size']) ? $size * 100 / $stat['size'] : NULL); + } } else { $sql .= $s; @@ -210,6 +216,9 @@ public static function loadFromFile(Connection $connection, $file): int if (rtrim($sql) !== '') { $pdo->exec($sql); $count++; + if ($onProgress) { + $onProgress($count, isset($stat['size']) ? 100 : NULL); + } } fclose($handle); return $count;