Вход Регистрация
Файл: 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 (
$compress) gzwrite($fp, $value);
                else 
fwrite ($fp, $value);
                
$value = '';
            }
            
$value .= $this->_GetInserts($table,$fp,$compress);
        }
        
$value .= MSX_NL . MSX_NL;
        if (
$fp)
        {
            if (
$compress) gzwrite($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($result, 0);
        
        if (
$this->locks)
        {
            
$value .= 'LOCK TABLES ' . $table . ' WRITE;' . MSX_NL;
        }
        
$value .= $insert;
        if (
$fp)
        {
            if (
$compress) gzwrite($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+1 < $num_rows && $size < 900000 )
                {
                    if (
$compress) { $size += gzwrite($fp, ','); }
                    else { 
$size += fwrite ($fp, ','); }
                }
                else
                {
                    
$size = 0;
                    if (
$compress) gzwrite($fp, ';' . MSX_NL);
                    else 
fwrite ($fp, ';' . MSX_NL);
                    
                    if (
$j+1 < $num_rows)
                    {
                        if (
$compress) gzwrite($fp, $insert);
                        else 
fwrite ($fp, $insert);
                    }
                    else if (
$this->locks)
                    {
                        if (
$compress) gzwrite($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($values, 0, -1). '),';
                if (
$j+1 == $num_rows || ($j+1)%5000==0 )
                {
                    
$values = substr($values, 0, -1);
                    
$values = $values . ';' . MSX_NL;
                    if (
$j+1 < $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 (
$compress) gzwrite($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;
    }

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