Valider f4c01a6d rédigé par cerdic's avatar cerdic
Parcourir les fichiers

Le cache SQL memorise des infos venant des pipelines (descriptions des...

Le cache SQL memorise des infos venant des pipelines (descriptions des objets). Il doit donc logiquement en dependre, sauf a risque de ressortir des infos incoherentes du cache SQL.
On calcule donc un md5 de lister_tables_objets_sql utilisé dans le nom du cache SQL,
et quand le nom du cache change, on reset les infos en memoire (scenario reconstruction des plugins avec un premier appel a trouver_table avant)
parent 97625f23
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+5 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -33,6 +33,7 @@ function array_set_merge(&$table,$index,$valeur){
function lister_tables_objets_sql($table_sql=null, $desc=array()){
	static $deja_la = false;
	static $infos_tables = null;
	static $md5 = null;
	// prealablement recuperer les tables_principales
	if (is_null($infos_tables)){
		// pas de reentrance (cas base/serial)
@@ -357,9 +358,11 @@ function lister_tables_objets_sql($table_sql=null, $desc=array()){
		}

		$deja_la = false;
		// lever la constante qui dit qu'on a tout init et qu'on peut cacher
		define('_init_tables_objets_sql',true);
		// signature
		$md5 = md5(serialize($infos_tables));
	}
	if ($table_sql==="::md5")
		return $md5;
	if ($table_sql AND !isset($infos_tables[$table_sql])){
		#$desc = renseigner_table_objet_sql($table_sql,$desc);
		$desc = renseigner_table_objet_interfaces($table_sql,$desc);
+15 −16
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -41,20 +41,24 @@ function base_trouver_table_dist($nom, $serveur='', $table_spip = true){
		return null;

	$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
	$objets_sql = lister_tables_objets_sql("::md5");

	// le nom du cache depend du serveur mais aussi du nom de la db et du prefixe
	// ce qui permet une auto invalidation en cas de modif manuelle du fichier
	// de connexion, et tout risque d'ambiguite
	if (!isset($nom_cache_desc_sql[$serveur]))
		$nom_cache_desc_sql[$serveur] =
	if (!isset($nom_cache_desc_sql[$serveur][$objets_sql])){
		$nom_cache_desc_sql[$serveur][$objets_sql] =
		  _DIR_CACHE . 'sql_desc_'
		  . ($serveur ? "{$serveur}_":"")
		  . substr(md5($connexion['db'].":".$connexion['prefixe']),0,8)
		  . substr(md5($connexion['db'].":".$connexion['prefixe'].":$objets_sql"),0,8)
			.'.txt';
		// nouveau nom de cache = nouvelle version en memoire
		unset($connexion['tables']);
	}

	// un appel avec $nom vide est une demande explicite de vidange du cache des descriptions
	if (!$nom){
		spip_unlink($nom_cache_desc_sql[$serveur]);
		spip_unlink($nom_cache_desc_sql[$serveur][$objets_sql]);
		$connexion['tables'] = array();
		return null;
	}
@@ -83,7 +87,7 @@ function base_trouver_table_dist($nom, $serveur='', $table_spip = true){
	if (!isset($connexion['tables'][$nom])
	  AND _VAR_MODE!=='recalcul'
	  AND (!isset($connexion['tables']) OR !$connexion['tables'])) {
		if (lire_fichier($nom_cache_desc_sql[$serveur],$desc_cache)
		if (lire_fichier($nom_cache_desc_sql[$serveur][$objets_sql],$desc_cache)
		  AND $desc_cache=unserialize($desc_cache))
		  $connexion['tables'] = $desc_cache;
	}
@@ -128,17 +132,12 @@ function base_trouver_table_dist($nom, $serveur='', $table_spip = true){
		$desc = array_merge(lister_tables_objets_sql($nom_sql,$desc),$desc);

		// si tables_objets_sql est bien fini d'init, on peut cacher
		if (defined('_init_tables_objets_sql')){
		$connexion['tables'][$nom] = $desc;
		$res = &$connexion['tables'][$nom];
		// une nouvelle table a ete decrite
		// mettons donc a jour le cache des descriptions de ce serveur
		if (is_writeable(_DIR_CACHE))
				ecrire_fichier($nom_cache_desc_sql[$serveur],serialize($connexion['tables']));
		}
		// sinon on renvoit ce qu'on a deja, et on ne cache rien
		else
			$res = $desc;
			ecrire_fichier($nom_cache_desc_sql[$serveur][$objets_sql],serialize($connexion['tables']));
	}
	else
		$res = &$connexion['tables'][$nom];