Incam_Intranet/src/Objects/Backup.php
2011-04-04 15:16:10 +00:00

198 lines
6.5 KiB
PHP
Raw Blame History

<?php
/*
* Clase BD
*
* Sirve para conectarse a la base de datos y realizar consultas sobre esta
*/
include_once("ConexionBackup.php");
include_once("BDBackup.php");
include_once("BD.php");
class Backup{
private $nombre_bd;
private $usuario;
public function Backup($usuario){
$conexion = new ConexionBackup();
$this->nombre_bd = $conexion->getNombreBD();
$this->usuario = $usuario;
}
public function backupGlobal(){
if(!$this->usuario->tieneRol(1)){
$error = $this->locale['4042'];
throw new Exception($error);
return false;
exit;
}
$consulta = "SELECT TABLE_NAME FROM information_schema.tables WHERE table_schema='".$this->nombre_bd."'";
$bdB = new BDBackup();
$bd = new BD();
$db_tables = $bdB->arrayQuery($consulta, "TABLE_NAME");
if(count($db_tables)>0){
$crlf = "\n";
//ob_start();
//@ob_implicit_flush(0);
$backup = "#----------------------------------------------------------".$crlf;
$backup .= "# Intranet de Selfor SQL Data Dump".$crlf;
$backup .= "# Fecha: `".date("d/m/Y H:i")."`".$crlf;
$backup .= "#----------------------------------------------------------".$crlf;
$backup .= $crlf."SET FOREIGN_KEY_CHECKS=0;".$crlf."#".$crlf;
mysql_query('SET SQL_QUOTE_SHOW_CREATE=1');
foreach($db_tables as $table){
@set_time_limit(1200);
mysql_query("OPTIMIZE TABLE $table");
$backup .= $crlf."#".$crlf."# Structure for Table `".$table."`".$crlf."#".$crlf;
$backup .= "DROP TABLE IF EXISTS `$table`;$crlf";
$row=mysql_fetch_array($bd->execQuery("SHOW CREATE TABLE $table"));
$backup .= $row[1].";".$crlf;
$result=mysql_query("SELECT * FROM $table");
if($result&&mysql_num_rows($result)){
$backup .= $crlf."#".$crlf."# Table Data for `".$table."`".$crlf."#".$crlf;
$column_list="";
$num_fields=mysql_num_fields($result);
for($i=0;$i<$num_fields;$i++){
$column_list.=(($column_list!="")?", ":"")."`".mysql_field_name($result,$i)."`";
}
}
while($row=mysql_fetch_array($result)){
$dump="INSERT INTO `$table` ($column_list) VALUES (";
for($i=0;$i<$num_fields;$i++){
$dump.=($i>0)?", ":"";
if(!isset($row[$i])){
$dump.="NULL";
}elseif($row[$i]=="0"||$row[$i]!=""){
$type=mysql_field_type($result,$i);
if($type=="tinyint"||$type=="smallint"||$type=="mediumint"||$type=="int"||$type=="bigint"||$type=="timestamp"){
$dump.=$row[$i];
}else{
$search_array=array('\\','\'',"\x00","\x0a","\x0d","\x1a");
$replace_array=array('\\\\','\\\'','\0','\n','\r','\Z');
$row[$i]=str_replace($search_array,$replace_array,$row[$i]);
$dump.="'$row[$i]'";
}
}else{
$dump.="''";
}
}
$dump.=');';
$backup .= $dump.$crlf;
}
}
$backup .= $crlf."SET FOREIGN_KEY_CHECKS=1;".$crlf."#".$crlf;
$ruta = $this->backupMysql($backup);
if($ruta != ""){
$aciertos = "Backup realizado";
return $ruta;
}else{
$errores = "Fallo al realizar el backup";
return "";
}
}
}
/* Descargar la base de datos en gzip (al m<>ximo) y enviar por mail.*/
private function backupMysql($backup){
// Crear nombres de los ficheros backup
$fecha=time(); // Fecha actual
$archivo=gmstrftime("%y-%m-%d",$fecha); // Formato de la fecha para dar nombre al fichero
$asunto = 'Base de datos '.$archivo;
$ruta = constante("srcDocs")."/bdcopy/";
$ruta=$ruta.$archivo.'.sql'; // Archivo sql
$archivo_gz=$ruta.$archivo.'.gz';
$resultado = $archivo.'.sql'.$archivo.'.gz';
$fp = fopen($ruta, "a");
$write = fputs($fp, $backup);
fclose($fp);
$tamano_archivo = $fp['size'];
// Archivo sql.gz
// Descarga de la base de datos
if(file_exists($ruta)) // Si ha creado correctamente el backup
{
$comprimido=$this->comprimir($ruta,$archivo_gz); // Comprimirlo en gzip
if($comprimido=='TRUE'){
//$this->enviarAdjunto ($archivo_gz, $asunto); // Envio de mail comprimido
}else{
//$this->enviarAdjunto ($fp, $asunto); // Envio de mail sin comprimir
}
@unlink($ruta);
//TODO ruta segura // Borrar fichero sql
//@unlink($archivo_gz); // Borrar fichero sql.gz
//return TRUE; // Regresa confirmado el backup
return $resultado;
}
else // No ha podido crear el backup
return ""; // Regresa denegando el backup
}
// Comprimir en gzip un archivo
private function comprimir($archivo_original,$archivo_comprimido)
{
$fp=@gzopen($archivo_comprimido,'w9'); // Crear archivo comprimido
if($fp!='FALSE') // Comprobar que zLib esta activo
{
$fp2=@fopen($archivo_original,'r'); // Abrir archivo original
$buffer=@fread($fp2,filesize($archivo_original));// Leer archivo original
@fclose($fp2); // Cerrar archivo original
@gzwrite($fp,$buffer); // Escribir archivo comprimido
@gzclose($fp); // Cerrar archivo comprimido
return TRUE; // Regresa confirmado la compresi<73>n
}
else
return FALSE; // Regresa sin comprimirlo
}
// // ENVIO DE CORREO CON ADJUNTO COMPRIMIDO
// private function enviarAdjunto($archivo,$asunto)
// {
// global $mail_enviar;
//
// $buffer = implode("", file($archivo)); // Leer fichero
// $buffer=chunk_split(base64_encode($buffer)); // Codificaci<63>n en base64 y divido
//
// // Cabeceras
// $cabecera = "MIME-version: 1.0\n";
// $cabecera .= "Content-type: multipart/mixed; ";
// $cabecera .= "boundary=\"Message-Boundary\"\n";
// $cabecera .= "Content-transfer-encoding: 7BIT\n";
// $cabecera .= "X-attachments: $archivo";
//
// // Mensaje
// $mensaje = "--Message-Boundary\n";
// $mensaje .= "Content-type: text/plain; charset=ISO-8859-1\n";
// $mensaje .= "Content-transfer-encoding: 7BIT\n";
// $mensaje .= "Content-description: Mail message body\n\n";
//
// // Adjuntar el fichero
// $mensaje .= "\n\n--Message-Boundary\n";
// $mensaje .= "Content-type: Binary; name=\"$archivo\"\n";
// $mensaje .= "Content-Transfer-Encoding: BASE64\n";
// $mensaje .= "Content-disposition: attachment; filename=\"$archivo\"\n\n";
// $mensaje .= "$buffer\n";
// $mensaje .= "--Message-Boundary--\n";
//
// @mail($mail_enviar,$asunto,$mensaje,$cabecera); // Envio de mail
// }
function getLink(){
if(!$this->usuario->tieneRol(1)){
$error = $this->locale['4042'];
throw new Exception($error);
return false;
exit;
}
return $this->conexion->getlink();
}
}
?>