<?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 CacheManagerDb.php
*
* Ce fichier contient la classe CacheManagerDb
*
* @author Rooty <www.rooty.me|rooty@rooty.me>
* @link www.rooty.me
* @since 2004/04/14
* @version 0.3
* @package system_data
* @subpackage cache
* @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 CacheManagerDb
*
* classe de gestion des Caches pour une ressource de données database<br>
* <i>(type gérés par le package sytem_data_source/database)</i><br>
* <br>
* L'objet ressource Db surcharge les methode do de son manager<br>
* <br>
* Sont configuré dans config.data_acces.php:<br>
* - Le Nom de la Table<br>
* - La configuration (Paramétrage des données) est faite dans config.data_acces.php<br>
* - La declaration de la connexion est faite par system_control<br>
*   <i>(sous le nom de la variable Global $GLOBALS['SYSTEM_DATABASE_CONN'])</i>
*
* @package system_data
* @subpackage cache
*/
class CacheManagerDb extends CacheManager
{
/**
* @var chaine
* @desc nom de la table (configuré dans config.data_acces.php)
* @access private
*/
var $table		= "";

/**
* @var chaine
* @desc taille max de la chaine sql
* @access private
*/
var $maxSqlSize		= 8000;

/**
* @var object
* @desc objet database (msql3, msql4, mysql5... voir dans le package system_data_source, database)
* @access private
*/
var $conn		= null;

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

/**
* Constructeur de la classe CacheManagerDb (PHP5)
*
* <p>Initialise la CacheManagerDb</p>
* @access public
*/
	function __construct($src)
	{
		$this->setTable( $src );	/* Appel à la constant correspondant */
		$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;
	}

/**
* getConn : recupere l'objet connexion de type database
*
* @access public
* @return chaine
*/
	function getConn()
	{
		return $this->conn;
	}

/**
* setConn : affecte unj objet de type "database"
*
* @access public
* @param object objet classe "database"
* @return chaine
*/
	function setConn(&$obj)
	{
		if (!is_object($obj))
			return false;

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

/**
* doInsert: Insert la Cache dans la BD
*
* <p>Insertion dans la Bd</p>
*
* @param entier id de l'objet
* @param chaine données linearisés à sauvegarder
* @access public
* @return entier
*/
	function doInsert($id, $data)
	{
		$str=base64_encode(serialize($data));		// chaine de cache
		$len=strlen($str);				// Longueur totale du cahe
		$begin=0;					// Longueur actuelle de la chaine traitée
		$i=1;

		while($begin<$len)
		{
			$end=( ($len-$begin)>=0 )?$this->maxSqlSize:($len-$begin);
			$sql="INSERT INTO ".$this->getTable()." (cache_id, cache_index, cache_data) VALUES (";
			$sql.="".$id.", ".$i.", '".substr($str, $begin, $end)."')";

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

			$begin+=$end;
			$i++;
		}
		return $id;
	}

/**
* doLoadFromId: Charge le Cache depuis la BD
*
* <p>Retourne un tableau contenant les infos de l'objet<br>
* Précondition : id doit être un entier
* </p>
*
* @access public
* @param entier identifiant de la Cache
* @return tableau
*/
	function doLoadFromId($id)
	{
		$tab=array("id"=>$id, "data"=>NULL);

		$sql="SELECT * FROM ".$this->getTable()." WHERE cache_id=".$id." ORDER BY cache_index";

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

		if ($nbRow>=0)
		{
			for($i=0; $i<$nbRow; $i++)
			{
				$tabRow=$this->conn->sql_fetchrow();
				$tab["id"]   =$tabRow["cache_id"];
				$tab["data"].=$tabRow["cache_data"];
			}
			$tab["data"]=unserialize(base64_decode($tab["data"]));

			$this->conn->sql_freeresult();
			return $tab;
		}else{
			return array();
		}
	}

/**
* doUpdate:Modifie la Cache dans la BD
*
* <p>Mise à jour de la Cache</p>
* @param entier identifiant
* @param mixed données
* @access public
* @return booleen
*/
	function doUpdate($id, $data)
	{
		$this->doDelete($id);
		$this->doInsert($id, $data);
		return $id;
	}

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

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

/**
* doEmptyCache :Detruit le Cache dans la BD
*
* Attention détruire toute une table de cache suppose qu'il soit regenere ....<BR/>
* Cette opération ne doit probablement jamais être execute.
* @access public
* @return booleen
*/
	function doEmptyCache()
	{
		$sql="TRUNCATE TABLE ".$this->getTable()."";

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