GetTableCreate($TableNames[$x]);
- }
- }
-
- $fp = fopen($backupProgress['file_name'], 'a');
-
- $sql = "SELECT Name, Version FROM ".TABLE_PREFIX."Modules";
- $r = $this->Conn->Query($sql);
- foreach ($r AS $a_module) {
- $version = $a_module['Version'];
- fwrite($fp, "# ".$a_module['Name']." Version: $version;\n");
- }
- fwrite($fp, "#------------------------------------------\n\n");
-
- fwrite($fp,implode("\n",$out));
- fwrite($fp,"\n");
-
- fclose($fp);
-
- $this->Application->StoreVar('adm.backup_status', serialize($backupProgress));
- $event->redirect = 'tools/backup2';
- }
-
- /**
- * Perform next backup step
- *
- * @param kEvent $event
- */
- function OnBackupProgress(&$event)
- {
- $done_percent = $this->performBackup();
-
- if ($done_percent == 100) {
- $event->redirect = 'tools/backup3';
- return ;
- }
-
- echo $done_percent;
- $event->status = erSTOP;
- }
-
- /**
- * Stops Backup & redirect to Backup template
- *
- * @param kEvent $event
- */
- function OnBackupCancel(&$event)
- {
- $event->redirect = 'tools/backup1';
- }
-
- /**
- * Stops Restore & redirect to Restore template
- *
- * @param kEvent $event
- */
- function OnRestoreCancel(&$event)
- {
- $event->redirect = 'tools/restore1';
- }
-
- function performBackup()
- {
- $backupProgress = unserialize($this->Application->RecallVar('adm.backup_status'));
-// echo ""; print_r($backupProgress); echo "
";
-// exit;
- $CurrentTable = $backupProgress['table_names'][$backupProgress['table_num']];
-
- // get records
- $a_records = $this->insert_data($CurrentTable,$backupProgress['record_count'],50,"");
-// echo ""; print_r($a_records); echo "
";
-// exit;
-
- if ($a_records['num'] < 50) {
- $backupProgress['table_num']++;
-// if ($backupProgress['table_names'][$backupProgress['table_num']] == TABLE_PREFIX.'Cache') {
-// $backupProgress['table_num']++;
-// }
- $backupProgress['record_count'] = 0;
- } else {
- $backupProgress['record_count']+=50;
- }
-
- if ($a_records['sql']) {
- $fp = fopen($backupProgress['file_name'], 'a');
- fwrite($fp, $a_records['sql']);
- fclose($fp);
- }
- $percent = ($backupProgress['table_num'] / $backupProgress['table_count']) * 100;
- if ($percent >= 100) {
- $percent = 100;
- $this->Application->StoreVar('adm.backupcomplete_filename', $backupProgress['file_name']);
- $this->Application->StoreVar('adm.backupcomplete_filesize', round(filesize($backupProgress['file_name'])/1024/1024, 2)); // Mbytes
- } else {
- $this->Application->StoreVar('adm.backup_status', serialize($backupProgress));
- }
-
- return round($percent);
-
- }
-
- //extracts the rows of data from tables using limits
- function insert_data($table, $start, $limit, $mywhere)
- {
-// global $out;
-
- if ($mywhere !="")
- {
- $whereclause= " WHERE ".$mywhere." ";
- }
- else
- {
- $whereclause = "";
- }
-
- $a_data = $this->Conn->Query("SELECT * from $table $whereclause LIMIT $start, $limit");
-// echo "SELECT * from $table $whereclause LIMIT $start, $limit";
-// echo ""; print_r($a_records); echo "
";
-// exit;
- if (!$a_data) {
- return Array(
- 'num' => 0,
- 'sql' => '',
- );
- }
-// $prefix = GetTablePrefix();
- $rowcount = 0;
- $a_fields = array_keys($a_data[0]);
- $fields_sql = '';
- foreach ($a_fields AS $field_name) {
- $fields_sql .= '`'.$field_name.'`,';
- }
- $fields_sql = preg_replace('/(.*),$/', '\\1', $fields_sql);
- $temp = '';
- foreach ($a_data AS $a_row)
- {
- $values_sql = '';
- foreach ($a_row as $field_name => $field_value) {
- $values_sql .= $this->Conn->qstr($field_value).',';
- }
- $values_sql = preg_replace('/(.*),$/', '\\1', $values_sql);
- $sql = 'INSERT INTO '.$table.' ('.$fields_sql.') VALUES ('.$values_sql.');';
- $sql=ereg_replace("\n","\\n", $sql);
- $sql=ereg_replace("\r","\\r", $sql);
- $temp .= $sql."\n";
- }
-
- if(strlen(TABLE_PREFIX))
- {
- $temp = str_replace("INSERT INTO ".TABLE_PREFIX, "INSERT INTO ", $temp);
- }
-
- return Array(
- 'num' => count($a_data),
- 'sql' => $temp,
- );
- }
-
-
-
- function GetTableCreate($table, $crlf="\n")
- {
- $schema_create = 'DROP TABLE IF EXISTS ' . $table . ';' . $crlf;
- $schema_create .="# --------------------------------------------------------".$crlf;
- $this->Conn->Query("SET SQL_QUOTE_SHOW_CREATE = 0");
- $tmpres = $this->Conn->Query("SHOW CREATE TABLE $table");
-// echo ""; print_r($tmpres); echo "
";
-// exit;
- if(is_array($tmpres) && isset($tmpres[0]))
- {
- $tmpres = $tmpres[0];
- $pos = strpos($tmpres["Create Table"], ' (');
- $pos2 = strpos($tmpres["Create Table"], '(');
- if ($pos2 != $pos + 1)
- {
- $pos = $pos2;
- $tmpres["Create Table"] = str_replace(",", ",\n ", $tmpres["Create Table"]);
- }
-
- $tmpres["Create Table"] = substr($tmpres["Create Table"], 0, 13)
- . (($use_backquotes) ? $tmpres["Table"] : $tmpres["Table"])
- . substr($tmpres["Create Table"], $pos);
- $tmpres["Create Table"] = str_replace("\n", $crlf, $tmpres["Create Table"]);
- if (preg_match_all('((,\r?\n[\s]*(CONSTRAINT|FOREIGN[\s]*KEY)[^\r\n,]+)+)', $tmpres["Create Table"], $regs)) {
- if (!isset($sql_constraints)) {
- if (isset($GLOBALS['no_constraints_comments'])) {
- $sql_constraints = '';
- } else {
- $sql_constraints = $crlf . '#' . $crlf
- . '# ' . $GLOBALS['strConstraintsForDumped'] . $crlf
- . '#' . $crlf;
- }
- }
- if (!isset($GLOBALS['no_constraints_comments'])) {
- $sql_constraints .= $crlf .'#' . $crlf .'# ' . $GLOBALS['strConstraintsForTable'] . ' ' . $table . $crlf . '#' . $crlf;
- }
- $sql_constraints .= 'ALTER TABLE $table $crlf '
- . preg_replace('/(,\r?\n|^)([\s]*)(CONSTRAINT|FOREIGN[\s]*KEY)/', '\1\2ADD \3', substr($regs[0][0], 2))
- . ";\n";
- $tmpres["Create Table"] = preg_replace('((,\r?\n[\s]*(CONSTRAINT|FOREIGN[\s]*KEY)[^\r\n,]+)+)', '', $tmpres["Create Table"]);
- }
- $schema_create .= $tmpres["Create Table"];
- }
- if(strlen($schema_create))
- {
- $schema_create = str_replace("DROP TABLE IF EXISTS ".TABLE_PREFIX,"DROP TABLE ",$schema_create);
- $schema_create = str_replace("CREATE TABLE ".TABLE_PREFIX,"CREATE TABLE ",$schema_create);
- while(strlen($schema_create && substr($schema_create,-1)!=")"))
- {
- $schema_create = substr($schema_create,0,-1);
- }
- }
- $schema_create .= "\n# --------------------------------------------------------\n";
- return $schema_create;
- }
-
- /**
- * Deletes one backup file
- *
- * @param kEvent $event
- */
- function OnDeleteBackup(&$event)
- {
- @unlink($this->get_backup_file());
- }
-
- function get_backup_file()
- {
- return $this->Application->ConfigValue('Backup_Path').'/dump'.$this->Application->GetVar('backupdate').'.txt';
- }
-
- /**
- * Starts restore process
- *
- * @param kEvent $event
- */
- function OnRestore(&$event)
- {
- $file = $this->get_backup_file();
-
- $restoreProgress = Array (
- 'file_pos' => 0,
- 'file_name' => $file,
- 'file_size' => filesize($file),
- );
- $this->Application->RemoveVar('adm.restore_success');
- $this->Application->StoreVar('adm.restore_status', serialize($restoreProgress));
- $event->redirect = 'tools/restore3';
- }
-
- function OnRestoreProgress(&$event)
- {
- $done_percent = $this->performRestore();
-
- if ($done_percent == -3) {
- $event->redirect = 'tools/restore4';
- return ;
- }
-
- if ($done_percent < 0) {
- $this->Application->StoreVar('adm.restore_error', 'File read error'); $event->redirect = 'tools/restore4';
- return ;
- }
-
- if ($done_percent == 100) {
- $this->replaceRestoredFiles();
- $this->Application->StoreVar('adm.restore_success', 1);
- $event->redirect = 'tools/restore4';
- return ;
- }
-
- echo $done_percent;
- $event->status = erSTOP;
-
- }
-
- function replaceRestoredFiles()
- {
- // gather restored table names
- $tables = $this->Conn->GetCol('SHOW TABLES');
- $mask_restore_table = '/^restore'.TABLE_PREFIX.'(.*)$/';
- foreach($tables as $table)
- {
- if( preg_match($mask_restore_table,$table,$rets) )
- {
- $old_table = substr($table, 7);
- $this->Conn->Query('DROP TABLE IF EXISTS '.$old_table);
- $this->Conn->Query('CREATE TABLE '.$old_table.' LIKE '.$table);
- $this->Conn->Query('INSERT INTO '.$old_table.' SELECT * FROM '.$table);
- $this->Conn->Query('DROP TABLE '.$table);
- }
- }
-
- }
-
- function performRestore()
- {
- $restoreProgress = unserialize($this->Application->RecallVar('adm.restore_status'));
- $filename = $restoreProgress['file_name'];
- $FileOffset = $restoreProgress['file_pos'];
- $MaxLines = 200;
- $size = filesize($filename);
-
- if($FileOffset > $size) {
- return -2;
- }
-
- $fp = fopen($filename,"r");
- if(!$fp) {
- return -1;
- }
-
-
- if($FileOffset>0)
- {
- fseek($fp,$FileOffset);
- }
- else
- {
- $EndOfSQL = FALSE;
- $sql = "";
- while(!feof($fp) && !$EndOfSQL)
- {
- $l = fgets($fp);
- if(substr($l,0,11)=="INSERT INTO")
- {
- $EndOfSQL = TRUE;
- }
- else
- {
- $sql .= $l;
- $FileOffset = ftell($fp) - strlen($l);
- }
- }
- if(strlen($sql))
- {
- $error = $this->runSchemaText($sql);
- if ($error != '') {
-
- $this->Application->StoreVar('adm.restore_error', $error);
- return -3;
- }
- }
- fseek($fp,$FileOffset);
- }
-
- $LinesRead = 0;
- $sql = "";
- $AllSql = array();
- while($LinesRead < $MaxLines && !feof($fp))
- {
- $sql = fgets($fp);
- if(strlen($sql))
- {
- $AllSql[] = $sql;
- $LinesRead++;
- }
- }
- if(!feof($fp))
- {
- $FileOffset = ftell($fp);
- }
- else
- {
- $FileOffset = $size;
- }
- fclose($fp);
-
- if(count($AllSql)>0) {
- $error = $this->runSQLText($AllSql);
- if ($error != '') {
-
- $this->Application->StoreVar('adm.restore_error', $error);
- return -3;
- }
-
- }
- $restoreProgress['file_pos'] = $FileOffset;
- $this->Application->StoreVar('adm.restore_status', serialize($restoreProgress));
-
- return round($FileOffset/$size * 100);
-// $this->Application->StoreVar('adm.restore_error', 'lalalal');
-// $event->redirect = 'tools/restore4';
- }
-
-
- function runSchemaText($sql)
- {
- $table_prefix = 'restore'.TABLE_PREFIX;
-// $table_prefix = TABLE_PREFIX;
- if(strlen($table_prefix))
- {
- $what = "CREATE TABLE ";
- $replace = "CREATE TABLE ".$table_prefix;
- $sql = ereg_replace($what, $replace, $sql);
-
- $what = "DROP TABLE ";
- $replace = "DROP TABLE IF EXISTS ".$table_prefix;
- $sql = ereg_replace($what, $replace, $sql);
-
- $what = "INSERT INTO ";
- $replace = "INSERT INTO ".$table_prefix;
- $sql = ereg_replace($what, $replace, $sql);
-
- $what = "UPDATE ";
- $replace = "UPDATE ".$table_prefix;
- $sql = ereg_replace($what, $replace, $sql);
-
- $what = "ALTER TABLE ";
- $replace = "ALTER TABLE ".$table_prefix;
- $sql = ereg_replace($what, $replace, $sql);
- }
-
- $commands = explode("# --------------------------------------------------------",$sql);
- if(count($commands)>0)
- {
-// $query_func = getConnectionInterface('query',$dbo_type);
-// $errorno_func = getConnectionInterface('errorno',$dbo_type);
-// $errormsg_func = getConnectionInterface('errormsg',$dbo_type);
-
- for($i = 0; $i < count($commands); $i++)
- {
- $cmd = $commands[$i];
- $cmd = trim($cmd);
- if(strlen($cmd)>0)
- {
- $this->Conn->Query($cmd);
- if($this->Conn->errorCode != 0)
- {
- return $this->Conn->errorMessage." COMMAND:$cmd
";
- }
- }
- }
- }
- }
-
- function runSQLText($allsql)
- {
- $line = 0;
-// $query_func = getConnectionInterface('query',$dbo_type);
-// $errorno_func = getConnectionInterface('errorno',$dbo_type);
-// $errormsg_func = getConnectionInterface('errormsg',$dbo_type);
-
- while($line0 && substr($sql,0,1)!="#")
- {
- $table_prefix = 'restore'.TABLE_PREFIX;
- if(strlen($table_prefix))
- {
- $what = "CREATE TABLE ";
- $replace = "CREATE TABLE ".$table_prefix;
- $sql = ereg_replace($what, $replace, $sql);
-
- $what = "DELETE FROM ";
- $replace = "DELETE FROM ".$table_prefix;
- $sql = ereg_replace($what, $replace, $sql);
-
- $what = "DROP TABLE ";
- $replace = "DROP TABLE IF EXISTS ".$table_prefix;
- $sql = ereg_replace($what, $replace, $sql);
-
- $what = "INSERT INTO ";
- $replace = "INSERT INTO ".$table_prefix;
- $sql = ereg_replace($what, $replace, $sql);
-
- $what = "REPLACE INTO ";
- $replace = "REPLACE INTO ".$table_prefix;
- $sql = ereg_replace($what, $replace, $sql);
-
- $what = "UPDATE ";
- $replace = "UPDATE ".$table_prefix;
- $sql = ereg_replace($what, $replace, $sql);
-
- $what = "ALTER TABLE ";
- $replace = "ALTER TABLE ".$table_prefix;
- $sql = ereg_replace($what, $replace, $sql);
- }
- $sql = trim($sql);
- if(strlen($sql)>0)
- {
- $this->Conn->Query($sql);
-
- if($this->Conn->errorCode != 0)
- {
- return $this->Conn->errorMessage." COMMAND:$sql
";
- }
- }
- }
- $line++;
- }
- }
-
-
- /**
- * Starts restore process
- *
- * @param kEvent $event
- */
- function OnSqlQuery(&$event)
- {
- $sql = $this->Application->GetVar('sql');
- if ($sql) {
- $start = $this->getMoment();
- $result = $this->Conn->Query($sql);
- $this->Application->SetVar('sql_time', round($this->getMoment() - $start, 7));
-
-
- if ($result)
- {
- if (is_array($result))
- {
- $this->Application->SetVar('sql_has_rows', 1);
- $this->Application->SetVar('sql_rows', serialize($result));
- }
- }
-
- $check_sql = trim(strtolower($sql));
- if (
- (substr($check_sql, 0, 6) == 'insert')
- || (substr($check_sql, 0, 6) == 'update')
- || (substr($check_sql, 0, 7) == 'replace')
- || (substr($check_sql, 0, 6) == 'delete')
- ) {
- $this->Application->SetVar('sql_has_affected', 1);
- $this->Application->SetVar('sql_affected', $this->Conn->getAffectedRows());
- }
-
- }
- $this->Application->SetVar('query_status', 1);
- $event->status = erFAIL;
- }
-
- function getMoment()
- {
- list($usec, $sec) = explode(' ', microtime());
- return ((float)$usec + (float)$sec);
- }
-
- /**
- * Occurs after unit config cache was successfully rebuilt
- *
- * @param kEvent $event
- */
- function OnAfterCacheRebuild(&$event)
- {
-
- }
-
- /**
- * Removes "Community -> Groups" section when it is not allowed
- *
- * @param kEvent $event
- */
- function OnAfterConfigRead(&$event)
- {
- parent::OnAfterConfigRead($event);
-
- if (!$this->Application->ConfigValue('AdvancedUserManagement')) {
- $section_ajustments = $this->Application->getUnitOption($event->Prefix, 'SectionAdjustments');
- if (!$section_ajustments) {
- $section_ajustments = Array ();
- }
-
- $section_ajustments['in-portal:user_groups'] = 'remove';
-
- $this->Application->setUnitOption($event->Prefix, 'SectionAdjustments', $section_ajustments);
- }
- }
-
- /**
- * Saves menu (tree) frame width
- *
- * @param kEvent $event
- */
- function OnSaveMenuFrameWidth(&$event)
- {
- $event->status = erSTOP;
-
- if (!$this->Application->ConfigValue('ResizableFrames')) {
- return ;
- }
-
- $sql = 'UPDATE ' . $this->Application->getUnitOption('conf', 'TableName') . '
- SET VariableValue = ' . (int)$this->Application->GetVar('width') . '
- WHERE VariableName = "MenuFrameWidth"';
- $this->Conn->Query($sql);
-
- if ($this->Conn->getAffectedRows()) {
- $this->Application->UnitConfigReader->ResetParsedData(false);
- }
- }
-
-}
\ No newline at end of file