<?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;
		}
	}
}
?>
