<?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.
*
* Fichier NodeManagerDb.php
*
* Ce fichier contient la classe NodeManagerDb
*
* @author Rooty <www.rooty.me|rooty@rooty.me>
* @link www.rooty.me
* @since 2004/04/14
* @version 0.3
* @package system_data
* @subpackage Node
* @copyright Copyright &copy; 2009-2018, Rooty
*/

#####################################################################################################
################################# Parametrage
#####################################################################################################
/**
* declaration du system... si cette variable n'est pas définie, les fichier inclus ne marche pas...
* cette variable est déclarée sur la page d'execution du script.
*<p> if ( !defined('SYSTEM_IN') )
* {
* die("Hacking attempt");
* }</p>
*/
if ( !defined('SYSTEM_IN') )
{
 die("Hacking attempt");
}

/**
* Classe NodeManagerDb
*
* classe de gestion des Nodes pour une do de données database (type gérés par database)<br><br>
* Sont configuré dans config_data_acces.php:<br>
* - La do d'information <br>
*    (actuellement seul DB possible->Pour ajouter une do reproduire NodeNodeManagerDb)<br>
* - Le Nom de la Table<br>
* - La configuration (Paramétrage des dos de do de données) est faite dans config_data_do.php<br>
* - La declaration de la connexion est faite à partir de config_system.php
*
* @package system_data
* @subpackage Node
*/
class NodeManagerDb extends NodeManager
{

/**
* @var chaine
* @access private
* @desc ID de la Node
*/
var $table		= "";

/**
* @var object
* @access private
* @desc objet database
*/
var $conn		= null;

	//
	// Constructor
	//

/**
* Constructeur de la classe NodeManagerDb PHP4
*
* <p>Initialise la NodeManagerDb</p>
* @access public
*/
	function NodeManagerDb()
	{
		$this->__construct();
	}

/**
* Constructeur de la classe NodeManagerDb PHP5
*
* <p>Initialise la NodeManagerDb</p>
* @access public
*/
	function __construct()
	{
		$this->setTable( DATA_ACCES_TABLE_NODE );	/* Appel à la constant correspondant */
		$this->initSqlAttribut();			/* initialisation des noms de champs */
		$this->setConn($GLOBALS['SYSTEM_DATABASE_CONN']);
	}

/**
* getTable : recupere le nom de la table utilisée
* @access public
* @return chaine
*/
	function getTable()
	{
		return $this->table;
	}

/**
* setTable : recupere le nom de la table utilisée
* @access public
* @param chaine nom de la table
* @return chaine
*/
	function setTable($chaine)
	{
		if (!is_string($chaine))
			return false;

		$this->table=$chaine;
		return true;
	}

/**
* getTable : recupere le nom de la table utilisée
* @access public
* @return chaine
*/
	function getConn()
	{
		return $this->conn;
	}

/**
* setTable : recupere le nom de la table utilisée
* @access public
* @param object objet classe "database"
* @return chaine
*/
	function setConn(&$obj)
	{
		if (!is_object($obj))
			return false;

		$this->conn=&$obj;
		return true;
	}

/**
* doLoadFromId: Charge le Noeud depuis la BD
*
* <p>Retourne un tableau contenant les infos de l'objet</p>
* @access private
* @param entier identifiant du Noeud
* @return tableau
*/
	function doLoadFromId($id)
	{
		$sql = "SELECT * FROM ".$this->getTable()." WHERE ".$this->getSqlName("id")."=".$id;
// 		$sql.= " AND ".$this->getSqlName("domain")."=".$_SERVER["SERVER_NAME"];
		
		# Requete
		$result=$this->conn->sql_query($sql);

		if ($this->conn->sql_numrows()==0)
		{
			$systemError=1;
			$classe="Node";
			$message="Erreur du load from id dans l'objet FetchNodeManagerDb LoadFromId, avec l'id=".$id;
			addError($systemError,$classe,$message, __line__, __file__);
			return array();
		}

		$tab=$this->conn->sql_fetchrow();
		$tab=$this->translateArray($tab);

		# Destruction des éléments
		$this->conn->sql_freeresult();
		return $tab;
	}

/**
* doInsert: Insert le Noeud dans la BD
*
* <P>Insertion dans la Bd</P>
* @param entier identifiant du pére
* @param chaine libelle de du noeud
* @param chaine icone de du noeud
* @access private
* @return entier
*/
	function doInsert($idPere, $libelle, $icone, $template, $domain, $haspublic, $ctype, $ctypereg, $usergroupid, $subsgroupid, $subsgrouptempid, $mailnode)
	{
		$sql="INSERT INTO ".$this->getTable()." ("
			.$this->getSqlName("idpere").", "
			.$this->getSqlName("libelle").", "
			.$this->getSqlName("icone").", "
			.$this->getSqlName("template").", "
			.$this->getSqlName("domain").", "
			.$this->getSqlName("haspublic").", "
			.$this->getSqlName("ctype").", "
			.$this->getSqlName("ctypereg").", "
			.$this->getSqlName("usergroupid").", "
			.$this->getSqlName("subsgroupid").", "
			.$this->getSqlName("subsgrouptempid").", "
			.$this->getSqlName("mailnode").") VALUES (";
		$sql.="'".$idPere."', '".$libelle."', '".$icone."', '".$template."', '".$domain."', '".$haspublic."', '".$ctype."', '".$ctypereg."', '".$usergroupid."', '".$subsgroupid."', '".$subsgrouptempid."', '".$mailnode."')";

		# Requete
		$result=$this->conn->sql_query($sql);

		if ($this->conn->sql_affectedrows()==0)
		{
			$systemError=1;
			$classe="Node";
			$message="Erreur d'INSERTION dans FetchNodeManagerDb avec le libelle".$libelle."\n".$sql;
			addError($systemError,$classe,$message, __line__, __file__);
			return 0;
		}
		$retour=$this->conn->sql_nextid();
		return $retour;
	}

/**
* doUpdate : Modifie le Noeud dans la BD
*
* <P>Mise à jour de la Node</P>
* @param entier identifiant
* @param entier identifiant du pére
* @param chaine libelle de du noeud
* @param chaine icone de du noeud
* @access private
* @return booleen
*/
	function doUpdate($id, $idPere, $libelle, $icone, $template, $domain, $haspublic, $ctype, $ctypereg, $usergroupid, $subsgroupid, $subsgrouptempid, $mailnode)
	{
		$sql="UPDATE ".$this->getTable()." SET "
			.$this->getSqlName("id")."='".$id."', "
			.$this->getSqlName("idpere")."='".$idPere."', "
			.$this->getSqlName("libelle")."='".$libelle."', "
			.$this->getSqlName("icone")."='".$icone."', "
			.$this->getSqlName("template")."='".$template."', "
			.$this->getSqlName("domain")."='".$domain."', "
			.$this->getSqlName("haspublic")."='".$haspublic."', "
			.$this->getSqlName("ctype")."='".$ctype."', "
			.$this->getSqlName("ctypereg")."='".$ctypereg."', "
			.$this->getSqlName("usergroupid")."='".$usergroupid."', "
			.$this->getSqlName("subsgroupid")."='".$subsgroupid."', "
			.$this->getSqlName("subsgrouptempid")."='".$subsgrouptempid."', "
			.$this->getSqlName("mailnode")."='".$mailnode."'WHERE ";
		$sql.=$this->getSqlName("id")."=".$id;

// 		var_dump($sql);
// 		exit(0);
		
		# Requete
		$result=$this->conn->sql_query($sql);
		$retour=$id;
		return $retour;
	}

/**
* doDelete : Detruit le Noeud dans la BD
*
* <p>Suppression du noeud à partir de son identifiant</p>
* @param entier identifiant du Noeud
* @access private
* @return booleen
*/
	function doDelete($id)
	{
		$sql="DELETE FROM ".$this->getTable()." WHERE ".$this->getSqlName("id")."=".$id;

		# Requete
		$result=$this->conn->sql_query($sql);

		if ($this->conn->sql_affectedrows()==0)
		{
			$systemError=1;
			$classe="Node";
			$message="Erreur de SUPPRESSION dans FetchNodeManagerDb avec l'id ".$id;
			addError($systemError,$classe,$message, __line__, __file__);
			return false;
		}
		return true;
	}

/**
* doLoadFromIdPere: Charge les Noeud depuis la BD à partir d'un idpere
*
* <P>Retourne un tableau contenant les infos de l'objet
* <br>ou faux si n'existe pas;<br>
* !!! id doit être un entier</P>
* @access private
* @param entier identifiant de la Node
* @return tableau
*/
	function doLoadFromIdPere($id)
	{
		$sql = "SELECT * FROM ".$this->getTable()." WHERE ".$this->getSqlName("idpere")."=".$id;
// 		$sql.= " AND ".$this->getSqlName("domain")."=".$_SERVER["SERVER_NAME"];

// 		if( $id >> 100 )
// 			$sql.= " AND ".$this->getSqlName("domain")."=".$_SERVER["SERVER_NAME"];
		
		# Requete
		$result=$this->conn->sql_query($sql);
		$tab=array();

		for ($i=0; $i<$this->conn->sql_numrows();$i++)
		{
			$tab[$i]=$this->conn->sql_fetchrow();
			$tab[$i]=$this->translateArray($tab[$i]);
		}

		# Destruction des éléments
		$this->conn->sql_freeresult();
		return $tab;
	}

	//////////////////////////////////////////////////////////////////////////
	//
	// Utilitaires pour la gestion des compatibilités BD
	//
	/////////////////////////////////////////////////////////////////////////
/**
* translateKey : change les cles du tableau resultant d'une requete en tableau de données pour l'objet
*
* <p>Supprime le nom de la table dans les noms de champs renvoyés par la BD<br/>
* garde la compatibilité avec les version précédentes</p>
* @param array tableau sql
* @access private
* @return array tableau des attributs
*/
	function translateArray($sqlArray)
	{
		/* Cas nouvelle BD systeme */
		$result["id"]				=$sqlArray[$this->getSqlName('id')];
		$result["idpere"]			=$sqlArray[$this->getSqlName("idpere")];
		$result["libelle"]			=$sqlArray[$this->getSqlName("libelle")];
		$result["icone"]			=$sqlArray[$this->getSqlName("icone")];
		$result["template"]			=$sqlArray[$this->getSqlName("template")];
		$result["domain"]			=$sqlArray[$this->getSqlName("domain")];
		$result["haspublic"]			=$sqlArray[$this->getSqlName("haspublic")];
		$result["ctype"]			=$sqlArray[$this->getSqlName("ctype")];
		$result["ctypereg"]			=$sqlArray[$this->getSqlName("ctypereg")];
		$result["usergroupid"]			=$sqlArray[$this->getSqlName("usergroupid")];
		$result["subsgroupid"]			=$sqlArray[$this->getSqlName("subsgroupid")];
		$result["subsgrouptempid"]		=$sqlArray[$this->getSqlName("subsgrouptempid")];
		$result["mailnode"]			=$sqlArray[$this->getSqlName("mailnode")];
		return $result;
	}

/**
* initSqlAttributName : recupere le nom d'un attribut a partir d'une cle
*
* <p>En fonction de la version sql, on trouvera ici la correspondance entre le nom attribut de l'objet et son nom en BD<br/>
* cette methode permet de garder la compatibilité avec les version précédentes</p>
* @param chaine nom de l'attribut recherche
* @access private
* @return booleen
*/
	function initSqlAttribut()
	{
		if(defined('DATA_ACCES_TABLE_VERSION'))
		{
			if( DATA_ACCES_TABLE_VERSION == 1)
			{
				$this->sqlAttributArray["id"]				="node_id";
				$this->sqlAttributArray["idpere"]			="node_node_id";
				$this->sqlAttributArray["libelle"]			="node_libelle";
				$this->sqlAttributArray["icone"]			="node_icone";
				$this->sqlAttributArray["template"]			="node_template";
				$this->sqlAttributArray["domain"]			="node_domain";
				$this->sqlAttributArray["haspublic"]			="node_haspublic";
				$this->sqlAttributArray["ctype"]			="node_ctype";
				$this->sqlAttributArray["ctypereg"]			="node_ctypereg";
				$this->sqlAttributArray["usergroupid"]			="node_usergroupid";
				$this->sqlAttributArray["subsgroupid"]			="node_subsgroupid";
				$this->sqlAttributArray["subsgrouptempid"]		="node_subsgrouptempid";
				$this->sqlAttributArray["mailnode"]			="node_mailnode";
				return true;
			}
		}
		$this->sqlAttributArray["id"]				="id";
		$this->sqlAttributArray["idpere"]			="idpere";
		$this->sqlAttributArray["libelle"]			="libelle";
		$this->sqlAttributArray["icone"]			="icone";
		$this->sqlAttributArray["template"]			="template";
		$this->sqlAttributArray["domain"]			="domain";
		$this->sqlAttributArray["haspublic"]			="haspublic";
		$this->sqlAttributArray["ctype"]			="ctype";
		$this->sqlAttributArray["ctypereg"]			="ctypereg";
		$this->sqlAttributArray["usergroupid"]			="usergroupid";
		$this->sqlAttributArray["subsgroupid"]			="subsgroupid";
		$this->sqlAttributArray["subsgrouptempid"]		="subsgrouptempid";
		$this->sqlAttributArray["mailnode"]			="mailnode";
		return true;
	}

/**
* getSqlName : recupere le nom du champ a partir d'une cle
*
* <p>En fonction de la version sql, on trouvera ici la correspondance entre le nom attribut de l'objet et son nom en BD<br/>
* Cette methode permet de garder la compatibilite avec les version précédentes<br/>
* Elle s'appuie sur le tableau associatif $this->sqlAttributArray genere par initSqlAttributArray</p>
* @param chaine nom de l'attribut recherche
* @access private
* @return chaine nom du champ sql
*/
	function getSqlName($attribut)
	{
		return ( (isset($this->sqlAttributArray[$attribut]))?$this->sqlAttributArray[$attribut]:$attribut );
	}
}
?>
