getFilename();
if ($file[0] != '.' && $fileinfo->isFile())
{
$size = byteOutput($fileinfo->getSize());
$files["$file"] = $file . ' (' . $size . ')';
}
}
ksort($files);
$r = Html::getOptionlist($files, $selected);
return $r;
}
/**
* Reformat a date from format dd.mm.yyyy hh:mm to yyyy.mm.dd hh:mm to make it sortable.
*
* @param string $datum Datetime taken from filename
* @return string
*/
function getSortableDate($datum)
{
$p = explode(' ', $datum);
$uhrzeit = $p[1];
$p2 = explode('.', $p[0]);
$day = $p2[0];
$month = $p2[1];
$year = $p2[2];
return $year . '.' . $month . '.' . $day . ' ' . $uhrzeit;
}
/**
* Checks a dump file and converts it.
*
* Places field names in backticks and splitts files into 10 MB-Parts.
*
* @param string $filesource File to convert
* @param string $db_name Database name will be used to create filenames and statusline
* @param string $cp Target copy file
* @return void
*/
function convert($filesource, $db_name, $cp)
{
global $config, $lang;
@ini_set('max_input_time', '0'); // for real big dumps
$filesize = 0;
$max_filesize = 1024 * 1024 * 10; //10 MB splitsize
$part = 1;
$cps = (substr(strtolower($filesource), -2) == "gz") ? 1 : 0;
// we compare the string size with this value (not the real filesie)
//so if file is compressed we need to adjust it
if ($cps == 1) $max_filesize *= 7;
$filedestination = $db_name . '_' . date("Y_m_d_H_i", time());
echo "
" . sprintf($lang['L_CONVERT_FILEREAD'], $filesource) . ".....
";
if (file_exists($config['paths']['backup'] . $filedestination)) unlink($config['paths']['backup'] . $filedestination);
$f = ($cps == 1) ? gzopen($config['paths']['backup'] . $filesource, "r") : fopen($config['paths']['backup'] . $filesource, "r");
$z = ($cp == 1) ? gzopen($config['paths']['backup'] . $filedestination . '_part_1.sql.gz', "w") : fopen($config['paths']['backup'] . $filedestination . '_part_1.sql', "w");
$zeile = getPseudoStatusline($part, $db_name) . "\r\n";
($cp == 1) ? gzwrite($z, $zeile) : fwrite($z, $zeile);
$zeile = '';
flush();
$insert = $mode = "";
$n = 0;
$eof = ($cps == 1) ? gzeof($f) : feof($f);
$splitable = false; // can the file be splitted? Try to avoid splitting before a command is completed
WHILE (!$eof)
{
flush();
$eof = ($cps == 1) ? gzeof($f) : feof($f);
$zeile = ($cps == 1) ? gzgets($f, 5144000) : fgets($f, 5144000);
$t = strtolower(substr($zeile, 0, 10));
if ($t > '')
{
switch ($t)
{
case 'insert int':
{
// eine neue Insert Anweisung beginnt
if (strpos($zeile, '(') === false)
{
//Feldnamen stehen in der naechsten Zeile - holen
$zeile .= "\n\r";
$zeile .= ($cps == 1) ? trim(gzgets($f, 8192)) : trim(fgets($f, 8192));
$zeile .= ' ';
}
// get INSERT-Satement
$insert = substr($zeile, 0, strpos($zeile, '('));
if (substr(strtoupper($insert), -7) != 'VALUES ') $insert .= ' VALUES ';
$mode = 'insert';
$splitable = false;
break;
}
case 'create tab':
{
$mode = 'create';
WHILE (substr(rtrim($zeile), -1) != ';')
{
$zeile .= fgets($f, 8192);
}
$zeile = setBackticks($zeile) . "\n\r";
$splitable = true;
break;
}
}
}
if ($mode == 'insert')
{
if (substr(rtrim($zeile), strlen($zeile) - 3, 2) == ');') $splitable = true;
// Komma loeschen
$zeile = str_replace('),(', ");\n\r" . $insert . ' (', $zeile);
}
if ($splitable == true && $filesize > $max_filesize) // start new file?
{
$part++;
if ($mode == 'insert') // Insert -> first complete Insert-Statement, then begin new file
{
if ($cp == 1)
{
gzwrite($z, $zeile);
gzclose($z);
$z = gzopen($config['paths']['backup'] . $filedestination . '_part_' . $part . '.sql.gz', "w");
$zeile = getPseudoStatusline($part, $db_name) . "\r\n";
gzwrite($z, $zeile);
$zeile = '';
}
else
{
fwrite($z, $zeile);
fclose($z);
$z = fopen($config['paths']['backup'] . $filedestination . '_part_' . $part . '.sql', "w");
$zeile = getPseudoStatusline($part, $db_name) . "\r\n";
gzwrite($z, $zeile);
$zeile = '';
}
}
else // first close last file, then begin new one and write new beginning command
{
if ($cp == 1)
{
gzclose($z);
$z = gzopen($config['paths']['backup'] . $filedestination . '_part_' . $part . '.sql.gz', "w");
$zeile = getPseudoStatusline($part, $filedestination) . "\r\n" . $zeile;
gzwrite($z, $zeile);
}
else
{
fclose($z);
$z = fopen($config['paths']['backup'] . $filedestination . '_part_' . $part . '.sql', "w");
$zeile = getPseudoStatusline($part, $filedestination) . "\r\n" . $zeile;
fwrite($z, $zeile);
}
$n = 0;
}
$filesize = 0;
$splitable = false;
}
else // no, append to actual file
{
$filesize += strlen($zeile);
if ($n > 200)
{
$n = 0;
echo '
';
}
echo '.';
if ($cps == 1) gzwrite($z, $zeile);
else fwrite($z, $zeile);
flush();
}
$n++;
}
$zeile = "\n-- EOB";
if ($cps == 1)
{
gzwrite($z, $zeile);
gzclose($z);
}
else
{
fwrite($z, $zeile);
fclose($z);
}
if ($cps == 1) gzclose($f);
else fclose($f);
echo '' . sprintf($lang['L_CONVERT_FINISHED'], $filedestination) . '
';
}
/**
* Create a dummy statusline.
*
* Used when converting a file, to create a legal MSD-Multipart-File.
*
* @param integer $part
* @param string $db_name
* @return string
*/
function getPseudoStatusline($part, $db_name)
{
if ($part > 1) echo '
Continue with part: ' . $part . '
';
$ret = '-- Status:-1:-1:MP_' . ($part) . ':' . $db_name . ":php:converter2:converted:unknown:1:::latin1:EXTINFO\r\n" . "-- TABLE-INFO\r\n" . "-- TABLE|unknown|0|0|2009-01-24 20:39:39\r\n" . "-- EOF TABLE-INFO\r\n";
return $ret;
}
/**
* Read information from all backup files in folder work/backup and return multidimensional array
* containing all info.
*
* @return array
*/
function getBackupfileInfo()
{
global $config;
clearstatcache();
$files = Array();
$dh = opendir($config['paths']['backup']);
while (false !== ($filename = readdir($dh)))
{
if ($filename != '.' && $filename != '..' && !is_dir($config['paths']['backup'] . $filename))
{
$files[]['name'] = $filename;
}
}
$arrayindex = 0;
$total_filesize = 0;
$db_backups = array();
$db_summary_anzahl = array();
$db_summary_last = array();
if (count($files) > 0)
{
for ($i = 0; $i < sizeof($files); $i++)
{
// filesize
$size = filesize($config['paths']['backup'] . $files[$i]['name']);
$file_datum = date("d\.m\.Y H:i", filemtime($config['paths']['backup'] . $files[$i]['name']));
$statusline = ReadStatusline($files[$i]['name']);
$backup_timestamp = GetTimestampFromFilename($files[$i]['name']);
$pathinfo = pathinfo($files[$i]['name']);
$file_extension = $pathinfo['extension'];
if ($backup_timestamp == '') $backup_timestamp = $file_datum;
$database_name = $statusline['dbname'];
// check for some special cases
if ($database_name == 'unknown') $database_name = '~unknown'; // needed for sorting - place unknown files at the end
if ($statusline['comment'] == 'converted') $database_name = '~converted'; // converted fiels
//jetzt alle in ein Array packen
if ($statusline['part'] == 'MP_0' || $statusline['part'] == '')
{
$db_backups[$arrayindex]['name'] = $files[$i]['name'];
$db_backups[$arrayindex]['db'] = $database_name;
$db_backups[$arrayindex]['extension'] = $file_extension;
$db_backups[$arrayindex]['size'] = $size;
$db_backups[$arrayindex]['date'] = $backup_timestamp;
$db_backups[$arrayindex]['sort'] = getSortableDate($backup_timestamp);
$db_backups[$arrayindex]['tables'] = $statusline['tables'];
$db_backups[$arrayindex]['records'] = $statusline['records'];
$db_backups[$arrayindex]['multipart'] = 0;
$db_backups[$arrayindex]['comment'] = $statusline['comment'];
$db_backups[$arrayindex]['script'] = ($statusline['script'] != '') ? $statusline['script'] . '(' . $statusline['scriptversion'] . ')' : '';
$db_backups[$arrayindex]['charset'] = $statusline['charset'];
$db_backups[$arrayindex]['mysqlversion'] = $statusline['mysqlversion'];
if (!isset($db_summary_last[$database_name])) $db_summary_last[$database_name] = $backup_timestamp;
$db_summary_anzahl[$database_name] = (isset($db_summary_anzahl[$database_name])) ? $db_summary_anzahl[$database_name] + 1 : 1;
$db_summary_size[$database_name] = (isset($db_summary_size[$database_name])) ? $db_summary_size[$database_name] + $size : $size;
if (getSortableDate($backup_timestamp) > getSortableDate($db_summary_last[$database_name])) $db_summary_last[$database_name] = $backup_timestamp;
}
else
{
//v($statusline);
//list multipart files only once but keep info how many files belong to this backup
$done = 0;
if (!isset($db_summary_size[$database_name])) {
$db_summary_size[$database_name] = 0;
}
for ($j = 0; $j < $arrayindex; $j++)
{
if (isset($db_backups[$j]))
{
if (($db_backups[$j]['date'] == $backup_timestamp) && $db_backups[$j]['db'] == $database_name && $db_backups[$j]['extension'] == $file_extension)
{
$db_backups[$j]['mysqlversion'] = $statusline['mysqlversion'];
$db_backups[$j]['multipart']++;
$db_backups[$j]['size'] += $size; // calculate size for this multipart backup
$db_summary_size[$database_name] += $size; // calculate total size for this database
$done = 1;
break;
}
}
}
if ($done == 1) $arrayindex--;
if ($done == 0)
{
//new entry for this backup with this timestamp
$db_backups[$arrayindex]['name'] = $files[$i]['name'];
$db_backups[$arrayindex]['db'] = $database_name;
$db_backups[$arrayindex]['extension'] = $file_extension;
$db_backups[$arrayindex]['size'] = $size;
$db_backups[$arrayindex]['date'] = $backup_timestamp;
$db_backups[$arrayindex]['sort'] = getSortableDate($backup_timestamp);
$db_backups[$arrayindex]['tables'] = $statusline['tables'];
$db_backups[$arrayindex]['records'] = $statusline['records'];
$db_backups[$arrayindex]['multipart'] = 1;
$db_backups[$arrayindex]['comment'] = $statusline['comment'];
$db_backups[$arrayindex]['script'] = ($statusline['script'] != "") ? $statusline['script'] . "(" . $statusline['scriptversion'] . ")" : "";
$db_backups[$arrayindex]['charset'] = $statusline['charset'];
if (!isset($db_summary_last[$database_name])) $db_summary_last[$database_name] = $backup_timestamp;
$db_summary_anzahl[$database_name] = (isset($db_summary_anzahl[$database_name])) ? $db_summary_anzahl[$database_name] + 1 : 1;
$db_summary_size[$database_name] = (isset($db_summary_size[$database_name])) ? $db_summary_size[$database_name] + $size : $size;
if (getSortableDate($backup_timestamp) > getSortableDate($db_summary_last[$database_name])) $db_summary_last[$database_name] = $backup_timestamp;
}
}
$arrayindex++;
$total_filesize += $size; // calculate overall file size
}
}
if ((isset($db_backups)) && (is_array($db_backups))) $db_backups = arfsort($db_backups, get_orderarray('sort,d|name,A'));
// merge infos into one array
$info = array();
$info['filesize_total'] = $total_filesize; // total size of all files
$info['files'] = $db_backups; // info per file
unset($db_backups);
$info['databases'] = array();
foreach ($db_summary_anzahl as $db => $count)
{
$info['databases'][$db]['backup_count'] = $count;
$info['databases'][$db]['backup_size_total'] = $db_summary_size[$db];
$info['databases'][$db]['latest_backup_timestamp'] = $db_summary_last[$db];
}
return $info;
}