$val) { if (is_array($val)) { foreach ($val as $key2 => $val2) { $restore[$key][$key2] = $val2; } } } include './'.$config['files']['parameter']; $restore['max_zeit'] = intval($config['max_execution_time'] * $config['time_buffer']); if (0 == $restore['max_zeit']) { $restore['max_zeit'] = 20; } $restore['startzeit'] = time(); $restore['xtime'] = (isset($_POST['xtime'])) ? $_POST['xtime'] : time(); $restore['fileEOF'] = false; // Ende des Files erreicht? $restore['actual_table'] = (!empty($_POST['actual_table'])) ? $_POST['actual_table'] : 'unbekannt'; $restore['offset'] = (!empty($_POST['offset'])) ? $_POST['offset'] : 0; $restore['aufruf'] = (!empty($_POST['aufruf'])) ? $_POST['aufruf'] : 0; $restore['table_ready'] = (!empty($_POST['table_ready'])) ? $_POST['table_ready'] : 0; $restore['part'] = (isset($_POST['part'])) ? $_POST['part'] : 0; $restore['do_it'] = (isset($_POST['do_it'])) ? $_POST['do_it'] : false; $restore['errors'] = (isset($_POST['err'])) ? $_POST['err'] : 0; $restore['notices'] = (isset($_POST['notices'])) ? $_POST['notices'] : 0; $restore['anzahl_eintraege'] = (isset($_POST['anzahl_eintraege'])) ? $_POST['anzahl_eintraege'] : 0; $restore['anzahl_tabellen'] = (isset($_POST['anzahl_tabellen'])) ? $_POST['anzahl_tabellen'] : 0; $restore['filename'] = (isset($_POST['filename'])) ? urldecode($_POST['filename']) : ''; if (isset($_GET['filename'])) { $restore['filename'] = urldecode($_GET['filename']); } $restore['actual_fieldcount'] = (isset($_POST['actual_fieldcount'])) ? $_POST['actual_fieldcount'] : 0; $restore['eintraege_ready'] = (isset($_POST['eintraege_ready'])) ? $_POST['eintraege_ready'] : 0; $restore['anzahl_zeilen'] = (isset($_POST['anzahl_zeilen'])) ? $_POST['anzahl_zeilen'] : $config['minspeed']; $restore['summe_eintraege'] = (isset($_POST['summe_eintraege'])) ? $_POST['summe_eintraege'] : 0; $restore['erweiterte_inserts'] = (isset($_POST['erweiterte_inserts'])) ? $_POST['erweiterte_inserts'] : 0; $restore['flag'] = (isset($_POST['flag'])) ? $_POST['flag'] : -1; $restore['EOB'] = false; $restore['dump_encoding'] = (isset($_POST['dump_encoding'])) ? $_POST['dump_encoding'] : 'utf8'; if (isset($_GET['dump_encoding'])) { $restore['dump_encoding'] = $_GET['dump_encoding']; } $restore['compressed'] = ('gz' == substr(strtolower($restore['filename']), -2)) ? 1 : 0; // wurden nur bestimmte Tabellen ausgwaehlt? if (!isset($databases['db_actual_tableselected'])) { $databases['db_actual_tableselected'] = ''; } if ('' != $databases['db_actual_tableselected']) { $restore['tables_to_restore'] = explode('|', $databases['db_actual_tableselected']); } else { $restore['tables_to_restore'] = false; } $_SESSION['config'] = $config; $_SESSION['databases'] = $databases; } else { $config = $_SESSION['config']; $databases = $_SESSION['databases']; $restore = $_SESSION['restore']; $restore['startzeit'] = time(); // some Server limit the number of vars that can be saved in a session // if this is the case and we lost the language-var we simply include the configuration again // this way the include is skipped on servers with unlimited vars if (!isset($config['language'])) { include './'.$config['files']['parameter']; } } include './language/'.$config['language'].'/lang.php'; include './language/'.$config['language'].'/lang_restore.php'; $config['files']['iconpath'] = './css/'.$config['theme'].'/icons/'; $aus = []; $pageheader = MODheader().headline($lang['L_RESTORE']); $aus1 = $page_parameter = ''; $RestoreFertig = $eingetragen = $dauer = $filegroesse = 0; mod_mysqli_connect($restore['dump_encoding'], true, $restore['actual_table']); @mysqli_select_db($config['dbconnection'], $databases['db_actual']) or exit($lang['L_DB_SELECT_ERROR'].$databases['db_actual'].$lang['L_DB_SELECT_ERROR2']); // open backup file $restore['filehandle'] = (1 == $restore['compressed']) ? gzopen($config['paths']['backup'].$restore['filename'], 'r') : fopen($config['paths']['backup'].$restore['filename'], 'r'); if ($restore['filehandle']) { //nur am Anfang Logeintrag if (0 == $restore['offset'] && 0 == $restore['anzahl_tabellen']) { // Statuszeile auslesen $restore['part'] = 0; $statusline = (1 == $restore['compressed']) ? gzgets($restore['filehandle']) : fgets($restore['filehandle']); $sline = ReadStatusline($statusline, true); $restore['anzahl_tabellen'] = $sline['tables']; $restore['anzahl_eintraege'] = $sline['records']; if ('MP_0' != $sline['part']) { $restore['part'] = 1; } //substr($sline['part'],3); if (1 == $config['empty_db_before_restore']) { EmptyDB($databases['db_actual']); } $restore['tablelock'] = 0; $restore['erweiterte_inserts'] = 0; if ('-1' == $sline['tables']) { ($restore['compressed']) ? gzseek($restore['filehandle'], 0) : fseek($restore['filehandle'], 0); } if ($restore['part'] > 0) { WriteLog('Start Multipart-Restore \''.$restore['filename'].'\''); } else { WriteLog('Start Restore \''.$restore['filename'].'\''); } } else { if (0 == $restore['compressed']) { $filegroesse = filesize($config['paths']['backup'].$restore['filename']); } // Dateizeiger an die richtige Stelle setzen ($restore['compressed']) ? gzseek($restore['filehandle'], $restore['offset']) : fseek($restore['filehandle'], $restore['offset']); // Jetzt basteln wir uns mal unsere Befehle zusammen... $a = 0; $dauer = 0; $restore['EOB'] = false; // Disable Keys of actual table to speed up restoring if (is_array($restore['tables_to_restore']) && sizeof($restore['tables_to_restore']) > 0 && in_array($restore['actual_table'], $restore['tables_to_restore'])) { @mysqli_query($config['dbconnection'], '/*!40000 ALTER TABLE `'.$restore['actual_table'].'` DISABLE KEYS */;'); } elseif (!is_array($restore['tables_to_restore']) && (is_array($restore['tables_to_restore']) && 0 == sizeof($restore['tables_to_restore'])) && ($restore['actual_table'] > '' && 'unbekannt' != $restore['actual_table'])) { @mysqli_query($config['dbconnection'], '/*!40000 ALTER TABLE `'.$restore['actual_table'].'` DISABLE KEYS */;'); } while (($a < $restore['anzahl_zeilen']) && (!$restore['fileEOF']) && ($dauer < $restore['max_zeit']) && !$restore['EOB']) { $sql_command = get_sqlbefehl(); if ($sql_command > '') { //WriteLog(htmlspecialchars($sql_command)); $res = mysqli_query($config['dbconnection'], $sql_command); if (false === !$res) { $anzsql = mysqli_affected_rows($config['dbconnection']); // Anzahl der eingetragenen Datensaetze ermitteln (Indexaktionen nicht zaehlen) $command = strtoupper(substr($sql_command, 0, 7)); if ('INSERT ' == $command) { $anzsql = mysqli_affected_rows($config['dbconnection']); if ($anzsql > 0) { $restore['eintraege_ready'] += $anzsql; } } } else { // Bei MySQL-Fehlern sofort abbrechen und Info ausgeben $meldung = mysqli_error($config['dbconnection']); if ('' != $meldung) { if ('duplicate entry' == strtolower(substr($meldung, 0, 15))) { ErrorLog('RESTORE', $databases['db_actual'], $sql_command, $meldung, 1); ++$restore['notices']; } else { if (0 == $config['stop_with_error']) { Errorlog('RESTORE', $databases['db_actual'], $sql_command, $meldung); ++$restore['errors']; } else { Errorlog('RESTORE', $databases['db_actual'], $sql_command, 'Restore failed: '.$meldung, 0); SQLError($sql_command, $meldung); exit($sql_command.' -> '.$meldung); } } } } } ++$a; $dauer = time() - $restore['startzeit']; } $eingetragen = $a - 1; } $restore['offset'] = ($restore['compressed']) ? gztell($restore['filehandle']) : ftell($restore['filehandle']); $restore['compressed'] ? gzclose($restore['filehandle']) : fclose($restore['filehandle']); ++$restore['aufruf']; if (!$restore['compressed']) { $prozent = ($filegroesse > 0) ? ($restore['offset'] * 100) / $filegroesse : 0; } else { if ($restore['anzahl_eintraege'] > 0) { $prozent = $restore['eintraege_ready'] * 100 / $restore['anzahl_eintraege']; } else { $prozent = 0; } } if ($prozent > 100) { $prozent = 100; } if ('' != $aus1) { $aus[] = '
'.$aus1.'

'; } $aus[] = sprintf($lang['L_RESTORE_DB'], $databases['db_actual'], $config['dbhost']).'
'.$lang['L_FILE'].': '.$restore['filename'].'
'.$lang['L_CHARSET'].': '.$restore['dump_encoding'].'
'; if ($restore['part'] > 0) { $aus[] = '
Multipart File '.$restore['part'].'
'; } $tabellen_fertig = ($restore['table_ready'] > 0) ? $restore['table_ready'] : '0'; $to_do = ($restore['anzahl_tabellen'] > 0) ? $restore['anzahl_tabellen'] : $lang['L_UNKNOWN']; if ($restore['anzahl_tabellen'] > 0) { $aus[] = sprintf($lang['L_RESTORE_TABLES_COMPLETED'], $tabellen_fertig, $to_do); } else { $aus[] = sprintf($lang['L_RESTORE_TABLES_COMPLETED0'], $tabellen_fertig); } $done = number_format($restore['eintraege_ready'], 0, ',', '.'); $to_do = number_format($restore['anzahl_eintraege'], 0, ',', '.'); if ($restore['anzahl_eintraege'] > 0) { $aus[] = sprintf($lang['L_RESTORE_RUN1'], $done, $to_do); } else { $aus[] = sprintf($lang['L_RESTORE_RUN0'], $done); } $aus[] = sprintf($lang['L_RESTORE_RUN2'], $restore['actual_table']).$lang['L_PROGRESS_OVER_ALL'].'
'; //Fortschrittsbalken $prozentbalken = (round($prozent, 0) * 3); if ($restore['anzahl_eintraege'] > 0 && false === $restore['tables_to_restore']) { $aus[] = ''; if ($prozentbalken >= 3) { $aus[] = ''.''.'
 '.(number_format($prozent, 2, ',', '.')).' %
'; } } else { $aus[] = ' '.$lang['L_UNKNOWN_NUMBER_OF_RECORDS'].'

'; } //Speed-Anzeige $fw = ($config['maxspeed'] == $config['minspeed']) ? 300 : round(($restore['anzahl_zeilen'] - $config['minspeed']) / ($config['maxspeed'] - $config['minspeed']) * 300, 0); $aus[] = '
'.'
'.'Speed
'.$restore['anzahl_zeilen'].'
'.''.'
'.''.'
'.''.''.'
'.$config['minspeed'].''.$config['maxspeed'].'
'; //Status-Text $aus[] = '

'.zeit_format(time() - $restore['xtime']).', '.$restore['aufruf'].' '.$lang['L_PAGE_REFRESHS'].(($restore['part'] > 0) ? ', file '.$restore['part'] : '').(($restore['errors'] > 0) ? ', '.$restore['errors'].' errors' : '').(($restore['notices'] > 0) ? ', '.$restore['notices'].' notices' : '').'

'; $restore['summe_eintraege'] += $eingetragen; //Zeitanpassung if ($dauer < $restore['max_zeit']) { $restore['anzahl_zeilen'] = $restore['anzahl_zeilen'] * $config['tuning_add']; // wenn wir mehr als die Haelfte der Zeit noch haetten nutzen koennen: Anzahl direkt um fast das Doppelte erhoehen if ($dauer < $restore['max_zeit'] / 2) { $restore['anzahl_zeilen'] = $restore['anzahl_zeilen'] * 1.8; } if ($restore['anzahl_zeilen'] > $config['maxspeed']) { $restore['anzahl_zeilen'] = $config['maxspeed']; } } else { $restore['anzahl_zeilen'] = $restore['anzahl_zeilen'] * $config['tuning_sub']; if ($restore['anzahl_zeilen'] < $config['minspeed']) { $restore['anzahl_zeilen'] = $config['minspeed']; } } $restore['anzahl_zeilen'] = intval($restore['anzahl_zeilen']); if ($restore['fileEOF'] && 0 == $restore['part']) { $restore['EOB'] = true; } if ($restore['EOB']) { // Uff, geschafft! Jetzt darf die Leitung wieder abkuehlen. :-) unset($aus); $aus = []; $restore['xtime'] = time() - $restore['xtime']; WriteLog("Restore '".$restore['filename']."' finished in ".zeit_format($restore['xtime']).'.'); $aus[] = $lang['L_RESTORE_TOTAL_COMPLETE'].'
'; $aus[] = $lang['L_FILE'].': '.$restore['filename'].'

'; $aus[] = sprintf($lang['L_RESTORE_COMPLETE'], $restore['table_ready']).'
'; $aus[] = sprintf($lang['L_RESTORE_COMPLETE2'], number_format($restore['eintraege_ready'], 0, ',', '.')); $aus[] = '

'.zeit_format($restore['xtime']).', '.$restore['aufruf'].' '.$lang['L_PAGE_REFRESHS'].'

'; if ($restore['errors'] > 0) { $aus[] = $lang['L_ERRORS'].': '.$restore['errors'].' » '.$lang['L_VIEW'].'
'; } if ($restore['notices'] > 0) { $aus[] = $lang['L_NOTICES'].': '.$restore['notices'].' » '.$lang['L_VIEW'].'
'; } $aus[] = '
   "; $aus[] = '   "; $RestoreFertig = 1; } else { if ($restore['fileEOF']) { //Multipart-Restore $restore['fileEOF'] = false; $nextfile = NextPart($restore['filename'], 0, true); if (!file_exists($config['paths']['backup'].$nextfile)) { $done = number_format($restore['eintraege_ready'], 0, ',', '.'); $to_do = number_format($restore['anzahl_eintraege'], 0, ',', '.'); $aus = []; $aus[] = '

'.$lang['L_RESTORE'].'

'; $aus[] = sprintf($lang['L_RESTORE_DB'], $databases['db_actual'], $config['dbhost']); $aus[] = '

'.$lang['L_MULTI_PART'].': '.$lang['L_FILE_MISSING'].' \''.$nextfile.'\' !

'; $aus[] = sprintf($lang['L_RESTORE_RUN1'], $done, $to_do); $aus[] = sprintf($lang['L_RESTORE_RUN2'], $restore['actual_table']); $aus[] = '

'.zeit_format(time() - $restore['xtime']).', '.$restore['aufruf'].' '.$lang['L_PAGE_REFRESHS']; $aus[] = ($restore['part'] > 0) ? ', '.$lang['L_FILE'].' '.$restore['part'] : ''; $aus[] = ($restore['errors'] > 0) ? ', '.$restore['errors'].' errors' : ''; $aus[] = '

'; WriteLog('Restore unsuccessful: Cannot find Multipartfile \''.$nextfile.'\''); $RestoreFertig = 1; } else { $restore['filename'] = $nextfile; $restore['offset'] = 0; ++$restore['part']; WriteLog("Continue Multipart-Restore with File '".$restore['filename']."'"); } } } } else { $aus[] = $config['paths']['backup'].$restore['filename'].' : '.$lang['L_FILE_OPEN_ERROR']; } $pagefooter = (1 == $RestoreFertig) ? MODFooter() : ''; // formerly all parameters were submitted via POST; now we use a session but we need the form to do the js-selfcall $page_parameter = '
'; if (1 == $RestoreFertig) { $complete_page = $pageheader.(('' != $aus) ? implode("\n", $aus) : '').$pagefooter; } else { $aus[] = $page_parameter; $_SESSION['restore'] = $restore; $selbstaufruf = ''; $complete_page = $pageheader.(('' != $aus) ? implode("\n", $aus) : '').$selbstaufruf.$pagefooter; } echo $complete_page; ob_end_flush(); exit();