275 lines
6.5 KiB
PHP
275 lines
6.5 KiB
PHP
|
<?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 © 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;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
?>
|