<?php
// Fonctions d'installation de l'application
// version 0.0.1
/* ces fonctions ne servent normalement qu'une seule fois.
Elles permettent aussi de réinstaller la base de données afin de changer de contexte.

Attention, pour que la base puisse être chargée, il faut que les fichiers suivants existent :
./scriptDB/createDB.sql = fichier des requêtes de création de la base de données.
./scriptDB/insertDB_X.sql = fichier des requêtes d'insertion des données, avec X le nom du contexte.

il existe actuellement 2 contextes (sans accent ou caractère spécial) : 
	velo 	: atelier de cyclisme, vente de vélo et accessoires, assemblage de roues
	ski		: fabrication et vente de skis, vente d'accessoires (ski nus et fixations, bâtons, gants, ...) 

Remarque technique : 
Les caractères accentués peuvent poser problème. 
Les fichiers SQL doivent être encodés en "UTF-8 sans BOM".

Le format UTF-8 simple ajoute 3 caractères non affichables en tête de fichier : EF BB BF (289, 181, 191 en décimal)
La conversion vers ce format est facile avec Notepad++ (logiciel libre).
*/
/*
Modifs : 
0.0.1 30/06/2013 : 
	ajout de la fonction getContext, 
	modif de la gestion des contextes : installation automatique du contexte existant s'il est seul.

*/
// ==========================================================================================================================
// récupère la liste des contextes présents (ou faux aucun contexte).
// retourne un tableau de contextes : 
// indice= nom du fichier,
// [indice][name]= nom du contexte,
// [indice][name]= nom du contexte,

// --------------------------------------------------------------------------------------------------------------------------
function getContext(){
	$t_context=false;
	$dirLocal="./scriptDB/";
	if(!is_dir($dirLocal)) {
		//echo "Attention, aucune donnée d'installation existante, installation impossible.<br>Vérifier que le fichier d'origine soit correct.";
		exit();
	}
	$dirId=opendir($dirLocal);
	while ($fileName = readdir($dirId)) {
		if ($fileName=="createDB.sql")
			$createDB="createDB.sql";
		$t_name=explode(".", $fileName);
		$t_name2=explode("_", $t_name[0]);
		//echo "<br>DBG - $fileName = ".(sizeof($t_name2));
		if (sizeof($t_name2)==2)
			$t_context[]=$t_name2[1];
	}
	return $t_context;
}// ==========================================================================================================================
// contrôle de l'installation courante.
// fonction qui vérifie la connexion au serveur, l'existence de la base de données, de ses tables (mais pas de la version)
// --------------------------------------------------------------------------------------------------------------------------
function chk_install($force=false){
global $connexion;
include ("config/dbCfg.inc.php");
//$connexion=mysql_connect($hote,$login,$mdp);
	
	// contrôle de la connextion et renvoi de l'identifiant (pointeur) de la connexion
	$install=0;
	if ($connexion)  {
		if ($install==0){ // vérif que la base de données existe
			$requete="SHOW databases ;";
			$requete_id = DB_ouvrirRequete($requete, $connexion);
			while (	$enreg = DB_lireLigne($requete_id)){
				if ($enreg[0]==$bd) $install=1; // la base de données existe
			}
		}
		//echo "<br>DBG - $bd install=$install";
		if ($install==1){ // vérif que les tables existent
			$requete="SHOW tables from $bd ;";
			$requete_id = DB_ouvrirRequete($requete, $connexion);
			$i=0;
			while (	$enreg = DB_lireLigne($requete_id)){
				$i++;
			}
			if ($i>0) $install=2; // Les tables existent
			//on va dire qu'à priori c'est bon ...
			//echo "<br>DBG - $bd install=$install";
		}
		if ($install==2){ // vérif qu'un contenu existe
			@DB_selectionnerBase($bd, $connexion);
			$requete="SELECT * FROM article ;";
			$requete_id = DB_executerRequete($requete, $connexion);
			if(DB_getNbEnreg($requete_id)>0) $install=3;
			//echo "<br>DBG mysql_num_rows retourne : ".mysql_num_rows($requete_id);
		}
	}
	return $install;
}
// --------------------------------------------------------------------------------------------------------------------------
/* Ce script permet de créer les tables de la base de données MySql définie dans $file, à la ligne #[DataBase]
		 	 					# db="produits" ; 
	   et les tables de cette base selon les ordres du fichier $file, automatiquement. */
// --------------------------------------------------------------------------------------------------------------------------
function doExecuteSQL($file="createDB.sql", $dropTableBefore=1) {
global $connexion;
include ("config/dbCfg.inc.php");
//include ("config/dbCfg.inc.php");
//$connexion=mysql_connect($hote,$login,$mdp);
	$path="scriptDB\\";

//------------------------------------------------------------
// sélection de la base dans mysql
// pas besoin, c'est écrit dans les ordres SQL ? A voir
		$query="use $bd";
		$resQry =DB_executerRequete($query, $connexion); 
/*
		$resSelect = mysql_select_db($bd, $connexion);
		echo mysql_error();
*/
//------------------------------------------------------------
// modification du jeu de caractÃ¨res de la connexion
//	voir si nécessaire, de ttes façons, c'est fait dans les fichiers SQL
/*
		$query="SET CHARACTER SET utf8";
		$resQry =mysql_query($query, $connexion); 
		$resSelect = mysql_select_db($bd, $connexion);
		echo mysql_error();
*/
//------------------------------------------------------------
// Ouvrir et lire le fichier des ordres sql
	$fd  = fopen ($path.$file, "r");
	//DBG // echo "<br>fichier ouvert";
	$content = fread($fd, filesize($path.$file));
	fclose($fd);
	//DBG // echo "<br>fichier lu et fermé\n";
	
//------------------------------------------------------------
// Création des ordres SQL
	// séparation des lignes
	$ligne = strtok($content,"\n");
	$i=0;
	$enregOk=$enregErr=0;
	$t_rapport="";
	$t_error="";
//------------------------------------------------------------
// parcours des lignes
	$requeteSQL = ""; // init la commande courante
	$commentText = ""; // init du commentaire
	$commentOpen=false;
	//if ($ligne)	$ligne=substr($lgne, 3, strlen($ligne)); // pour éliminer les caractères UTF-8 EF BB BF du début de fichier qui indiquent l'ordre des
	while ($ligne) {
		// ligne de commentaire
		$ligne=trim($ligne);
		//if (ord(substr($ligne, 0, 1))=="#" ) {echo "coucou";}
		if (substr($ligne, 0, 1)=="#" || substr($ligne, 0, 2)=="--") {$comment="<tr style='background:#eee;font-size:9px;color:#aba;font-style:italic;'><td colspan=100%>".$ligne."</td></tr>\n";}
		// début de commentaire long
		//elseif (preg_match("[/*]", $ligne)) {$commentOpen=true;$commentText=$ligne.'CCCBEGIN';}
		//elseif (strrpos($ligne,"/*") ) {$commentOpen=true;$commentText=$ligne.'CCCBEGIN';}
		elseif (substr($ligne, 0, 2)=='/*' ) {$commentOpen=true;$commentText=$ligne.'CCCBEGIN';}
		// fin de commentaire long
		elseif (substr($ligne,0, 2)=="*/") {$commentOpen=false;$comment="<tr style='background:#eee;font-size:9px;color:#aba;font-style:italic;'><td colspan=100%>$commentText.$ligne</td></tr>\n";}
		// contenu de commentaire long
		elseif ($commentOpen) {$commentText.=htmlspecialchars($ligne)."\n";}
		// ligne SQL à traiter
		else{
			// ligne non vide ou ";" ou ",", a concaténer
			if (strlen($ligne)>1 || $ligne==";" || $ligne==","){
				// concaténer la ligne à la commande en cours
				$requeteSQL .= $ligne; // Accumuler les lignes dans la requête
				// a-t-on un ';' de fin de commande ?
				$pos = strrpos($requeteSQL, ';');		//Si un ';' est trouvé, alors on a une commande complète
				if ($pos) { // la ligne est complète, l'exécuter
					$i++; // incrémenter le n° de la commande
					$t_rapport[$i]['sql']=$requeteSQL;
					// Exécution et rapport de la commande
					if ($sql_result= DB_executerRequete($requeteSQL, $connexion)){ // exécution réussie
					//if (1==1){ // exécution réussie
					//if (false){
						$t_rapport[$i]['res']=true;
						$enregOk++;
					} else {	// exécution ratée
						$t_rapport[$i]['res']=false;
						$enregErr++ ;
						$t_error[$i]['errno'] = mysql_errno();
						$t_error[$i]['error'] = mysql_error();
					}
					$requeteSQL = ""; // RAZ de la requête pour passer à la suivante
				}
			}
		}
		$ligne = strtok ("\n"); // passer à la ligne suivante
	} //done// tq ligne
	$i=0;
//------------------------------------------------------------
// créer le rapport de fonctionnement et la liste des erreurs
	$install=true;
	$logDir="log";
	$logname="log".date('Y-m-d_H-i-s').'.html';
	if (!is_dir($logDir)) mkdir($logDir);
?>	
<div id=rapport style='width:100%; height:200; overflow:auto; border:solid 1px black;'><h4>Rapport</h4>
		<table border=1>
		<tr><th>n°</th><th>Requete</th><th>Resultat</th></tr>
<?php
	if ($enregOk) {
		foreach ($t_rapport as $nb => $requete){
			($requete['res'])?($color='#efe')&&($msg='OK'):($color='#fee')&&($msg="<a href='#err".$nb."'>!! Error</a>");
			echo "<tr bgcolor='$color'><td>$nb</td><td>".$requete['sql']."</td><td>$msg</td></tr>"."\n"; 
		}
	}
?>
		</table><br />
<?php
// afficher la liste des erreurs ????
	if ($enregErr){
		$install=false;
		echo "<ul id=error>";
		foreach ($t_error as $nb => $erreur){
			echo "<li><a name='err".$nb."'>erreur ($nb) : ".$erreur['errno']." - ".$erreur['error']."</a>";
		}
		echo "</ul>";
	}
?>
		</div>
<?php
	return $install;
}
// --------------------------------------------------------------------------------------------------------------------------
// Réalisation de l'installation
/* on effectue la connexion, le contrôle de l'existence de la base, 
	la création de la base si elle n'existe pas, la création des tables,
	le remplissage des tables en fonction du contexte choisi.
*/
// --------------------------------------------------------------------------------------------------------------------------
function do_install(){
global $_REQUEST;
include ("config/dbCfg.inc.php");
//include ("config/dbCfg.inc.php");
//$connexion=mysql_connect($hote,$login,$mdp);
global $connexion;
$file="createDB.sql";
$clearTableBefore=1;

	// contrôle de la base de données : création, installation des tables
	$db_installed=chk_install();
	if (isset($_REQUEST['do_Install'])){
		// la base n'existe pas, on la crée
		if ($db_installed<1){ 
			echo "<br><font color=blue>Création de la base de données en cours : ";
			$requeteSQL="CREATE DATABASE $bd CHARACTER SET utf8 COLLATE utf8_general_ci;";
			if($sql_result= DB_executerRequete($requeteSQL, $connexion)){echo "OK</font>"; $db_installed=1;}else echo "ERR</font>";
		}
		// la base n'a pas de tables
		if ($db_installed<2){
			(doExecuteSQL($file, 1))?print "<h2><font color=green>Fin normale du script d'installation de la base $bd.</font></h2>":print "<h2><font color=red>Erreur d'installation de la base $bd.</font></h2>";
		}
  	}
	
	// contrôle des données installées ; si un contexte est demandé, on l'installe
	$db_installed=chk_install();
	if ($db_installed<2) echo "<h2><font color=orange>Actuellement, la base $bd n'est pas installée ou ne contient aucune table</font></h2>";
	else{ // On traite le contexte demandé
		// exécution de l'installation
		// contrôle du contexte
		if (isset($_REQUEST['do_Install']) && isset($_REQUEST['context'])&& !empty($_REQUEST['context'])){ // si un contexte est choisi, l'insérer
			$context=$_REQUEST['context'];
			if ($db_installed<3 && $context) {
				$insertDB_file="insertDB_".$context.".sql"; // scriptDB/insertDB_ski.sql
				echo "<br><font color=blue>Installation du contexte $context en cours (fichier $insertDB_file)</font>";
				($logName=doExecuteSQL($insertDB_file, 1))?print "<h2><font color=green>Le contexte $context est installé.</font></h2>":print "<h2><font color=red>Erreur d'installation du contexte $context, (<a href=".$logName.">voir le log</a>).</font></h2>";
			}
		}
	}
	
	// vérif du degré d'installation, affichage du menu d'installation
	$db_installed=chk_install();
	if ($db_installed<3){ // base ok, aucune données
		echo "<h2><font color=orange>Actuellement, aucun contexte n'est installé</font></h2>";
		$dirLocal="./scriptDB/";
/* old version 13/06/30 DELETED
		if(!is_dir($dirLocal)) {
			echo "Attention, aucune donnée d'installation existante, installation impossible.<br>Vérifier que le fichier d'origine soit correct.";
			exit();
		}
		$dirId=opendir($dirLocal);
		while ($fileName = readdir($dirId)) {
			if ($fileName=="createDB.sql")
				$createDB="createDB.sql";
			$t_name=explode(".", $fileName);
			$t_name2=explode("_", $t_name[0]);
			//echo "<br>DBG - $fileName = ".(sizeof($t_name2));
			if (sizeof($t_name2)==2)
				$t_insertData[]=$t_name2[1];
		}
*/
		if(!$t_context=getContext()) {
			echo "Attention, aucune donnée d'installation existante, installation impossible.<br>Vérifier que le fichier d'origine soit correct.";
			exit();
		}elseif (sizeof($t_context)>1){
			//echo "<br>DBG - il y a des contextes";
			echo "<form>";
				echo "<h3>Choisir le contexte à charger</h3>";
				foreach ($t_context as $key=>$val){
					echo "<br><input type=radio name=context value=$val /> $val";
				}
				echo "<br><input type=submit name='do_Install' value='Installer maintenant' /><br>";
			echo "</form>";
			echo "Lorsqu'un contexte est chargé, il suffit de vider les tables ou surimer la base dans le SGBD pour revenir à cet écran.";
		}else{
			$context=reset($t_context);
			echo "Chargement automatique du contexte existant.";
			// On traite le contexte existant
			// exécution de l'installation
			$insertDB_file="insertDB_".$context.".sql"; // scriptDB/insertDB_ski.sql
			echo "<br><font color=blue>Installation du contexte $context en cours (fichier $insertDB_file)</font>";
			(doExecuteSQL($insertDB_file, 1))?print "<h2><font color=green>Le contexte $context est installé.</font></h2>":print "<h2><font color=red>Erreur d'installation du contexte $context.</font></h2>";
		}
	}
}
?>