<?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 CoordinationObjManagerDb.php
*
* Ce fichier contient la classe CoordinationObjManagerDb
*
* @author Rooty <www.rooty.me|rooty@rooty.me>
* @link www.rooty.me
* @since 2004/04/14
* @version 0.3
* @package system_coordination
* @copyright Copyright &copy; 2009-2018, Rooty
*/
if ( !defined('SYSTEM_IN') )
{
 die("Hacking attempt");
}

/**
* Classe CoordinationObjManagerDb
*
* classe de gestion des CoordinationObjs pour une do de données database (type generes par database)<br><br>
* Sont configure dans config_data_acces.php:<br>
* - La do d'information <br>
*    (actuellement seul DB possible->Pour ajouter une do reproduire NodeCoordinationObjManagerDb)<br>
* - Le Nom de la Table<br>
* - La configuration (Paramétrage des dos de do de donn"ée"s) est faite dans config_data_do.php<br>
* - La declaration de la connexion est faite a partir de config_system.php
*
* @package system_coordination
*/
class CoordinationObjManagerDb extends CoordinationObjManager
{
/**
* @var chaine
* @access private
* @desc ID de la CoordinationObj
*/
var $table		= "";

/**
* @var array
* @access private
* @desc objet database
*/
var $sqlAttributArray	= array();

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

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

/**
* Constructeur de la classe CoordinationObjManagerDb PHP5
*
* <p>Initialise la CoordinationObjManagerDb</p>
* @access public
*/
	function __construct()
	{
		$this->setTable( DATA_ACCES_TABLE_COORDINATION_OBJ );		/* Appel à la constante correspondante */
		$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 booleen
*/
	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 utilisee
* @access public
* @param object objet classe "database"
* @return booleen
*/
	function setConn(&$obj)
	{
		if (!is_object($obj))
			return false;
		$this->conn=&$obj;
		return true;
	}

/**
* doLoadFromNodeId: Charge les Objects de coordination depuis la BD
*
*<p>Retourne un tableau contenant les infos des objets
*Precondition : id doit etre un entier
*</p>
* @access public
* @param entier identifiant de l'Object
* @return tableau
*/
	function doLoadFromNodeId($id)
	{
		$sql="SELECT * FROM ".$this->getTable()." WHERE ".$this->getSqlName("node")."=".$id."";

		# Requete
		$resultdb=$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 elements
		$this->conn->sql_freeresult();
		return $tab;
	}

/**
* doLoadFromId: Charge le DataObject depuis la BD
*
* <p>Retourne un tableau contenant les infos de l'objets
* <br>ou faux si n'existe pas;<br>
* Précondition : id doit etre un entier
* </p>
* @access public
* @param entier identifiant de la DataObject
* @return tableau
*/
	function doLoadFromId($id)
	{
		$sql="SELECT * FROM ".$this->getTable()." WHERE ".$this->getSqlName("id")."=".$id."";

		# Requete
		$resultdb=$this->conn->sql_query($sql);
		if ($this->conn->sql_numrows()==0)
		{
			$systemError=1;
			$classe="DataObject";
			$message="Erreur dans CoordinationObjManagerDb";
			addError($systemError,$classe,$message, __line__, __file__);
			return array();
		}

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

		# Destruction des elements
		$this->conn->sql_freeresult();
		return $tab;
	}

/**
* doLoadFromIds: Charge le DataObject depuis la BD
*
*<p>Retourne un tableau contenant les infos de l'objets
*<br>ou faux si n'existe pas;<br>
*Précondition : id doit être un entier
*</p>
* @access public
* @param entier identifiant de la DataObject
* @return tableau
*/
	function doLoadFromIds($array)
	{
		if(count($array)==0)
		{
			return array();
		}

		$sql="SELECT * FROM ".$this->getTable()." WHERE ".$this->getSqlName("id")." IN (".implode(",", $array).")";

		# Requete
		$resultdb=$this->conn->sql_query($sql);
		if ($this->conn->sql_numrows()==0)
		{
			$systemError=1;
			$classe="DataObject";
			$message="Erreur dans CoordinationObjManagerDb";
			addError($systemError,$classe,$message, __line__, __file__);
			return array();
		}

		$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 elements
		$this->conn->sql_freeresult();
		return $tab;
	}

/**
* doLoadFromNodeIds: Charge le DataObject depuis la BD
*
*<p>Retourne un tableau contenant les infos de l'objets
*<br>ou faux si n'existe pas;<br>
*Pr�ondition : id doit être un entier
*</p>
* @access public
* @param entier identifiant de la DataObject
* @return tableau
*/
	function doLoadFromNodeIds($array)
	{
		$sqlOpt="";
		for ($i=0; $i<count($array); $i++)
		{
			if (is_numeric($array[$i]))
			{
				$sqlOpt.=" OR ".$this->getSqlName("node")."=".$array[$i];
			}
		}

		if ($sqlOpt=="") return array();

		$sql="SELECT * FROM ".$this->getTable()." WHERE ".$this->getSqlName("node")."=".$array[0].$sqlOpt;

		# Requete
		$resultdb=$this->conn->sql_query($sql);
		if ($this->conn->sql_numrows()==0)
		{
			$systemError=1;
			$classe="DataObject";
			$message="Erreur dans CoordinationObjManagerDb";
			addError($systemError,$classe,$message, __line__, __file__);
			return array();
		}

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

/**
* doInsert: Insert la DataObject dans la BD
*<p>Insertion dans la Bd</p>
* @param entier id
* @param date date de creation
* @param chaine proprietaire
* @param chaine noeud de creation
* @param chaine path vers l'icone
* @param chaine nom de la classe de l'objet
* @param chaine nom de l'objet
* @param chaine resume de l'objet
* @param chaine contenu de l'objet
* @param chaine mot cle de l'objet
* @param date date de parution
* @param date date d'archivage
* @access public
* @return entier identifiant de la l'insertion
*/
	function doInsert($create, $owner, $noeud, $icone, $contentType, $contentName, $contentResume, $contentData, $contentKeyWord, $contentParution, $contentArchivage)
	{
		$sql="INSERT INTO ".$this->getTable()
			." (".$this->getSqlName("create").", "
			.$this->getSqlName("owner").", "
			.$this->getSqlName("node").", "
			.$this->getSqlName("icone").", "
			.$this->getSqlName("contentType").", "
			.$this->getSqlName("name").", "
			.$this->getSqlName("resume").", "
			.$this->getSqlName("keyword").", "
			.$this->getSqlName("parution").", "
			.$this->getSqlName("archivage").", "
			.$this->getSqlName("data").") VALUES (";

		$sql.="'".$create."' , ".$owner.", ".$noeud.", '".$icone."', '".$contentType."', '".$contentName."', '".$contentResume."', '".$contentKeyWord."', '1970-01-01', '1970-01-01', '".$contentData."')";

		# Requete
		$result=$this->conn->sql_query($sql);
		if ($this->conn->sql_affectedrows()==0)
		{
			$systemError=1;
			$classe="DataObject";
			$message="Erreur de SUPPRESSION dans CoordinationObjManagerDb";
			addError($systemError,$classe,$message, __line__, __file__);
			return 0;
		}
		$retour=$this->conn->sql_nextid();
		return $retour;
	}

/**
* doUpdate:Modifie la DataObject dans la BD
*<p>Mise a jour de la DataObject</p>
* @param entier id
* @param date date de creation
* @param chaine proprietaire
* @param chaine noeud de creation
* @param chaine path vers l'icone
* @param chaine nom de la classe de l'objet
* @param chaine nom de l'objet
* @param chaine resume de l'objet
* @param chaine contenu de l'objet
* @param chaine mot cle de l'objet
* @param date date de parution
* @param date date d'archivage
* @access public
* @return entier id
*/
	function doUpdate($id, $create, $owner, $noeud, $icone, $contentType, $contentName, $contentResume, $contentData, $contentKeyWord, $contentParution, $contentArchivage)
	{
		$sql ="UPDATE ".$this->getTable()." SET "
			.$this->getSqlName("id")."=".$id.", "
			.$this->getSqlName("create")."='".$create."', "
			.$this->getSqlName("owner")."=".$owner.", "
			.$this->getSqlName("node")."=".$noeud.", "
			.$this->getSqlName("icone")."='".$icone."', "
			.$this->getSqlName("contentType")."='".$contentType."', "
			.$this->getSqlName("name")."='".$contentName."', "
			.$this->getSqlName("resume")."='".$contentResume."', "
			.$this->getSqlName("keyword")."='".$contentKeyWord."', "
			.$this->getSqlName("parution")."='1970-01-01', "
			.$this->getSqlName("archivage")."='1970-01-01', "
			.$this->getSqlName("data")."='".$contentData."'"
		." WHERE ".$this->getSqlName("id")."=".$id;

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

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

		# Requete
		$result=$this->conn->sql_query($sql);
		if ($this->conn->sql_affectedrows()==0)
		{
			$systemError=1;
			$classe="DataObject";
			$message="Erreur de SUPPRESSION dans CoordinationObjManagerDb";
			addError($systemError,$classe,$message, __line__, __file__);
			return false;
		}
		return true;
	}

	//////////////////////////////////////////////////////////////////////////
	//
	// 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["create"]			=$sqlArray[$this->getSqlName("create")];
		$result["owner"]			=$sqlArray[$this->getSqlName("owner")];
		$result["icone"]			=$sqlArray[$this->getSqlName("icone")];
		$result["node"]				=$sqlArray[$this->getSqlName("node")];
		$result["contentType"]			=$sqlArray[$this->getSqlName("contentType")];
		$result["name"]				=$sqlArray[$this->getSqlName("name")];
		$result["resume"]			=$sqlArray[$this->getSqlName("resume")];
		$result["data"]				=$sqlArray[$this->getSqlName("data")];
		$result["keyWord"]			=$sqlArray[$this->getSqlName("keyword")];
		$result["parution"]			=$sqlArray[$this->getSqlName("parution")];
		$result["archivage"]			=$sqlArray[$this->getSqlName("archivage")];

		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"]				="coordination_object_id";
				$this->sqlAttributArray["create"]			="coordination_object_created";
				$this->sqlAttributArray["owner"]			="user_id";
				$this->sqlAttributArray["icone"]			="coordination_object_icone";
				$this->sqlAttributArray["node"]				="node_id";
				$this->sqlAttributArray["contentType"]			="coordination_object_content_type";
				$this->sqlAttributArray["name"]				="coordination_object_name";
				$this->sqlAttributArray["resume"]			="coordination_object_resume";
				$this->sqlAttributArray["data"]				="coordination_object_data";
				$this->sqlAttributArray["keyword"]			="coordination_object_keyword";
				$this->sqlAttributArray["parution"]			="coordination_object_parution";
				$this->sqlAttributArray["archivage"]			="coordination_object_archivage";
				return true;
			}
		}

		$this->sqlAttributArray["id"]				='id';
		$this->sqlAttributArray["create"]			="created";
		$this->sqlAttributArray["owner"]			="owner";
		$this->sqlAttributArray["icone"]			="icone";
		$this->sqlAttributArray["node"]				="node";
		$this->sqlAttributArray["contentType"]			="content_type";
		$this->sqlAttributArray["name"]				="name";
		$this->sqlAttributArray["resume"]			="resume";
		$this->sqlAttributArray["data"]				="datas";
		$this->sqlAttributArray["keyword"]			="keyword";
		$this->sqlAttributArray["parution"]			="parution";
		$this->sqlAttributArray["archivage"]			="archivage";
		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 );
	}
}
?>
