Qware_core/lib/package/backup/mysql3backupdb.php

275 lines
6.5 KiB
PHP
Raw Normal View History

2020-12-03 16:35:44 +01:00
<?php
/**-----------------------------------------------
*
* Rooty, 2018 <rooty@rooty.me>
*
*
* This software is protected by copyright, please
* read the file COPYRIGHT.
* This program is distributed in the hope that it
* will be useful, but without any warranty; without
* even the implied warranty of merchantability or
* fitness for a particular purpose. Please
* read the file LICENCE.
*
* Ce fichier contient la gestion de BackupDb (Factory+Modéle)
*
* @author Rooty <www.rooty.me|rooty@rooty.me>
* @since 2005/03/11
* @link www.rooty.me
* @version 0.3
* @package package
* @subpackage BackupDb
* @copyright Copyright &copy; 2009-2018, Rooty
*/
if ( !defined('SYSTEM_IN') )
{
die("Hacking attempt");
}
/**
* Inclusion des éléments de parsage sql (sqlParse)
*/
include_once($GLOBALS["CONF_LIB_PATH"]."lib/system/system_data_source/database/sql_parse.php");
/**
* Classe Mysql3BackupDb
*classe de gestion des BackupDb (BD) pour mysql3
* @package package
* @subpackage BackupDb
*/
class Mysql3BackUpDb extends CommonBackupDb
{
//
// Constructeur (non surchargé!!)
//
/**
* Liste les tables pour une BD
* @param chaine nom de la BD
*/
function getListTables ($db)
{
$i = 0;
$nbtab = mysql_list_tables ($db);
while ($i < mysql_num_rows ($nbtab))
{
$tb_names[$i] = mysql_tablename ($nbtab, $i);
$i++;
}
return $tb_names;
}
/**
* Récupération des données pour une table
* @param chaine nom de la table
* @param entier pointeur de fichier
*/
function getTableData ($table, $fd)
{
$tableau = array ();
$j = 0;
$resultat = mysql_query ("select * from $table");
if ($resultat == FALSE)
{
return "La requete dans la table '".$table."' a echoue.<br>";
}
else
{
while ($valeurs = mysql_fetch_row ($resultat))
{
$this->writeLine ($valeurs, $table, $fd);
}
return $valeurs;
}
}
/**
* recuperation de la structure de la table
* @param chaine nom de la table
* @param entier pointeur de fichier
*/
function getTableStructure ($struct, $fd)
{
$requete = mysql_query ("show create table $struct");
if ($requete == FALSE)
{
return "la recuperation de la structure '".$struct."' a echoue.<br>";
}
else
{
$structure = mysql_fetch_row ($requete);
$ligne = 0;
return $structure[1];
}
}
/**
* recuperation de la structure de la table
* @param chaine chaine sql de création de table
* @param chaine nom de la table
* @param entier pointeur de fichier
*/
function putStructIntoFile ($structure, $nom_table, $fd)
{
$struct = "#\n# Structure de la table ".$nom_table."\n#\n\n";
# Ajout de l'énnonçé DROP TABLE...
$struct .="DROP TABLE IF EXISTS `".$nom_table."`;\n";
$struct .= $structure;
$struct .= ";\n\n";
$ecriture = fwrite ($fd, $struct, strlen ($struct));
if ($ecriture == 0)
{
return "erreur lors de l'ecriture de la strucuture dans le fichier de sauvgarde.";
}
else{
return $fd;
}
}
/**
* integre les donnees dans un fichier
* @param chaine données à insérer
* @param chaine nom de la table
* @param entier pointeur de fichier
*/
function putDataIntoFile ($donnees, $nom_table, $fd)
{
$lignes = 0;
$infos = "#\n# donnees de la table ".$nom_table ."\n#\n\n";
fwrite ($fd, $infos, strlen ($infos));
while (isset ($donnees[$lignes]))
{
$appel_fonction = $this->writeLine($donnees[$lignes], $nom_table, $fd);
$lignes++;
}
return $fd;
}
/**
* écrit une ligne de données
* @param chaine données à insérer
* @param chaine nom de la table
* @param entier pointeur de fichier
*/
function writeLine ($donnees, $nom_table, $fd)
{
$case = 1;
$debut = "INSERT INTO `".$nom_table."` VALUES ('".$donnees[0]."'";
fwrite ($fd, $debut, strlen ($debut));
while (isset ($donnees[$case])){
fwrite ($fd, ", '".addslashes($donnees[$case])."'", strlen (", '".addslashes($donnees[$case])."'"));
$case++;
}
$fin = ");\n\n\n";
fwrite ($fd, $fin, strlen ($fin));
}
/**
* Création d'une sauvegarde
* @todo ne gére pas les enregistrement dont un champs peut être null :-(
* @return booleen
*/
function backup()
{
# Récupération des paramètres
$host=$this->host;
$login=$this->login;
$password=$this->passwd;
$chemin=$this->path;
$nom_fichier=$this->file;
$db=$this->db;
$emplacement = $chemin."/".$nom_fichier;
if (!isset ($chemin) || !is_dir ($chemin)){
addError(2,"Mysql3BackupDb", " $chemin n'est pas un repertoire ou n'existe pas.", __line__, __file__);
return false;
}
if (file_exists ($nom_fichier)){
addError(2,"Mysql3BackupDb","Impossible de faire la sauvegarde, le fichier $nom_fichier existe deja.", __line__, __file__);
return false;
}else{
$connec = mysql_connect($host, $login, $password);
mysql_select_db($db, $connec);
$list = $this->getListTables ($db);
$tab = 0;
$fd = fopen ($emplacement, "w+");
while (isset ($list[$tab]))
{
$structure = $this->getTableStructure ($list[$tab], $fd);
$backup = $this->putStructIntoFile ($structure, $list[$tab], $fd);
$query = $this->getTableData ($list[$tab], $fd);
$backup_suite = $this->putDataIntoFile ($query, $list[$tab], $fd);
$tab++;
}
fclose ($fd);
chmod($emplacement, $this->perm);
mysql_close ($connec);
$directory = $chemin."/";
$name_zip = substr ( $nom_fichier, 0,strpos($nom_fichier, "."));
$name = $nom_fichier;
return true;
}
}
/**
* Réstauration d'une sauvegarde
* @return booleen
*/
function restore()
{
# Récupération des paramètres
$host=$this->host;
$login=$this->login;
$password=$this->passwd;
$chemin=$this->path;
$nom_fichier=$this->file;
$db=$this->db;
$emplacement = $chemin."/".$nom_fichier;
if (!isset ($chemin) || !is_dir ($chemin)){
addError(2,"Mysql3BackupDb", " $chemin n'est pas un repertoire ou n'existe pas.", __line__, __file__);
return false;
}
if (!file_exists ($emplacement)){
addError(2,"Mysql3BackupDb","Impossible d'executer le fichier $nom_fichier n'existe pas.", __line__, __file__);
return false;
}else{
$connect = mysql_connect($host, $login, $password);
mysql_select_db($db, $connect);
$sql_query = @fread(@fopen($emplacement, 'r'), @filesize($emplacement));
$sql_query = remove_remarks($sql_query);
$sql_query = split_sql_file($sql_query, ";");
$sql_query = make_path($sql_query);
for ($i = 0; $i < sizeof($sql_query); $i++)
{
if (trim($sql_query[$i]) != '')
{
if (!($result = mysql_query($sql_query[$i],$connect)))
{
addError(2,"Mysql3BackupDb","Impossible d'executer le fichier $nom_fichier n'existe pas.", __line__, __file__);
return false;
}
}
}
return true;
}
}
}
?>