2013-01-30 21:51:28 -05:00

352 lines
12 KiB
PHP

<?php
/*********************************************************************************
** The contents of this file are subject to the vtiger CRM Public License Version 1.0
* ("License"); You may not use this file except in compliance with the License
* The Original Code is: vtiger CRM Open Source
* The Initial Developer of the Original Code is vtiger.
* Portions created by vtiger are Copyright (C) vtiger.
* All Rights Reserved.
*
*********************************************************************************
*/
require_once("config.php");
require_once("include/database/PearDatabase.php");
define("dbserver", $dbconfig['db_hostname']);
define("dbuser", $dbconfig['db_username']);
define("dbpass", $dbconfig['db_password']);
define("dbname", $dbconfig['db_name']);
function save_structure($filename, $root_directory) {
global $log;
$log->debug("Entering save_structure(".$filename.",".$root_directory.") method ...");
$dbdump = new DatabaseDump(dbserver, dbuser, dbpass);
$dumpfile = $root_directory.'/'.$filename;
$dbdump->save(dbname, $dumpfile) ;
$log->debug("Exiting save_structure method ...");
}
/**
* DatabaseDump will save the dump of database to the file specified.
*
* The dump file contains series of SQL statements (with some meta information)
* generated similar to mysqldump command.
*
* To restore back the dump you can use the 'source' command in sql.
* Like:
* mysql> create database dbname;
* mysql> use dbname;
* mysql> source sql_dump_file;
*
* @author Prasad
*/
class DatabaseDump {
private $fhandle;
function DatabaseDump($dbserver, $username, $password) {
mysql_connect($dbserver, $username, $password);
}
function save($database, $filename) {
// Connect to database
$db = mysql_select_db($database);
$db_charset = mysql_fetch_assoc(mysql_query("SHOW variables LIKe'character_set_database'"));
if($db_charset['Value']=='utf8'){
mysql_query("SET NAMES 'utf8'");
}
if(empty($db)) {
return;
}
$this->file_open($filename);
// Write some information regarding database dump and the time first.
$this->writeln("SET NAMES 'utf8';");
$this->writeln("-- $database database dump");
$this->writeln("-- Date: " . date("D, M j, G:i:s T Y"));
$this->writeln("-- ----------------------------------");
$this->writeln("");
// Meta information which helps to import into mysql database.
$this->writeln("SET FOREIGN_KEY_CHECKS=0;");
$this->writeln("SET SQL_MODE='NO_AUTO_VALUE_ON_ZERO';");
$this->writeln("");
// Get all table names from database
$tcount = 0;
$trs = mysql_list_tables($database);
for($tindex = 0; $tindex < mysql_num_rows($trs); $tindex++) {
$table = mysql_tablename($trs, $tindex);
if(!empty($table)) {
$tables[$tcount] = mysql_tablename($trs, $tindex);
$tcount++;
}
}
// List tables
$dump = '';
for($tindex = 0; $tindex < count($tables); $tindex++) {
// Table Name
$table = $tables[$tindex];
$table_create_rs = mysql_query("SHOW CREATE TABLE `$table`");
$table_create_rows = mysql_fetch_array($table_create_rs);
$table_create_sql = $table_create_rows[1];
// Our parser used for reading the dump file is very basic
// hence we will need to remove the new lines
$table_create_sql = str_replace("\n","",$table_create_sql);
// Our parser used for reading the dump file is very basic
// hence we will need to remove the new lines
$table_create_sql = str_replace("\n","",$table_create_sql);
// Write table create statement
$this->writeln("");
$this->writeln("--");
$this->writeln("-- Table structure for table `$table` ");
$this->writeln("--");
$this->writeln("");
$this->writeln("DROP TABLE IF EXISTS `$table`;");
$this->writeln($table_create_sql . ';');
$this->writeln("");
// Write data
$this->writeln("--");
$this->writeln("-- Dumping data for table `$table` ");
$this->writeln("--");
$this->writeln("");
$table_query = mysql_query("SELECT * FROM `$table`");
$num_fields = mysql_num_fields($table_query);
while($fetch_row = mysql_fetch_array($table_query)) {
$insert_sql = "INSERT INTO `$table` VALUES(";
for($n = 1; $n <= $num_fields; $n++) {
$m = $n -1;
$field_value = $fetch_row[$m];
$field_value = str_replace('\"', '"', mysql_escape_string($field_value));
$insert_sql .= "'". $field_value . "', ";
}
$insert_sql = substr($insert_sql,0,-2);
$insert_sql .= ");";
if($insert_sql != "") {
$this->writeln($insert_sql);
}
}
}
// Meta information reset to original state.
$this->writeln("SET FOREIGN_KEY_CHECKS=0;");
$this->file_close();
}
function file_open($filename) { $this->fhandle = fopen($filename, "w+"); }
function file_close() { fclose($this->fhandle); }
function write($string) { fprintf($this->fhandle, "%s", $string); }
function writeln($string) { fprintf($this->fhandle, "%s\r\n", $string); }
};
class createZip {
public $compressedData = array();
public $centralDirectory = array(); // central directory
public $endOfCentralDirectory = "\x50\x4b\x05\x06\x00\x00\x00\x00"; //end of Central directory record
public $oldOffset = 0;
/**
* Function to create the directory where the file(s) will be unzipped
*
* @param $directoryName string
*
*/
public function addDirectory($directoryName) {
$directoryName = str_replace("\\", "/", $directoryName);
$feedArrayRow = "\x50\x4b\x03\x04";
$feedArrayRow .= "\x0a\x00";
$feedArrayRow .= "\x00\x00";
$feedArrayRow .= "\x00\x00";
$feedArrayRow .= "\x00\x00\x00\x00";
$feedArrayRow .= pack("V",0);
$feedArrayRow .= pack("V",0);
$feedArrayRow .= pack("V",0);
$feedArrayRow .= pack("v", strlen($directoryName) );
$feedArrayRow .= pack("v", 0 );
$feedArrayRow .= $directoryName;
$feedArrayRow .= pack("V",0);
$feedArrayRow .= pack("V",0);
$feedArrayRow .= pack("V",0);
$this -> compressedData[] = $feedArrayRow;
$newOffset = strlen(implode("", $this->compressedData));
$addCentralRecord = "\x50\x4b\x01\x02";
$addCentralRecord .="\x00\x00";
$addCentralRecord .="\x0a\x00";
$addCentralRecord .="\x00\x00";
$addCentralRecord .="\x00\x00";
$addCentralRecord .="\x00\x00\x00\x00";
$addCentralRecord .= pack("V",0);
$addCentralRecord .= pack("V",0);
$addCentralRecord .= pack("V",0);
$addCentralRecord .= pack("v", strlen($directoryName) );
$addCentralRecord .= pack("v", 0 );
$addCentralRecord .= pack("v", 0 );
$addCentralRecord .= pack("v", 0 );
$addCentralRecord .= pack("v", 0 );
$ext = "\x00\x00\x10\x00";
$ext = "\xff\xff\xff\xff";
$addCentralRecord .= pack("V", 16 );
$addCentralRecord .= pack("V", $this -> oldOffset );
$this -> oldOffset = $newOffset;
$addCentralRecord .= $directoryName;
$this -> centralDirectory[] = $addCentralRecord;
}
/**
* Function to add file(s) to the specified directory in the archive
*
* @param $directoryName string
*
*/
public function addFile($data, $directoryName) {
$directoryName = str_replace("\\", "/", $directoryName);
$feedArrayRow = "\x50\x4b\x03\x04";
$feedArrayRow .= "\x14\x00";
$feedArrayRow .= "\x00\x00";
$feedArrayRow .= "\x08\x00";
$feedArrayRow .= "\x00\x00\x00\x00";
$uncompressedLength = strlen($data);
$compression = crc32($data);
$gzCompressedData = gzcompress($data);
$gzCompressedData = substr( substr($gzCompressedData, 0, strlen($gzCompressedData) - 4), 2);
$compressedLength = strlen($gzCompressedData);
$feedArrayRow .= pack("V",$compression);
$feedArrayRow .= pack("V",$compressedLength);
$feedArrayRow .= pack("V",$uncompressedLength);
$feedArrayRow .= pack("v", strlen($directoryName) );
$feedArrayRow .= pack("v", 0 );
$feedArrayRow .= $directoryName;
$feedArrayRow .= $gzCompressedData;
$feedArrayRow .= pack("V",$compression);
$feedArrayRow .= pack("V",$compressedLength);
$feedArrayRow .= pack("V",$uncompressedLength);
$this -> compressedData[] = $feedArrayRow;
$newOffset = strlen(implode("", $this->compressedData));
$addCentralRecord = "\x50\x4b\x01\x02";
$addCentralRecord .="\x00\x00";
$addCentralRecord .="\x14\x00";
$addCentralRecord .="\x00\x00";
$addCentralRecord .="\x08\x00";
$addCentralRecord .="\x00\x00\x00\x00";
$addCentralRecord .= pack("V",$compression);
$addCentralRecord .= pack("V",$compressedLength);
$addCentralRecord .= pack("V",$uncompressedLength);
$addCentralRecord .= pack("v", strlen($directoryName) );
$addCentralRecord .= pack("v", 0 );
$addCentralRecord .= pack("v", 0 );
$addCentralRecord .= pack("v", 0 );
$addCentralRecord .= pack("v", 0 );
$addCentralRecord .= pack("V", 32 );
$addCentralRecord .= pack("V", $this -> oldOffset );
$this -> oldOffset = $newOffset;
$addCentralRecord .= $directoryName;
$this -> centralDirectory[] = $addCentralRecord;
}
/**
* Fucntion to return the zip file
*
* @return zipfile (archive)
*/
public function getZippedfile() {
$data = implode("", $this -> compressedData);
$controlDirectory = implode("", $this -> centralDirectory);
return
$data.
$controlDirectory.
$this -> endOfCentralDirectory.
pack("v", sizeof($this -> centralDirectory)).
pack("v", sizeof($this -> centralDirectory)).
pack("V", strlen($controlDirectory)).
pack("V", strlen($data)).
"\x00\x00";
}
/**
*
* Function to force the download of the archive as soon as it is created
*
* @param archiveName string - name of the created archive file
*/
public function forceDownload($archiveName) {
$headerInfo = '';
if(ini_get('zlib.output_compression')) {
ini_set('zlib.output_compression', 'Off');
}
// Security checks
if( $archiveName == "" ) {
echo "<html><title>Public Photo Directory - Download </title><body><BR><B>ERROR:</B> The download file was NOT SPECIFIED.</body></html>";
exit;
}
elseif ( ! file_exists( $archiveName ) ) {
echo "<html><title>Public Photo Directory - Download </title><body><BR><B>ERROR:</B> File not found.</body></html>";
exit;
}
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: application/zip");
header("Content-Disposition: attachment; filename=".basename($archiveName).";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($archiveName));
readfile("$archiveName");
}
}
class createDirZip extends createZip {
function get_files_from_folder($directory, $put_into) {
if ($handle = @opendir($directory)) {
while (false != ($file = readdir($handle))) {
if (is_file($directory.$file)) {
$fileContents = file_get_contents($directory.$file);
$this->addFile($fileContents, $put_into.$file);
} elseif ($file != '.' and $file != '..' and is_dir($directory.$file)) {
$this->addDirectory($put_into.$file.'/');
$this->get_files_from_folder($directory.$file.'/', $put_into.$file.'/');
}
}
}
@closedir($handle);
}
}
?>