diff --git a/src/Dibi/Connection.php b/src/Dibi/Connection.php index 4e89e098..a812a31c 100644 --- a/src/Dibi/Connection.php +++ b/src/Dibi/Connection.php @@ -614,11 +614,12 @@ class Connection /** * Import SQL dump from file. * @param string filename + * @param callable function (int $count, ?float $percent): void * @return int count of sql commands */ - public function loadFile($file) + public function loadFile($file, callable $onProgress = NULL) { - return Helpers::loadFromFile($this, $file); + return Helpers::loadFromFile($this, $file, $onProgress); } diff --git a/src/Dibi/Helpers.php b/src/Dibi/Helpers.php index 1b4a3f13..267e6c85 100644 --- a/src/Dibi/Helpers.php +++ b/src/Dibi/Helpers.php @@ -238,7 +238,7 @@ class Helpers * Import SQL dump from file. * @return int count of sql commands */ - public static function loadFromFile(Connection $connection, $file) + public static function loadFromFile(Connection $connection, $file, callable $onProgress = NULL) { @set_time_limit(0); // intentionally @ @@ -247,11 +247,13 @@ class Helpers throw new \RuntimeException("Cannot open file '$file'."); } - $count = 0; + $stat = fstat($handle); + $count = $size = 0; $delimiter = ';'; $sql = ''; $driver = $connection->getDriver(); while (($s = fgets($handle)) !== FALSE) { + $size += strlen($s); if (strtoupper(substr($s, 0, 10)) === 'DELIMITER ') { $delimiter = trim(substr($s, 10)); @@ -260,6 +262,9 @@ class Helpers $driver->query($sql); $sql = ''; $count++; + if ($onProgress) { + call_user_func($onProgress, $count, isset($stat['size']) ? $size * 100 / $stat['size'] : NULL); + } } else { $sql .= $s; @@ -269,6 +274,9 @@ class Helpers if (rtrim($sql) !== '') { $driver->query($sql); $count++; + if ($onProgress) { + call_user_func($onProgress, $count, isset($stat['size']) ? 100 : NULL); + } } fclose($handle); return $count;