function BaseDump($arc_name = "", $tbl_num, $start_row, &$TotalTables = 0) { global $DB; $ret = array(); $last_row = $start_row; $mem = 32; // Minimum required value $sql = "SHOW TABLES;"; $res = $DB->Query($sql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); $ptab = array(); while ($row = $res->Fetch()) { $ar = each($row); $table = $ar[1]; $ptab[] = $table; } if (!($f = fopen($arc_name, "a"))) { RaiseErrorAndDie('Can\'t open file: ' . $arc_name); } $i = $tbl_num; $dump = ""; $TotalTables = count($ptab); while ($i <= $TotalTables - 1 && haveTime()) { if (!strlen($ptab[$i])) { continue; } if ($last_row == -1) { $table = $ptab[$i]; $drop = !IntOption('dump_base_skip_stat') || !preg_match("#^b_stat#i", $table); // если не переносим статистику, то не удаляем старую статистику при восстановлении if ($dump = CBackup::createTable($ptab[$i], $drop)) { fwrite($f, $dump . "\n"); } else { $row_next = -1; } $next = false; $ret["num"] = $i; $ret["st_row"] = 0; $last_row = 0; } if ($dump) { $res = $DB->Query("SELECT count(*) as count FROM `{$ptab[$i]}`"); $row_count = $res->Fetch(); if ($row_count["count"] > 0) { if ($ptab[$i] == 'b_xml_tree') { $row_next = -1; } elseif (IntOption('dump_base_skip_stat') && preg_match('#^b_stat#i', $ptab[$i])) { $row_next = -1; } elseif (IntOption('dump_base_skip_search') && preg_match("#^(b_search_content_site|b_search_content_group|b_search_content_stem|b_search_content_title|b_search_tags|b_search_content_freq|b_search_content|b_search_suggest)\$#i", $ptab[$i])) { $row_next = -1; } elseif (IntOption('dump_base_skip_log') && $ptab[$i] == 'b_event_log') { $row_next = -1; } elseif (CTar::strpos($dump, 'DEFINER VIEW')) { $row_next = -1; } else { $row_next = CBackup::getData($ptab[$i], $f, $row_count["count"], $last_row, $mem); } } else { $row_next = -1; } } if ($row_next > 0) { $last_row = $row_next; $ret["num"] = $i; $ret["st_row"] = $last_row; } else { $ret["num"] = ++$i; $ret["st_row"] = -1; $last_row = -1; } } fclose($f); if (!($i <= count($ptab) - 1)) { $ret["end"] = true; } return $ret; }
function Scan($dir) { $dir = str_replace('\\','/',$dir); if ($this->Skip($dir)) return; $this->nextPath = $dir; if (is_dir($dir)) { ############################# # DIR ############################# if (!$this->startPath) // если начальный путь найден или не задан { $r = $this->ProcessDirBefore($dir); if ($r === false) return false; } if (!($handle = opendir($dir))) { $this->err[] = 'Error opening dir: '.$dir; return false; } while (($item = readdir($handle)) !== false) { if ($item == '.' || $item == '..' || false !== CTar::strpos($item,'\\')) continue; $f = $dir."/".$item; $r = $this->Scan($f); if ($r === false || $r === 'BREAK') { closedir($handle); return $r; } } closedir($handle); if (!$this->startPath) // если начальный путь найден или не задан { if ($this->ProcessDirAfter($dir) === false) return false; $this->DirCount++; } } else { ############################# # FILE ############################# $r = $this->ProcessFile($dir); if ($r === false) return false; elseif ($r === 'BREAK') // если файл обработан частично return $r; $this->FileCount++; } return true; }