= 1000) { $count = 0; echo '.'; } $wrow = trim($line); if (substr($wrow, 0, 1) == '#') { $wrow = $line = ''; } if (substr($wrow, 0, 2) == '--') { $wrow = $line = ''; } if ($next) { $sql[] = $line; } else { $sql[count($sql) - 1] .= $line; } if (substr($wrow, -1) == ';') { $next = true; } else { $next = false; } } // delete all tables $tables = sqlQuery('SHOW TABLES')->fetchAll(); if ($tables) { $tables = array_map(function ($value) { return reset($value); }, $tables); sqlQuery('SET FOREIGN_KEY_CHECKS=0;'); foreach ($tables as $table) { sqlQuery("DROP TABLE `{$table}`"); } sqlQuery('SET FOREIGN_KEY_CHECKS=1;'); } $errNo = 0; $errStr = ''; foreach ($sql as $query) { $count++; if ($count >= 1000) { $count = 0; echo '.'; } $query = trim($query); if ($query) { $SQL = sqlQuery($query); if (!$SQL) { $errNo++; $errStr .= $query; } else { $SQL->free(); } } } if ($errNo == 0) { $ErrStr = 'Databáze byla obnovena ze zálohy.'; } else { // zalogovat chybu logError(__FILE__, __LINE__, 'Chyba obnovy zalohy databaze: '. $cfg['Path']['db_backup'].$dbBackup."\r\nchybných SQL příkazů: ".$errNo); $ErrStr = 'Vyskytly se chyby při ukládání. Celkem chybných SQL příkazů: '.$errNo; } writeDownActivity('záloha DB - příkaz obnovit zálohu '.$dbBackup); redirect('launch.php?s=list.php&type=dbbackup&ErrStr='.urlencode($ErrStr)); } elseif ($do = 'rename') { $newName = getVal('new_name'); if ($newName) { $newName = createScriptURL_Text($newName); preg_match('/.sql(.bz2)?/i', $dbBackup, $matches); $ext = $matches[0]; rename($cfg['Path']['db_backup'].$dbBackup, $cfg['Path']['db_backup'].$newName.$ext); $ErrStr = 'Záloha byla přejmenována'; redirect('launch.php?s=list.php&type=dbbackup&ErrStr='.urlencode($ErrStr)); } } } // funkce na ukladani zalohy do souboru function saveBackup($filename, &$ErrStr) { global $cfg; $fp = bzopen($cfg['Path']['db_backup'].$filename, 'w'); if ($fp) { return $fp; } else { $ErrStr = 'Chyba při ukládání do souboru.'; return null; } } if ($acn == 'add') { if (!findRight('OTH_BACKUP_ADD')) { redirect('launch.php?s=error.php&id=1'); } ini_set('display_errors', '1'); $filename = getVal('name'); if (!$filename) { if (empty($return)) { $filename = 'db'.date('Y-m-d_H-i-s').'.sql.bz2'; } elseif ($return == 'logout') { $filename = 'logout_backup.sql.bz2'; } } else { $filename = createScriptURL_Text($filename).'.sql.bz2'; } // pokusit se poprve ulozit DB zalohu $ErrStr = null; $fp = saveBackup($filename, $ErrStr); if (!$fp) { // snazi se napravit chybu @chmod($cfg['Path']['db_backup'], octdec(777)); // snazi se napravit chybu @chmod($cfg['Path']['db_backup'].$dbBackup, octdec(777)); $fp = saveBackup($filename, $ErrStr); if (!$fp) { // zalogovat chybu logError(__FILE__, __LINE__, 'Chyba ukladani zalohy databaze: '.$cfg['Path']['db_backup'].$filename); return false; } } $params = [ 'compress' => Ifsnop\Mysqldump\Mysqldump::BZIP2, 'add-drop-table' => true, 'single-transaction' => true, 'disable-foreign-keys-check' => true, 'add-locks' => false, 'lock-tables' => false, 'skip-triggers' => true, ]; $dump = new Ifsnop\Mysqldump\Mysqldump( "mysql:host={$cfg['Connection']['host']};dbname={$cfg['Connection']['database']}", $cfg['Connection']['user'], $cfg['Connection']['password'], $params ); try { // Prepare blank backup file $filename = realpath($cfg['Path']['db_backup']).'/'.$filename; unlink($filename); // prepare for streaming set_time_limit(0); ob_implicit_flush(1); while (ob_get_level()) { ob_end_clean(); } $dump->setInfoHook(function ($type, $data) { if (isSuperuser()) { echo "
{$data['name']}: {$data['rowCount']}"; } else { echo '.'; } }); echo 'Vytvářím zálohu...'; $dump->start($filename); $ErrStr .= 'Databáze byla v pořádku uložena.'; } catch (Exception $e) { $ErrStr .= 'Chyba při ukládání do souboru: '.$e->getMessage(); } if (empty($return)) { redirect('launch.php?s=list.php&type=dbbackup&ErrStr='.urlencode($ErrStr)); } elseif ($return == 'logout') { redirect('launch.php?s=logout.php'); } } // download db backup if ($acn == 'download') { $filename = getVal('file'); if ($filename) { downloadBackup($filename); } } // upload db backup for wpjadmin if ($acn == 'upload' && isSuperuser()) { $file = $_FILES['upload_db']; if ($file) { if ($file['type'] == 'application/x-bzip' || pathinfo($file['name'], PATHINFO_EXTENSION) == 'bz2') { uploadBackup($file); } else { $ErrStr = "Nepodporovaný formát {$file['type']}!"; redirect('launch.php?s=list.php&type=dbbackup&ErrStr='.urlencode($ErrStr)); } } } function uploadBackup($file) { $cfg = \KupShop\KupShopBundle\Config::get(); $targetLocation = $cfg['Path']['db_backup'].$file['name']; if (move_uploaded_file($file['tmp_name'], $targetLocation)) { $ErrStr = 'Záloha databáze byla nahrána'; redirect('launch.php?s=list.php&type=dbbackup&ErrStr='.urlencode($ErrStr)); } } function downloadBackup($filename) { $cfg = \KupShop\KupShopBundle\Config::get(); $file = $cfg['Path']['db_backup'].$filename; header('Content-Description: File Transfer'); header('Content-Type: application/x-bzip'); header('Content-Disposition: attachment; filename='.basename($file).''); readfile($file); exit; } function iterateBzipLines($file) { $fp = bzopen($file, 'r'); $data = ''; while (!feof($fp)) { $data .= bzread($fp, 4096); $row = preg_split("/(\r\n|\n)/", $data); $lines = count($row); foreach ($row as $index => $line) { // Detect last row if ($index == $lines - 1) { $data = $line; break; } yield $line; } } yield $data; bzclose($fp); }