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

complement a [15551] : separer les caches de spip_articles et articles, qui ne...

complement a [15551] : separer les caches de spip_articles et articles, qui ne sont pas interpretes de la meme facon :
trouver_table('articles') recherche 'spip_articles' avec translation du prefixe
trouver_table('spip_articles') recherchera 'spip_articles' explicitement, (independamment du prefixe de l'installation)

On en profite pour nommer plus precisemment le fichier cache afin qu'il depende aussi du nom de la db et du prefixe, et qu'il soit auto invalide si config/connect.php est edite a la main

Enfin, puisque trouver_table('mots_articles') fonctionne sans preciser le prefixe spip_, on autoriser le meme raccourci implicite sur toutes les tables principales, meme si pas de declaration dans table_des_tables, ce qui permet une homogeneite du comportement

Le regle d'ecriture d'un nom de table dans une boucle est donc :
- ne pas mettre le prefixe spip_ pour toutes les tables principales/auxiliaires, si on veut etre sur qu'il s'agit de la table avec le prefixe de la connexion
- mettre le prefixe 'spip_' pour aller chercher explicitement la table nommee ainsi, independamment du prefixe de la connexion.

Pour faire un squelette generique avec une boucle sur xxx, il faut donc declarer la table xxx en principale au auxiliaire, sinon on est oblige d'indiquer le prefixe dans le nom de la boucle, et il ne sera pas traduit a l'execution.

Ce point est genant, dans d'autres situations egalement.
On pourrait modifier la regle en disant que 'spip_' doit toujours etre traduit, mais cela empecherait du coup d'acceder a une table externe 'spip_articles' sur une installation avec un prefixe different de 'spip_'. 
Le probleme semble insoluble sans ajouter un argument a la fonction trouver_table, ce qui n'est pas envisageable a ce stade.
A revoir sur la branche dev, donc
parent 0ffed5b4
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+40 −23
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -36,10 +36,19 @@ function base_trouver_table_dist($nom, $serveur=''){
	if (!spip_connect($serveur)
	OR !preg_match('/^[a-zA-Z0-9._-]*/',$nom))
		return null;
	if (!isset($nom_cache_desc_sql[$serveur]))
		$nom_cache_desc_sql[$serveur] = _DIR_CACHE . 'sql_desc' . ($serveur ? '_'.md5($serveur):'') . '.txt';

	$connexion = &$GLOBALS['connexions'][$serveur ? $serveur : 0];

	// 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] =
		  _DIR_CACHE . 'sql_desc_'
		  . ($serveur ? "$serveur_":"")
		  . substr(md5($connexion['db'].":".$connexion['prefixe']),0,8)
			.'.txt';

	// un appel avec $nom vide est une demande explicite de vidange du cache des descriptions
	if (!$nom){
		spip_unlink($nom_cache_desc_sql[$serveur]);
@@ -55,44 +64,52 @@ function base_trouver_table_dist($nom, $serveur=''){

	$desc = '';

	// base sous SPIP: gerer les abreviations des noms de table
	// base sous SPIP: gerer les abreviations explicites des noms de table
	if ($connexion['spip_connect_version']) {
		include_spip('public/interfaces');
		if (isset($table_des_tables[$nom])) {
			$nom = $table_des_tables[$nom];
			$nom_sql = 'spip_' . $nom;
		}
		if (!isset($connexion['tables'][$nom_sql])) {
			include_spip('base/serial');
			if (isset($tables_principales[$nom_sql]))
				$fdesc = $tables_principales[$nom_sql];
			else {
				include_spip('base/auxiliaires');
				if (isset($tables_auxiliaires['spip_' .$nom])) {
					$nom_sql = 'spip_' . $nom;
					$fdesc = $tables_auxiliaires[$nom_sql];
				}  # table locale a cote de SPIP, comme non SPIP:
			}
		}
	}

	// si c'est la premiere table qu'on cherche
	// et si on est pas explicitement en recalcul
	// on essaye de recharger le cache des decriptions de ce serveur
	// dans le fichier cache
	if (!isset($connexion['tables'][$nom_sql])
	if (!isset($connexion['tables'][$nom])
	  AND $GLOBALS['var_mode']!=='recalcul'
	  AND (!isset($connexion['tables']) OR !$connexion['tables'])) {
		if (lire_fichier($nom_cache_desc_sql[$serveur],$desc_cache)
		  AND $desc_cache=unserialize($desc_cache))
		  $connexion['tables'] = $desc_cache;
	}
	if (!isset($connexion['tables'][$nom_sql])) {
	if (!isset($connexion['tables'][$nom])) {
		include_spip('base/serial');

		if (isset($tables_principales[$nom_sql]))
			$fdesc = $tables_principales[$nom_sql];
		// meme si pas d'abreviation declaree, trouver la table spip_$nom
		// si c'est une table principale,
		// puisqu'on le fait aussi pour les tables auxiliaires
		elseif ($nom_sql==$nom AND isset($tables_principales['spip_' .$nom])){
			$nom_sql = 'spip_' . $nom;
			$fdesc = &$tables_principales[$nom_sql];
		}
		else {
			include_spip('base/auxiliaires');
			if (isset($tables_auxiliaires['spip_' .$nom])) {
				$nom_sql = 'spip_' . $nom;
				$fdesc = &$tables_auxiliaires[$nom_sql];
			}  # table locale a cote de SPIP, comme non SPIP:
		}

		// faut il interpreter le prefixe 'spip_' ?
		$transposer_spip = ($nom_sql != $nom);
		
		// La *vraie* base a la priorite
		if (true /*  !$bdesc OR !$bdesc['field']  */) {
			$t = ($nom_sql != $nom);
			$desc = sql_showtable($nom_sql, $t, $serveur);
			$desc = sql_showtable($nom_sql, $transposer_spip, $serveur);
			if (!$desc OR !$desc['field']) {
				if (!$fdesc) {
					spip_log("trouver_table: table inconnue '$serveur' '$nom'");
@@ -113,19 +130,19 @@ function base_trouver_table_dist($nom, $serveur=''){
		$desc['connexion']= $serveur;
		// objet_type peut provoquer un appel reentrant ici.
		// pour ne pas faire de boucle infinie, on stocke ce qu'on a deja trouve
		$connexion['tables'][$nom_sql] = $desc;
		$connexion['tables'][$nom] = $desc;

		$table = table_objet(objet_type($nom));
		$desc['titre'] =
		  isset($GLOBALS['table_titre'][$table]) ? $GLOBALS['table_titre'][$table] : '';
		$connexion['tables'][$nom_sql] = $desc;
		$connexion['tables'][$nom] = $desc;
		// une nouvelle table a ete descrite
		// 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']));
	}

	$connexion['tables'][$nom_sql]['id_table']=$nom;
	return $connexion['tables'][$nom_sql];
	$connexion['tables'][$nom]['id_table']=$nom;
	return $connexion['tables'][$nom];
}
?>