Files
EasySoft-ZenTaoPMS/lib/zdb/zdb.class.php
2016-01-04 09:43:24 +08:00

199 lines
5.5 KiB
PHP

<?php
/**
* The zdb library of zentaopms, can be used to bakup and restore a database.
*
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
* @license ZPL (http://zpl.pub/page/zplv12.html)
* @author Yidong Wang <yidong@cnezsoft.com>
* @package Zdb
* @version $Id$
* @link http://www.zentao.net
*/
class zdb
{
/**
* dbh
*
* @var object
* @access public
*/
public $dbh;
/**
* Construct
*
* @access public
* @return void
*/
public function __construct()
{
global $dbh;
$this->dbh = $dbh;
}
/**
* Dump db.
*
* @param string $fileName
* @param array $tables
* @access public
* @return object
*/
public function dump($fileName, $tables = array())
{
global $config;
/* Init the return. */
$return = new stdclass();
$return->result = true;
$return->error = '';
/* Get all tables in database. */
$allTables = array();
$stmt = $this->dbh->query("show full tables");
while($table = $stmt->fetch(PDO::FETCH_ASSOC))
{
$tableName = $table["Tables_in_{$config->db->name}"];
$tableType = strtolower($table['Table_type']);
$allTables[$tableName] = $tableType == 'base table' ? 'table' : $tableType;
}
/* Dump all tables when tables is empty. */
if(empty($tables)) $tables = $allTables;
/* Check file. */
if(empty($fileName))
{
$return->result = false;
$return->error = 'Has not file';
return $return;
}
if(!is_writable(dirname($fileName)))
{
$return->result = false;
$return->error = 'The directory is not writable';
return $return;
}
/* Open this file. */
$fp = fopen($fileName, 'w');
fwrite($fp, "SET NAMES utf8;\n");
foreach($tables as $table => $tableType)
{
/* Check table exists. */
if(!isset($allTables[$table])) continue;
/* Create sql code. */
$backupSql = "DROP " . strtoupper($tableType) . " IF EXISTS `$table`;\n";
$backupSql .= $this->getSchemaSQL($table, $tableType);
fwrite($fp, $backupSql);
if($tableType != 'table') continue;
$rows = $this->dbh->query("select * from `$table`");
while($row = $rows->fetch(PDO::FETCH_ASSOC))
{
/* Create key sql for insert. */
$keys = array_keys($row);
$keys = array_map('addslashes', $keys);
$keys = join('`,`', $keys);
$keys = "`" . $keys . "`";
/* Create a value sql. */
$value = array_values($row);
$value = array_map('addslashes', $value);
$value = join("','", $value);
$value = "'" . $value . "'";
$sql = "INSERT INTO `$table`($keys) VALUES (" . $value . ");\n";
/* Write sql code. */
fwrite($fp, $sql);
}
}
fclose($fp);
return $return;
}
/**
* Import DB
*
* @access public
* @return object;
*/
public function import($fileName)
{
$return = new stdclass();
$return->result = true;
$return->error = '';
if(!file_exists($fileName))
{
$return->result = false;
$return->error = "File is not exists";
return $return;
}
$fp = fopen($fileName, 'r');
$sqlEnd = 0;
while(($buffer = fgets($fp)) !== false)
{
$line = trim($buffer);
if(empty($line)) continue;
if($sqlEnd == 0) $sql = '';
$quotNum = substr_count($line, "'") - substr_count($line, "\'");
if(substr($line, -1) == ';' and $quotNum % 2 == 0 and $sqlEnd == 0)
{
$sql .= $buffer;
}
elseif($quotNum % 2 == 1 and $sqlEnd == 0)
{
$sql .= $buffer;
$sqlEnd = 1;
}
elseif(substr($line, -1) == ';' and $quotNum % 2 == 1 and $sqlEnd == 1)
{
$sql .= $buffer;
$sqlEnd = 0;
}
elseif(substr($line, -1) == ';' and $quotNum % 2 == 0 and $sqlEnd == 2)
{
$sql .= $buffer;
$sqlEnd = 0;
}
else
{
$sql .= $buffer;
$sqlEnd = $sqlEnd == 0 ? 2 : $sqlEnd;
}
if($sqlEnd == 0)
{
try
{
$this->dbh->query($sql);
}
catch(PDOException $e)
{
$return->result = false;
$return->error = $e->getMessage();
return $return;
}
}
}
return $return;
}
/**
* Get schema SQL.
*
* @param string $table
* @access public
* @return string
*/
public function getSchemaSQL($table, $type = 'table')
{
$sql = "SHOW CREATE $type `$table`";
$createSql = $this->dbh->query($sql)->fetch(PDO::FETCH_ASSOC);
return $createSql['Create ' . ucfirst($type)] . ";\n";
}
}