Valider 56406a05 rédigé par esj's avatar esj
Parcourir les fichiers

Le multi-base détecte quand un site distant est sous SPIP, et le compilateur...

Le multi-base détecte quand un site distant est sous SPIP, et le compilateur de squelette applique alors les mêmes abréviations pour {{{<BOUCLE(A:T ...}}} que pour une boucle T locale, en prenant en compte le préfixe de table spécifique au site distant, ce qui réalise le souhait de [10113].

Quelques remarques:

	* la détection repose sur l'affectation de la variable '''spip_connect_version''' dans le fichier de connexion, et elle doit avoir la valeur 0.6. Détruire ce fichier et réinstaller le site distant si ce n'est pas le cas.

	* une manière d'obtenir un squelette pour site distant nommé SITE_DISTANT à partir d'un squelettes standard est {{{sed 's/(\([ABDFRS]\)/(SITE_DISTANT:\1/'}}}

	* la fonction '''trouver_def_table''' était appelée de manière incohérente (parfois avec le préfixe de table, parfois non) et était en partie redondante avec la fonction '''description_type_requete'''. Pour y remédier et atteindre le but ici décrit, ces deux fonctions ont été réunies en une seule, '''trouver_table''', dont les spécifications sont celles qu'avait '''description_type_requete''' (autrement dit cette fonction a été renommée). Etant très internes au compilateur, ces fonctions ne figurent pas dans vieilles_def (mais on peut les mettre si c'est vraiment nécessaire).
parent 7d4cb34c
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+17 −17
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -202,12 +202,12 @@ function spip_connect_db($host, $port, $login, $pass, $db='', $type='mysql', $pr
	AND !defined('_ECRIRE_INSTALL')) {
		return;
	}

	if (!$prefixe) 
		$prefixe = isset($GLOBALS['table_prefix'])
		? $GLOBALS['table_prefix'] : $db;
	$db_ok = charger_fonction('db_' . $type, 'base', true);
	if ($db_ok AND $db_ok = $db_ok($host, $port, $login, $pass, $db, $prefixe)) 
	if ($db_ok
	AND $db_ok = $db_ok($host, $port, $login, $pass, $db, $prefixe)) 

		return $db_ok;

@@ -229,7 +229,7 @@ function spip_connect_db($host, $port, $login, $pass, $db='', $type='mysql', $pr

// http://doc.spip.org/@spip_connect
function spip_connect($serveur='') {
	global $connexions;
	global $connexions, $type_des_serveurs;

	$index = $serveur ? $serveur : 0;
	if (isset($connexions[$index])) return $connexions[$index];
@@ -244,6 +244,7 @@ function spip_connect($serveur='') {
	    : ($install ? (_FILE_CONNECT_INS .  '.php')
	       : ''));

	unset($GLOBALS['spip_connect_version']);
	if ($f AND is_readable($f)) include($f);
	if (!isset($GLOBALS['db_ok'])) {
		if ($install) return 'spip_' . $serveur . '_query';
@@ -252,13 +253,14 @@ function spip_connect($serveur='') {
	}

	$connexions[$index] = $GLOBALS['db_ok'];
	$type_des_serveurs[$index] = isset($GLOBALS['spip_connect_version'])
	? 'spip' : 'inconnu';

	if ($serveur) return $connexions[$index];

	// Premiere connexion au serveur principal:
	// verifier que la table principale est la
	// et que le fichier de connexion n'est pas une version trop vieille

	if (!$serveur) {

	// Version courante = 0.6 (indication du prefixe comme 6e arg)
	//
	// La version 0.0 (non numerotee) doit etre refaite par un admin
@@ -266,20 +268,18 @@ function spip_connect($serveur='') {
	// - la version 0.1 est moins performante que la 0.2
	// - la 0.2 fait un include_ecrire('inc_db_mysql.php3')
	// - la version 0.5 indique le serveur comme 5e arg
	//  On ne force pas la mise a niveau pour les autres.

	if ($GLOBALS['spip_connect_version']< 0.1 AND _DIR_RESTREINT){
		include_spip('inc/headers');
		redirige_par_entete(generer_url_ecrire('upgrade', 'reinstall=oui', true));
	}

		$f = str_replace('query', 'countsel', $GLOBALS['db_ok']['query']);
	$f = $GLOBALS['db_ok']['countsel'];
	if (!$f('spip_meta', '', '', '', '', '', '', $index)) {
		unset($connexions[$index]);
		spip_log("spip_connect: table meta vide ($index)");
		return false;
	}
	}

	return $connexions[$index];
}
+7 −8
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -38,6 +38,7 @@ include_spip('public/interfaces');

# definition des tables
include_spip('base/serial');
include_spip('base/auxiliaires');

// http://doc.spip.org/@argumenter_inclure
function argumenter_inclure($struct, $descr, &$boucles, $id_boucle, $echap=true){
@@ -697,19 +698,17 @@ function public_compiler_dist($squelette, $nom, $gram, $sourcefile) {

	// Initialiser les champs necessaires a la compilation
	// et signaler une boucle documents (les autres influent dessus)
	$tables_des_serveurs_sql[0] = 
	  array_merge($tables_principales,  $tables_auxiliaires);
	foreach($boucles as $id => $boucle) {
		$type = $boucle->type_requete;
		if ($type != 'boucle') {
			$table = isset($table_des_tables[$type])
			? $table_des_tables[$type]
			: $type;
			$show = trouver_def_table($table, $boucles[$id]);
			$show = trouver_table($type, $boucles[$id]);
			if ($show) {
				$nom_table = $show[0];
				$show = $show[1]['key'];
				$nom_table = $show['table'];
				$boucles[$id]->id_table = $show['type'];
				$boucles[$id]->primary = $show['key']["PRIMARY KEY"];
				$boucles[$id]->descr = &$descr;
				$boucles[$id]->id_table = $table;
				$boucles[$id]->primary = $show["PRIMARY KEY"];
				if ((!$boucles[$id]->jointures)
				AND (is_array($x = $tables_jointures[$nom_table])))
					$boucles[$id]->jointures = $x;
+64 −60
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -245,8 +245,7 @@ function critere_branche_dist($idb, &$boucles, $crit) {

	//Trouver une jointure
	$type = $boucle->type_requete;
	$nom = $table_des_tables[$type];
	list($nom, $desc) = trouver_def_table($nom ? $nom : $type, $boucle);
	$desc = trouver_table($type, $boucle);
	//Seulement si necessaire
	if (!array_key_exists('id_rubrique', $desc['field'])) {
		$cle = trouver_champ_exterieur('id_rubrique', $boucle->jointures, $boucle);
@@ -326,7 +325,7 @@ function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix='')
	$arg = calculer_liste($crit, array(), $boucles, $boucle->id_parent);
	$r = $boucle->type_requete;
	$s = $boucles[$idb]->sql_serveur;
	if (!$s) $s = 'localhost';
	if (!$s) $s = 0;
	$t = $table_des_tables[$r];
	// pour les tables non Spip
	if (!$t) $t = $r; else $t = "spip_$t";
@@ -417,7 +416,7 @@ function critere_parinverse($idb, &$boucles, $crit, $sens) {
		else {
		  $r = $boucle->type_requete;
		  $s = $boucles[$idb]->sql_serveur;
		  if (!$s) $s = 'localhost';
		  if (!$s) $s = 0;
		  $t = $table_des_tables[$r];
		  // pour les tables non Spip
		  if (!$t) $t = $r; else $t = "spip_$t";
@@ -455,12 +454,11 @@ function critere_par_jointure(&$boucle, $join)
  $t = array_search($table, $boucle->from);
  if (!$t) {
	$type = $boucle->type_requete;
    $nom = $table_des_tables[$type];
    list($nom, $desc) = trouver_def_table($nom ? $nom : $type, $boucle);
	$desc = trouver_table($type, $boucle);

	$cle = trouver_champ_exterieur($champ, $boucle->jointures, $boucle);
	if ($cle)
      $cle = calculer_jointure($boucle, array($boucle->id_table, $desc), $cle, false);
		$cle = calculer_jointure($boucle, array($desc['table'], $desc), $cle, false);
	if ($cle) $t = "L$cle"; 
	else  erreur_squelette(_T('zbug_info_erreur_squelette'),  "{par ?} BOUCLE$idb");

@@ -728,8 +726,7 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
	$boucle = &$boucles[$idb];
	$type = $boucle->type_requete;
	$table = $boucle->id_table;
	$nom = $table_des_tables[$type];
	list(, $desc) = trouver_def_table($nom ? $nom : $type, $boucle);
	$desc = trouver_table($type, $boucle);

	list($fct, $col, $op, $val, $args_sql) =
	  calculer_critere_infixe_ops($idb, $boucles, $crit);
@@ -831,8 +828,8 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
// http://doc.spip.org/@critere_secteur_forum
function critere_secteur_forum($idb, &$boucles, $val, $crit)
{
	list($nom, $desc) = trouver_def_table('articles', $boucles[$idb]);
	return calculer_critere_externe_init($boucles[$idb], array($nom), 'id_secteur', $desc, $crit->cond, true);
	$desc = trouver_table('articles', $boucles[$idb]);
	return calculer_critere_externe_init($boucles[$idb], array($desc['table']), 'id_secteur', $desc, $crit->cond, true);
}

// Champ hors table, ca ne peut etre qu'une jointure.
@@ -984,16 +981,15 @@ function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu=array(), $mi
		$new = $vu;
		foreach($boucle->jointures as $v) {
			if ($v && (!in_array($v,$vu)) && 
			    ($def = trouver_def_table($v, $boucle))) {
				list($table,$join) = $def;
				$milieu = array_intersect($ddesc['key'], trouver_cles_table($join['key']));
			    ($def = trouver_table($v, $boucle))) {
				$milieu = array_intersect($ddesc['key'], trouver_cles_table($def['key']));
				$new[] = $v;
				foreach ($milieu as $k)
					if ($k!=$milieu_prec) // ne pas repasser par la meme cle car c'est un chemin inutilement long
					{
						$r = calculer_chaine_jointures($boucle, array($v, $join), $arrivee, $new, $k);
					  $r = calculer_chaine_jointures($boucle, array($v, $def), $arrivee, $new, $k);
						if ($r)	{
							array_unshift($r, array($dnom, $def, $k));
						  array_unshift($r, array($dnom, array($def['table'], $def), $k));
							return $r;
						}
					}
@@ -1021,52 +1017,60 @@ function trouver_cles_table($keys)
  return array_keys($res);
}

// Trouve la description d'une table dans les globales de Spip
// (le prefixe des tables y est toujours 'spip_', son chgt est ulterieur)
// Si on ne la trouve pas, on demande au serveur SQL (marche pas toujours)
// Trouve la description d'une table, en particulier celle d'une boucle
// Si on ne la trouve pas, on demande au serveur SQL
// retourne False si lui non plus  ne la trouve pas.
// Si on la trouve, le tableau resultat a les entrees:
// field (comme dans serial.php)
// key (comme dans serial.php)
// serveur = serveur bd associe
// table = nom complet de la table (avec le prefixe spip_ pour les stds)
// type = nom court (i.e. type de boucle)

// http://doc.spip.org/@trouver_def_table
function trouver_def_table($nom, &$boucle)
function trouver_table($type, $boucle)
{
	global $tables_principales, $tables_auxiliaires, $table_des_tables, $tables_des_serveurs_sql;

	$nom_table = $nom;
	$s = $boucle->sql_serveur;
	if (!$s) {
		$s = 'localhost';
		if (in_array($nom, $table_des_tables))
		   $nom_table = 'spip_' . $nom;
	global $tables_auxiliaires, $table_des_tables, $tables_des_serveurs_sql, $type_des_serveurs;

	$serveur = $boucle->sql_serveur;
	$s = $serveur ? $serveur : 0;
	if (!isset($type_des_serveurs[$s])) spip_connect($serveur);

	$spip = ($type_des_serveurs[$s] == 'spip');

	if ($spip AND isset($table_des_tables[$type])) {
    	// indirection (pour les rares cas ou le nom de la table!=type)
		$t = $table_des_tables[$type];
		$nom_table = 'spip_' . $t;
	} elseif ($spip AND isset($tables_auxiliaires['spip_' .$type])) {
		$t = $type;
		$nom_table = 'spip_' . $t;
	} else	$nom_table = $t = $type;

	if (!isset($tables_des_serveurs_sql[$s][$nom_table])) {
		$desc = sql_showtable($nom_table, $serveur, ($nom_table != $type));
		if (!$desc) {
			erreur_squelette(_T('zbug_table_inconnue', array('table' => $type)),
					 $boucle->id_boucle);
			return null;
		}
		$tables_des_serveurs_sql[$s][$nom_table] = $desc;
	} else $desc = $tables_des_serveurs_sql[$s][$nom_table];
	
	$desc = $tables_des_serveurs_sql[$s];

	if (isset($desc[$nom_table]))
		return array($nom_table, $desc[$nom_table]);
	$desc['table']= $nom_table;
	$desc['serveur']= $s;
	$desc['type']= $t;

	include_spip('base/auxiliaires');
	$nom_table = 'spip_' . $nom;
	if ($desc = $tables_auxiliaires[$nom_table])
		return array($nom_table, $desc);

	if ($desc = sql_showtable($nom, $boucle->sql_serveur))
	  if (isset($desc['field'])) {
      // faudrait aussi prevoir le cas du serveur externe
	    $tables_principales[$nom] = $desc;
	    return array($nom, $desc);
	  }
	erreur_squelette(_T('zbug_table_inconnue', array('table' => $nom)),
			 $boucle->id_boucle);
	return false;
	return $desc;
}

// http://doc.spip.org/@trouver_champ_exterieur
function trouver_champ_exterieur($cle, $joints, &$boucle, $checkarrivee = false)
{
  foreach($joints as $k => $join) {
    if ($join && $table = trouver_def_table($join, $boucle)) {
      if (array_key_exists($cle, $table[1]['field'])
      	&& ($checkarrivee==false || $checkarrivee==$table[0])) // si on sait ou on veut arriver, il faut que ca colle
	return  $table;
    if ($join && $table = trouver_table($join, $boucle)) {
      if (array_key_exists($cle, $table['field'])
      	&& ($checkarrivee==false || $checkarrivee==$table['table'])) // si on sait ou on veut arriver, il faut que ca colle
	return  array($table['table'], $table);
    }
  }
  return "";
@@ -1189,7 +1193,7 @@ function calculer_critere_infixe_date($idb, &$boucles, $regs)
	if ($suite) {
	# Recherche de l'existence du champ date_xxxx,
	# si oui choisir ce champ, sinon choisir xxxx
		list(,$t)= trouver_def_table($boucle->type_requete, $boucle);
		$t = trouver_table($boucle->type_requete, $boucle);
		if ($t['field']["date$suite"])
			$date_orig = 'date'.$suite;
		else
+3 −47
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -10,8 +10,6 @@
 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
\***************************************************************************/



// fonctions de recherche et de reservation
// dans l'arborescence des boucles

@@ -27,7 +25,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;

// http://doc.spip.org/@index_pile
function index_pile($idb, $nom_champ, &$boucles, $explicite='') {
  global $exceptions_des_tables, $table_des_tables, $tables_des_serveurs_sql;
	global $exceptions_des_tables, $table_des_tables;

	$i = 0;
	if (strlen($explicite)) {
@@ -61,57 +59,15 @@ function index_pile($idb, $nom_champ, &$boucles, $explicite='') {
	return('@$Pile[0][\''. strtolower($nom_champ) . '\']');
}

/**
 * retourne la description de la table associee a un type de boucle
 * retourne un tableau avec les entrees field et key (comme dans serial.php)
 * et type = type de boucle, serveur = serveur bdd associe et table = nom de
 * la table concernee
 * retourne null si on ne trouve pas la table
 */
// http://doc.spip.org/@description_type_requete
function description_type_requete($type, $serveur='') {
	global $table_des_tables, $tables_des_serveurs_sql, $tables_auxiliaires;

	if (!$serveur) {
		$s = 'localhost';
	} else $s = $serveur;
	// pour les tables non Spip
	if (isset($table_des_tables[$type])) {
    	// indirection (pour les rares cas ou le nom de la table!=type)
		$t = $table_des_tables[$type];
		$nom_table = 'spip_' . $t;
	} elseif (isset($tables_auxiliaires['spip_' .$type])) {
		$t = $type;
		$nom_table = 'spip_' . $t;
	} else	$nom_table = $t = $type;

	$desc = $tables_des_serveurs_sql[$s][$nom_table];
	if (!isset($desc['field'])) {
		$desc = sql_showtable($nom_table, $serveur, ($nom_table != $type));
		if (!isset($desc['field']))
			return null;
		$tables_des_serveurs_sql[$s][$nom_table]= $desc;
	}
	$desc['serveur']= $s;
	$desc['type']= $t;
	$desc['table']= $nom_table;

	return $desc;
}

// http://doc.spip.org/@index_tables_en_pile
function index_tables_en_pile($idb, $nom_champ, &$boucles) {
	global $exceptions_des_tables;

	$r = $boucles[$idb]->type_requete;
	$s = $boucles[$idb]->sql_serveur;

	if ($r == 'boucle') return array();
	$desc= description_type_requete($r, $s);

	$desc = trouver_table($r, $boucle);
	if(!$desc) {
		erreur_squelette(_T('zbug_table_inconnue', array('table' => $r)),
				   "'$idb'");
		# continuer pour chercher l'erreur suivante
		return  array("'#" . $r . ':' . $nom_champ . "'",'');
	}
@@ -441,7 +397,7 @@ function applique_filtres($p) {

	// S'il y a un lien avec la session, ajouter un code qui levera
	// un drapeau dans la structure d'invalidation $Cache
	if ($p->descr['session'])
	if (isset($p->descr['session']))
		$code = "$code . invalideur_session(\$Cache)";

	// ramasser les images intermediaires inutiles et graver l'image finale