Restoring compressed sql files sometimes failed due to nasty bug in php gzfile function.
authorJanusz Dobrowolski <janusz@frontaccounting.eu>
Tue, 14 Oct 2014 22:53:25 +0000 (00:53 +0200)
committerJanusz Dobrowolski <janusz@frontaccounting.eu>
Tue, 14 Oct 2014 23:00:47 +0000 (01:00 +0200)
admin/db/maintenance_db.inc

index c9e07c57ad2d7f059075b8b66dcd6f19fe30d699..ea9b84ff1089d08b4906e5dd857c07f8fc902c0a 100644 (file)
@@ -284,10 +284,12 @@ function db_import($filename, $connection, $force=true)
 
        ini_set("max_execution_time", "180");
        db_query("SET foreign_key_checks=0");
+       $check_line_end = false;
        // uncrompress gziped backup files
        if (strpos($filename, ".gz") || strpos($filename, ".GZ"))
-               $lines = db_ungzip("lines", $filename);
-       elseif (strpos($filename, ".zip") || strpos($filename, ".ZIP"))
+       {       $lines = db_ungzip("lines", $filename);
+               $check_line_len = true;
+       } elseif (strpos($filename, ".zip") || strpos($filename, ".ZIP"))
                $lines = db_unzip("lines", $filename);
        else
                $lines = file("". $filename);
@@ -297,8 +299,9 @@ function db_import($filename, $connection, $force=true)
        $delimiter = ';';
        foreach($lines as $line_no => $line)
        {
+               $gzfile_bug = $check_line_len && (strlen($line) == 8190); // there is a bug in php (at least 4.1.1-5.5.9) gzfile which limits line length to 8190 bytes!
+
                $line = trim($line);
-               
                $line = str_replace("0_", $connection["tbpref"], $line);
 
                if ($query_table == '') 
@@ -320,8 +323,7 @@ function db_import($filename, $connection, $force=true)
                 if($query_table != '')  // inside allowed query
                 {
                        $table = $query_table;
-
-                       if (substr($line, -strlen($delimiter)) == $delimiter) // end of query found
+                       if (!$gzfile_bug && substr($line, -strlen($delimiter)) == $delimiter) // end of query found 
                        {
                                $line = substr($line, 0, strlen($line) - strlen($delimiter)); // strip delimiter
                                $query_table = '';