Restoring compressed sql files sometimes failed due to nasty bug in php gzfile function.
[fa-stable.git] / admin / db / maintenance_db.inc
index 5ce47443dd6e23ca7f1401eb042734be013c461b..ea9b84ff1089d08b4906e5dd857c07f8fc902c0a 100644 (file)
@@ -18,6 +18,8 @@
  * @param $strSortType String containing either asc or desc [default to asc]
  * @desc Naturally sorts an array using by the column $strSortBy
  */
+define('EXPORT_MAX_INSERT', 50000);
+
 function array_natsort($aryData, $strIndex, $strSortBy, $strSortType=false)
 {
    //    if the parameters are invalid
@@ -178,7 +180,7 @@ function update_extensions($extensions) {
        }
 
        // update per company files
-       $cnt = count($db_connections);
+       $cnt = max(1, count($db_connections));
        for($i = 0; $i < $cnt; $i++) 
        {
                $newexts = $extensions;
@@ -253,7 +255,9 @@ function write_lang()
 
 function db_import($filename, $connection, $force=true)
 {
-       global $db, $go_debug;
+       global $db, $go_debug, $sql_trail;
+
+       $sql_trail = false;
 
        $allowed_commands = array(
                "create"  => 'table_queries', 
@@ -280,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);
@@ -293,16 +299,16 @@ 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 == '') 
                {       // check if line begins with one of allowed queries
                        foreach($allowed_commands as $cmd => $table) 
                        {
-//                             if (strtolower(substr($line, 0, strlen($cmd))) == $cmd) 
-                               if (stripos($line, $cmd) === 0) 
+                               if (strtolower(substr($line, 0, strlen($cmd))) == $cmd) 
                                {
                                        if ($cmd == 'delimiter') {
                                                $delimiter = trim(substr($line, 10));
@@ -317,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 = '';
@@ -327,7 +332,7 @@ function db_import($filename, $connection, $force=true)
                }
                
        }
-       
+/*
        {       // for debugging purposes
        global $path_to_root;
        $f = fopen($path_to_root.'/tmp/dbimport.txt', 'w+');
@@ -336,7 +341,7 @@ function db_import($filename, $connection, $force=true)
        fwrite($f, print_r($data_queries,true));
        fclose($f);
        }
-
+*/
        // execute drop tables if exists queries
        if (is_array($drop_queries))
        {
@@ -376,7 +381,7 @@ function db_import($filename, $connection, $force=true)
                        }
                }
        }
-       
+
        db_query("SET foreign_key_checks=1");
        if ($delimiter != ';') db_query("delimiter ;"); // just for any case
 
@@ -554,12 +559,12 @@ function db_export($conn, $filename, $zip='no', $comment='', $tbpref = TB_PREF,
 //                     if ($auto_incr[$tablename])
 //                             $out.=" AUTO_INCREMENT=".$auto_incr[$tablename];
                        $out.=" ;";
-                       $out.="\n\n\n";
+                       $out.="\n\n";
 
                        // export data
                        if (!$error)
                        {
-                               $out.="### Data of table `".$tablename."` ###\n\n";
+                               $out.="### Data of table `".$tablename."` ###\n";
 
                                // check if field types are NULL or NOT NULL
                                $res3 = db_query("SHOW COLUMNS FROM `" . $tablename . "`");
@@ -572,18 +577,40 @@ function db_export($conn, $filename, $zip='no', $comment='', $tbpref = TB_PREF,
                                }
 
                                $res2 = db_query("SELECT * FROM `" . $tablename . "`");
+                               $maxinsert = 0;
+                               $insert = '';
                                for ($j = 0; $j < db_num_rows($res2); $j++)
                                {
-                                       $out .= "INSERT INTO `" . $tablename . "` VALUES (";
                                        $row2 = db_fetch_row($res2);
-                                       // run through each field
+                                       $values = '(';
                                        for ($k = 0; $k < $nf = db_num_fields($res2); $k++)
                                        {
-                                               $out .= db_escape($row2[$k], $field_null[$k]);
+                                               $values .= db_escape($row2[$k], $field_null[$k]);
                                                if ($k < ($nf - 1))
-                                                       $out .= ", ";
+                                                       $values .= ', ';
+                                       }
+                                       $values .= ')';
+                                       $len = strlen($values);
+                                       if ($maxinsert < $len+1)
+                                       {
+                                               $maxinsert = EXPORT_MAX_INSERT;
+                                               if ($insert)
+                                               {
+                                                       $out .= $insert .';'; // flush insert query
+                                                       $insert = '';
+                                               }
                                        }
-                                       $out .= ");\n";
+
+                                       if ($insert == '')
+                                       {
+                                               $insert = "\nINSERT INTO `" . $tablename . "` VALUES\n";
+                                               $maxinsert -= strlen($insert);
+                                       } else {
+                                               $insert .= ",\n";
+                                       }
+
+                                       $maxinsert -= $len;
+                                       $insert .= $values;
 
                                        // if saving is successful, then empty $out, else set error flag
                                        if (strlen($out) > $max_size && $zip != "zip")
@@ -594,7 +621,8 @@ function db_export($conn, $filename, $zip='no', $comment='', $tbpref = TB_PREF,
                                                        $error = true;
                                        }
                                }
-
+                               if ($insert)
+                                       $out .= $insert. ';';
                        // an error occurred! Try to delete file and return error status
                        }
                        elseif ($error)