X-Git-Url: https://delta.frontaccounting.com/gitweb/?a=blobdiff_plain;f=admin%2Fdb%2Fmaintenance_db.inc;h=40bf751f78e0a26de56b1c2ac8aea0339ed5b2c3;hb=e3004d8581b1ea3c02bfe2b1e880990309c4459e;hp=81fc0abc0f764f8c4d140a13ad3bca26ec65c17d;hpb=46c5f7a65a7659a44ae8254c63152074363d3987;p=fa-stable.git diff --git a/admin/db/maintenance_db.inc b/admin/db/maintenance_db.inc index 81fc0abc..40bf751f 100644 --- a/admin/db/maintenance_db.inc +++ b/admin/db/maintenance_db.inc @@ -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,14 +255,20 @@ 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', + "delimiter" => 'table_queries', "alter table" => 'table_queries', "insert" => 'data_queries', "update" => 'data_queries', - "drop table if exists" => 'drop_queries'); + "drop table if exists" => 'drop_queries', + "drop function if exists" => 'drop_queries', + "drop trigger if exists" => 'drop_queries', + ); $ignored_mysql_errors = array( //errors ignored in normal (non forced) mode '1022', // duplicate key '1050', // Table %s already exists @@ -276,20 +284,24 @@ function db_import($filename, $connection, $force=true) ini_set("max_execution_time", "180"); db_query("SET foreign_key_checks=0"); + $check_line_len = 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); // parse input file $query_table = ''; + $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 == '') @@ -298,6 +310,10 @@ function db_import($filename, $connection, $force=true) { if (strtolower(substr($line, 0, strlen($cmd))) == $cmd) { + if ($cmd == 'delimiter') { + $delimiter = trim(substr($line, 10)); + continue 2; + } $query_table = $table; ${$query_table}[] = array('', $line_no+1); break; @@ -307,9 +323,9 @@ function db_import($filename, $connection, $force=true) if($query_table != '') // inside allowed query { $table = $query_table; - if (substr($line, -1) == ';') // end of query found + if (!$gzfile_bug && substr($line, -strlen($delimiter)) == $delimiter) // end of query found { - $line = substr($line, 0, strlen($line) - 1); // strip ';' + $line = substr($line, 0, strlen($line) - strlen($delimiter)); // strip delimiter $query_table = ''; } ${$table}[count(${$table}) - 1][0] .= $line . "\n"; @@ -365,8 +381,9 @@ function db_import($filename, $connection, $force=true) } } } - + db_query("SET foreign_key_checks=1"); + if ($delimiter != ';') db_query("delimiter ;"); // just for any case if (count($sql_errors)) { // display first failure message; the rest are probably derivative @@ -542,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 . "`"); @@ -560,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") @@ -582,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) @@ -720,7 +760,7 @@ function save_to_file($backupfile, $zip, $fileData) $c_len = strlen($zdata); // dos time - $timearray = getdate($zip); + $timearray = getdate(); $dostime = (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) | ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1); $dtime = dechex($dostime);