<?php
// ==Section 1 : Fonctions base de données liées au SQL ====================================
// fonction de connexion à la base de données
function DB_connecter() {

	// définition des paramètres de connexion
	/* Note : 
		 Comme il y a plusieurs bases (une par profil et une par groupe, on est obligé
		 d'extérioriser la configuration du serveur et de la connexion, sinon tout le monde
		 accéderait à la même base.
		 Sous linux, ce fichier de configuration est créé lors de la création des profils utilisateurs.
		 sous easyPHP, en local, ce fichier est repris tel que car on peut avoir plusieurs bases de noms différents.
		 il se trouve à la racine de public_html
	*/
	include ("config/dbCfg.inc.php");
	/*
	$hote="localhost";
	$login="festival";
	$mdp="secret";
	$bd="festival2";
	*/
	
	// connexion
	$connexion=mysql_connect($hote,$login,$mdp);
	
	// contrôle de la connextion et renvoi de l'identifiant (pointeur) de la connexion
	if ($connexion)  {
  	//$res=mysql_query($query, $connexion); 
  	// modification du jeu de caractÃ¨res de la connexion
  	$query="SET CHARACTER SET utf8";
  	$query="SET names 'utf8'";
  	$res=mysql_query($query, $connexion); 
  	@mysql_select_db($bd, $connexion);
	}
// 061230 fk-001 del-begin
/*
	else {
  	ajouterErreur("Echec de la connexion au serveur MySQL");
  	ajouterErreur(" => " . mysql_error());
	}
*/
// 061230 fk-001 del-end
	return $connexion;
}
function DB_selectionnerBase($bd, $connexion) {
  	@mysql_select_db($bd, $connexion);
}
// --------------------------------------------------------------------------------------------------------------------
// Fermeture de la connexion au serveur MySql
function DB_deconnecter() {
	mysql_close();
}
function DB_deconnecter2($connexion) {
	mysql_close($connexion);
}
// --------------------------------------------------------------------------------------------------------------------
//@ ouvrirRequete ouvre une requête ($requete) pour la connexion ($connexion) et retourne le pointeur ($requete_id).
function DB_ouvrirRequete($requete_sql, $connexion){
	$requete_id = mysql_query($requete_sql, $connexion);
	//echo "<br>Ouverture de : $requete_sql "; // décommenter si on a une erreur dans le SQL
	//echo "<br>Résultat : ".mysql_error(); // décommenter si on a une erreur dans le SQL
	return $requete_id ;
}
// --------------------------------------------------------------------------------------------------------------------
// lireLigne lit une ligne (un enregistrement) dans la requête donnée et retourne les champs sous forme de tableau avec indice identifié par le nom du champ
function DB_lireLigne($requete_id){
	$enreg = mysql_fetch_array($requete_id);
	// echo mysql_error(); // décommenter si on a une erreur dans le SQL
	return $enreg;
// remarque : ne pas confondre avec :
//	-	lireEnreg qui retourne les champs sous forme d'un objet
//	-	lireTuple qui retourne les champs sous forme d'un tableau avec indice numéroté
}
// lireLigne lit une ligne (un enregistrement) dans la requête donnée et retourne les champs sous forme de tableau avec indice numérique (0, 1, ... n)
function DB_lireLigneT($requete_id){
	$enreg = mysql_fetch_row($requete_id);
	return $enreg;
// mysql_field_name($connectId, fieldIndice) => nom du champ de la requête
// show columns from tablename
// show tables from dbName
}

// --------------------------------------------------------------------------------------------------------------------
// lireLigne lit une ligne (un enregistrement) dans la requête donnée et retourne les champs sous forme de tableau avec indice identifié par le nom du champ
function DB_chercherEnreg($requete_sql, $connexion){
	$requete_id=mysql_query($requete_sql, $connexion);
	//echo "<br>Chercher de : $requete_sql "; // décommenter si on a une erreur dans le SQL
	//echo "<br>Résultat execution : ".mysql_error(); // décommenter si on a une erreur dans le SQL
	if ($requete_id && mysql_num_rows($requete_id)>0){ // si on a trouvé quelque chose
		$enreg = mysql_fetch_array($requete_id);
		//echo "<br>Résultat lecture : ".mysql_error()." ; ".$enreg; // décommenter si on a une erreur dans le SQL
	}else 
		$enreg=FALSE;
	return $enreg;
}
// lireLigne lit une ligne (un enregistrement) dans la requête donnée et retourne les champs sous forme de tableau avec indice numérique
function DB_chercherEnregT($requete_sql, $connexion){
	$requete_id=mysql_query($requete_sql, $connexion);
	if ($requete_id)
		$enreg = mysql_fetch_row($requete_id);
	else 
		$enreg=FALSE;
	return $enreg;
}
// --------------------------------------------------------------------------------------------------------------------
// getNbrOfRows() retourne le nombre d'enregistrements de la requête lancée. nécessite l'identifiant de la requête
function DB_getNbEnreg($requete_id){ // ancienne fonction DB_chercherNbEnreg	
	//echo "<br>Chercher de : $requete_sql "; // décommenter si on a une erreur dans le SQL
	//echo "<br>Résultat execution : ".mysql_error(); // décommenter si on a une erreur dans le SQL
	if ($requete_id)
		return mysql_num_rows($requete_id);
	else 
		return false;
}
// --------------------------------------------------------------------------------------------------------------------
//@ DB_executerRequete exécue une requête ($requete_sql) pour la connexion ($connexion) et retourne le pointeur ($requete_id).
// note : l'algo est identique à l'ouverture d'une requête, mais la fonction étant différente, l'algo pourait être différent
// dans un autre SGBD.
function DB_executerRequete($requete_sql, $connexion){
	$requete_id = mysql_query($requete_sql, $connexion);
	//echo "<br>Execution de : $requete_sql "; // décommenter si on a une erreur dans le SQL
	//echo "<br>Résultat : ".mysql_error(); // décommenter si on a une erreur dans le SQL
	return $requete_id ;
}
// ==Section 2 : Fonctions liées à la définition de la base de données ======================================
function DB_getTableName($table) {
	include("library/DB_def.inc.php"); // tableaux de description de la base de données
	foreach($DB_Tables as $key => $val)
		if ($val==$table)
			$tableNum=$key;
	$tableName=$DB_TablesNames[$tableNum];
	return $tableName;
}
//******************************************************************************
// Construction de la liste des champs d'une table
// récup des champs de la table $varlist['tableName']
// A besoin de la liste des variables standards $varlist
// et de la liste des champs transmis à la page renommée en $ListOfValues 
// (soit $HTTP_GET_VARS, soit $HTTP_POST_VARS)
// 
// show fields from [table] renvoie un tableau contenant 6 colonnes.
// [0]/['Field']=nom champ, [1]/['Type']=type (complexe), [2]/['Null']=null autorisé, [3]/['Key']=PRI si clé primaire, [4]/['Default']=valeur par défaut, [5]/['Extra']=extra (auto_increment)
//
// Retourne un tableau numéroté, contenant pour chaque champ
// ['name']*  	: le nom du champ
// ['desc']*  	: la description à afficher
// ['key']* 		: si le champ est la clé primaire
// ['refField'] : le champ référencé si c'est une clé étrangère
// 										 	 refField est un tableau de 3 données 0=nom table, 1=nom champ, 2=nul autorisé
//											 rField['desc'] est complété par le nom de la table référencée
// ['type']*		: le type du champ et sa longeur à afficher
// ['enum'][]*	: si le chapmp est énuméré, liste des valeurs
// ['long'] 		: la longueur du champ (champ non énuméré) ou le nombre de valeurs (champ énuméré)
// ['dftValue']*: si le champ a une valeur par défaut
// ['autoInc']	: si le champ est auto incrémenté
// ['request']* : si le champ est obligatoire
// * = toujours présent
//
//==============================================================================
//function getFieldList2($varList){
function DB_getFieldList($tableName, $connectId){
	// --------------------------------------------------
	// initialisation de la lecture de chaque champ
	$i=0; 
	$sqlQuery =  "show fields from ".$tableName." ; ";
	$requeteId = DB_ouvrirRequete($sqlQuery, $connectId);
	// 1ère lecture
	$fieldTab = DB_lireLigne($requeteId);
	while($fieldTab)
	{ 
		$fieldList[$i]=DB_getFieldDef($fieldTab, $tableName);
		$i=$i+1; 
		$fieldTab = DB_lireLigne($requeteId);
	}
	return $fieldList;
}
//******************************************************************************
// récupération de la définition d'un champ d'une table
//==============================================================================
// initialise les données d'un champ
// retourne un tableau contenant :
// $rfield['name']* 	 	: le nom du champ
// $rfield['desc']* 	 	: la description à afficher
// $rfield['key']* 		: si le champ est la clé primaire ("PRI"/vide)
// $rfield['refField'][]	: le champ référencé si c'est une clé étrangère
// 					 		refField est un tableau de 3 données 0=nom table, 1=nom champ, 2=nul autorisé
//							rField['desc'] est complété par le nom de la table référencée
// $rfield['type']* 		: le type du champ et sa longeur à afficher
// $rfield['enum'][]*		: si le chapmp est énuméré, liste des valeurs
// $rfield['long'] 		: la longueur du champ (champ non énuméré) ou le nombre de valeurs (champ énuméré)
// $rfield['dftValue']*	: si le champ a une valeur par défaut (valeur/vide)
// $rfield['autoInc'] 		: si le champ est auto incrémenté ("auto_increment"/vide)
// $rfield['request']*		: si le champ est obligatoire ("yes"/"no")
//
// * = obligatoire
//==============================================================================
function DB_getFieldDef($field, $tableName) {
	//include	('library/dbDicTable.inc');
	include	('library/DB_def.inc.php');
	include	('library/DB_ref.inc.php');
	$fieldName=$field['Field'];
	// nom du champ + desc
	$rfield['name']=$field[0];//[0]; // nom du champ
	// description du champ
	$rfield['desc']=$DB_FieldDesc[$fieldName][0]; // field's short description (long=indice 1)
	// clé primaire
	if ($field[3]!='PRI')	$field[3]= "&nbsp; ";
	$rfield['key']= $field[3];
	// clé étrangère (description, table et champ référencés)
	if (isset($DB_FieldRef[$tableName][$fieldName])){
		 $rfield['refField']=$DB_FieldRef[$tableName][$fieldName];
		 $rfield['desc'] .="<br>(référencé dans : ".$refField[$tableName][$fieldName][0].")";
	}
	
	// extraction des valeurs pour un champ énuméré
	$type=explode("(",$field[1]);
	// type du champ (varchar, enum, int, char, text, float, ...
	$rfield['type']=$type[0];
	// champ de type énuméré, collecter les valeurs, noter la valeur par défaut
	if ($type[0]=='enum'){
		 $enum= explode("'",$type[1]);
		 $length=0;
		 for ($i=1;$i<count($enum); $i=$i+2){
		 		 if (sizeof($enum[$i])>$length) 
				 		$length=sizeof($enum[$i]);
		 		 $rfield['enum'][$i]=$enum[$i];
		 }
		 $rfield['long']=$length;
	} 
	// le champ n'est pas énuméré, récupérer sa longueur
	else
		if (isset($type[1]) && $type[1]!="") {
			$tmp=explode(")", $type[1]);
			$rfield['long']=$tmp[0];
		} 
//		else
//			$rfield['long']="";

	// collecter la valeur par défaut (définies dans la base)
	$rfield['dftValue']= ""; 
	if ($field[4]!="" or $field[4]>0 )
		 $rfield['dftValue']= $field[4]; 
	
	// mention auto_increment
	if ($field[5]=="auto_increment")
		 $rfield['autoInc']="auto_increment";
	
	// mention champ obligatoire
	//if (isRequestField($fieldName, $tableName) || $field[3]=='PRI')
	if ($DB_FieldDesc[$fieldName][3])
		$rfield['request']='yes'; 
	else
		$rfield['request']='no'; 
			
	return $rfield;
}
//******************************************************************************
// vérification si le champ fieldName est requis dan la table tableName
//==============================================================================
/*function isRequestField($fieldName, $tableName){
	include	('library/dbDicTable.inc'); // dictionnaire des tables
	$isRequest=false;
	for ($i=0;$i<sizeof($dicTable[$tableName]['requestFields']);$i++){
			if ($dicTable[$tableName]['requestFields'][$i]==$fieldName)
				 $isRequest=true;
	}
	return $isRequest;
}*/
//******************************************************************************
// récup de la liste des champs clés
// Retourne un tableau contenant la liste des noms des champs clé primaire de la table (extraits de la liste donnée)
// =============================================================================
function getPrimaryKey($fieldList) {
	$j=0;
	for ($i=0;$i<sizeof($fieldList);$i++) {
		if ($fieldList[$i]['key']=='PRI') $keyList[$j]=$fieldList[$i]['name'];
		$j++;
	}
		return (array) $keyList;
}
// ===================================================================================================
?>
