Вход Регистрация
Файл: boot/sub_classes/backup.class.php
Строк: 171
<?php

/**
* @name        JMY CMS
* @link        http://jmy.su/
* @copyright   Copyright (C) 2012-2014 JMY LTD
* @license     LICENSE.txt (see attached file)
* @version     VERSION.txt (see attached file)
* @author      Komarov Ivan
* @outside     MySQL DB backup class, version 1.0.1
*/

define('MSX_VERSION''1.0.1');
define('MSX_NL'"n");
define('MSX_STRING'0);
define('MSX_DOWNLOAD'1);
define('MSX_SAVE'2);
define('MSX_APPEND'3);


class 
MySQL_DB_Backup
{

    var 
$server 'localhost';
    var 
$port 3306;
    var 
$username 'root';
    var 
$password '';
    var 
$database '';
    var 
$link_id = -1;
    var 
$connected false;
    var 
$tables = array();
    var 
$create_tables true;
    var 
$drop_tables true;
    var 
$struct_only false;
    var 
$locks true;
    var 
$comments true;
    var 
$backup_dir '';
    var 
$fname_format 'd_m_y__H_i_s';
    var 
$error '';
    var 
$null_values = array( '0000-00-00''00:00:00''0000-00-00 00:00:00');

    function 
Execute($task MSX_STRING$dname ''$compress false)
    {
        
$fp false;
        if (
$task == MSX_APPEND || $task == MSX_SAVE || $task == MSX_DOWNLOAD)
        {
            
$tmp_name $dname;
            if (empty(
$tmp_name) || $task == MSX_DOWNLOAD)
            {
                
$tmp_name date($this->fname_format);
                
$tmp_name .= ($compress '.sql.gz' '.sql');
                if (empty(
$dname))                
                {
                    
$dname $tmp_name;
                }
            }
            
$fname $this->backup_dir.$tmp_name;
            if (!(
$fp $this->_OpenFile($fname$task$compress)))
            {
                return 
false;
            }
        }
        if (!(
$sql $this->_Retrieve($fp$compress)))
        {
            return 
false;
        }

        if (
$task == MSX_DOWNLOAD)
        {
            
$this->_CloseFile($fp$compress);
            return 
$this->_DownloadFile($fname$dname);
        }
        else if (
$task == MSX_APPEND || $task == MSX_SAVE)
        {
            
$this->_CloseFile($fp$compress);
            return 
true;
        }
        else
        {
            return 
$sql;
        }
    }


    function 
_Connect()
    {
        
$value false;
        if (!
$this->connected)
        {
            if (!
$this->server$this->server 'localhost';
            
$host $this->server;
            if (
$this->port$host .= ':' $this->port;
            
$this->link_id mysql_connect($host$this->username$this->password);
        }
        if (
$this->link_id 0)
        {
            if (empty(
$this->database))
            {
                
$value true;
            }
            elseif (
$this->link_id !== -1)
            {
                
$value mysql_select_db($this->database$this->link_id);
            }
            else
            {
                
$value mysql_select_db($this->database);
            }
        }
        if (!
$value)
        {
            
$this->error mysql_error();
        }
        return 
$value;
    }

    function 
_Query($sql)
    {
        if (
$this->link_id !== -1)
        {
            
$result mysql_query($sql$this->link_id);
        }
        else
        {
            
$result mysql_query($sql);
        }
        if (!
$result)
        {
            
$this->error mysql_error();
        }
        return 
$result;
    }

    function 
_GetTables()
    {
        
$value = array();
        if (!(
$result $this->_Query('SHOW TABLES')))
        {
            return 
false;
        }
        while (
$row mysql_fetch_row($result))
        {
            if (empty(
$this->tables) || in_array($row[0], $this->tables))
            {
                
$value[] = $row[0];
            }
        }
        if (!
sizeof($value))
        {
            
$this->error 'Таблицы в базе данных не найдены!';
            return 
false;
        }
        return 
$value;
    }

    function 
_DumpTable($table$fp$compress)
    {
        
$value '';
        
$this->_Query('LOCK TABLES ' $table ' WRITE');
        if (
$this->create_tables)
        {
            if (
$this->comments)
            {
                
$value .= '# ' MSX_NL;
                
$value .= '# Table structure for table `' $table '`' MSX_NL;
                
$value .= '# ' MSX_NL MSX_NL;
            }
            if (
$this->drop_tables)
            {
                
$value .= 'DROP TABLE IF EXISTS `' $table '`;' MSX_NL;
            }
            if (!(
$result $this->_Query('SHOW CREATE TABLE ' $table)))
            {
                return 
false;
            }
            
$row mysql_fetch_assoc($result);
            
$value .= str_replace("n"MSX_NL$row['Create Table']) . ';';
            
$value .= MSX_NL MSX_NL;
        }
        if (!
$this->struct_only)
        {
            if (
$this->comments)
            {
                
$value .= '# ' MSX_NL;
                
$value .= '# Dumping data for table `' $table '`' MSX_NL;
                
$value .= '# ' MSX_NL MSX_NL;
            }
            if (
$fp)
            {
                if (
$compressgzwrite($fp$value);
                else 
fwrite ($fp$value);
                
$value '';
            }
            
$value .= $this->_GetInserts($table,$fp,$compress);
        }
        
$value .= MSX_NL MSX_NL;
        if (
$fp)
        {
            if (
$compressgzwrite($fp$value);
            else 
fwrite ($fp$value);
            
$value true;
        }
        
$this->_Query('UNLOCK TABLES');
        return 
$value;
    }

    function 
_GetInserts($table$fp$compress)
    {
        
$value '';
        if (!(
$result $this->_Query('SELECT * FROM ' $table)))
        {
            return 
false;
        }
        
$num_rows mysql_num_rows($result);
        if (
$num_rows == 0)
        {
            return 
$value;
        }
        
$insert 'INSERT INTO `' $table '`';
        
$row mysql_fetch_assoc($result);
        
$insert .= ' (`' implode('`,`'array_keys($row)) . '`)';
        
$insert .= ' VALUES ';
            
        
$fields count($row);
        
mysql_data_seek($result0);
        
        if (
$this->locks)
        {
            
$value .= 'LOCK TABLES ' $table ' WRITE;' MSX_NL;
        }
        
$value .= $insert;
        if (
$fp)
        {
            if (
$compressgzwrite($fp$value);
            else 
fwrite ($fp$value);
            
$value '';
        }
        
        
$j=0;
        
$size 0;
        while (
$row mysql_fetch_row($result))
        {
            if (
$fp)
            {
                
$i 0;
                
$value true;
                if (
$compress) { $size += gzwrite($fp'('); }
                else { 
$size += fwrite ($fp'('); }
                for(
$x =0$x $fields$x++)
                {
                    if (!isset(
$row[$x]) || in_array($row[$x], $this->null_values))
                    {
                        
$row[$x] = 'NULL';
                    }
                    else 
                    {
                        
$row[$x] = ''' . str_replace("n","\n",addslashes($row[$x])) . ''';
                    }
                    if (
$i 0)
                    {
                        if (
$compress) { $size += gzwrite($fp','); }
                        else { 
$size += fwrite ($fp','); }
                    }

                    if (
$compress) { $size += gzwrite($fp$row[$x]); }
                    else { 
$size += fwrite ($fp,  $row[$x]); }

                    
$i++;
                }
                if (
$compress) { $size += gzwrite($fp')'); }
                else { 
$size += fwrite ($fp')'); }

                if (
$j+$num_rows && $size 900000 )
                {
                    if (
$compress) { $size += gzwrite($fp','); }
                    else { 
$size += fwrite ($fp','); }
                }
                else
                {
                    
$size 0;
                    if (
$compressgzwrite($fp';' MSX_NL);
                    else 
fwrite ($fp';' MSX_NL);
                    
                    if (
$j+$num_rows)
                    {
                        if (
$compressgzwrite($fp$insert);
                        else 
fwrite ($fp$insert);
                    }
                    else if (
$this->locks)
                    {
                        if (
$compressgzwrite($fp'UNLOCK TABLES;' MSX_NL);
                        else 
fwrite ($fp'UNLOCK TABLES;' MSX_NL);
                    }
                }
                unset (
$value);
                
$value '';
            }
            else
            {
                
$values '(';
                for(
$x =0$x $fields$x++)
                {
                    if (!isset(
$row[$x]) || in_array($row[$x], $this->null_values))
                    {
                        
$row[$x] = 'NULL';
                    }
                    else 
                    {
                        
$row[$x] = ''' . str_replace("n","\n",addslashes($row[$x])) . ''';
                    }
                    
$values .= $row[$x] . ',';
                }
                
$values substr($values0, -1). '),';
                if (
$j+== $num_rows || ($j+1)%5000==)
                {
                    
$values substr($values0, -1);
                    
$values $values ';' MSX_NL;
                    if (
$j+$num_rows)
                    {
                        
$values .= $insert;
                    }
                    else
                    {
                        if (
$this->locks)
                        {
                            
$values .= 'UNLOCK TABLES;' MSX_NL;
                        }
                        
$values .= MSX_NL;
                    }
                }
                
$value .= $values;
            }
            
$j++;
            unset (
$row);
        }
        
        return 
$value;
    }

    function 
_Retrieve($fp$compress)
    {
        
$value '';
        if (!
$this->_Connect())
        {
            return 
false;
        }
        if (
$this->comments)
        {
            
$value .= '# ' MSX_NL;
            
$value .= '# MySQL database dump' MSX_NL;
            
$value .= '# Created by MySQL_Backup class, ver. ' MSX_VERSION MSX_NL;
            
$value .= '# ' MSX_NL;
            
$value .= '# Host: ' $this->server MSX_NL;
            
$value .= '# Generated: ' date('M j, Y') . ' at ' date('H:i') . MSX_NL;
            
$value .= '# MySQL version: ' mysql_get_server_info() . MSX_NL;
            
$value .= '# PHP version: ' phpversion() . MSX_NL;
            if (!empty(
$this->database))
            {
                
$value .= '# ' MSX_NL;
                
$value .= '# Database: `' $this->database '`' MSX_NL;
            }
            
$value .= '# ' MSX_NL MSX_NL MSX_NL;
            if (
$fp)
            {
                if (
$compressgzwrite($fp$value);
                else 
fwrite ($fp$value);
                unset(
$value);
                
$value '';
            }
        }
        if (!(
$tables $this->_GetTables()))
        {
            return 
false;
        }
        foreach (
$tables as $table)
        {
            if (!(
$table_dump $this->_DumpTable($table,$fp,$compress)))
            {
                return 
false;
            }
            if (
$fp)
            {
                
$value true;
            }
            else
            {
                
$value .= $table_dump;
            }
        }
        return 
$value;
    }

    function 
_OpenFile($fname$task$compress)
    {
        if (
$task != MSX_APPEND && $task != MSX_SAVE && $task != MSX_DOWNLOAD)
        {
            
$this->error 'Tried to open file in wrong task.';
            return 
false;
        }
        
        
$mode 'w';
        if (
$task == MSX_APPEND && file_exists($fname))
        {
            
$mode 'a';
        }
        
        if (
$compress$fp gzopen($fname$mode '9');
        else 
$fp fopen($fname$mode);

        if (!
$fp)
        {
            
$this->error 'Can't create the output file.';
            return false;
        }
        return $fp;
    }

    function _CloseFile($fp, $compress)
    {
        if ($compress)
        {
            return gzclose($fp);
        }
        else
        {
            return fclose($fp);
        }
    }

    function _DownloadFile($fname, $dname)
    {
        $fp = fopen($fname, '
rb');
        if (!$fp)
        {
            $this->error = '
Can't open temporary file.';
            return 
false;
        }
        
header('Content-disposition: filename=' $dname);
        
header('Content-type: application/octetstream');
        
header('Pragma: no-cache');
        
header('Expires: 0');
        while (
$value fread($fp,8192))
        {
            echo 
$value;
            unset (
$value);
        }
        
fclose($fp);
        
unlink ($fname);

        return 
true;
    }

}
?>
Онлайн: 0
Реклама