Valider 10f4de72 rédigé par esj's avatar esj
Parcourir les fichiers

La fonction '''trouver_table''' devient surchargeable sous le nom de...

La fonction '''trouver_table''' devient surchargeable sous le nom de '''base_trouver_table''', ce qui devrait permettre de résoudre proprement le problème ddes tables nommées bizarrement évoqué dans http://archives.rezo.net/spip-dev.mbox/200709.mbox/%3C46E5795D.60704@math.univ-montp2.fr%3E.
parent 06845ad3
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+1 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -426,6 +426,7 @@ ecrire/base/delete_all.php -text
ecrire/base/delete_statistiques.php -text
ecrire/base/import_all.php -text
ecrire/base/index.php -text
ecrire/base/trouver_table.php -text
ecrire/charsets/cp1250.php -text
ecrire/charsets/cp1251.php -text
ecrire/charsets/cp1256.php -text
+3 −60
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -311,65 +311,6 @@ function test_sql_int($type)
	OR strpos($type, 'tinyint') === 0);
}

// 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)
// table = nom SQL de la table (avec le prefixe spip_ pour les stds)
// id_table = nom SPIP de la table (i.e. type de boucle)
// le compilateur produit  FROM $r['table'] AS $r['id_table']
// Cette fonction intervient a la compilation, 
// mais aussi pour la balise contextuelle EXPOSE.

// http://doc.spip.org/@trouver_table
function trouver_table($nom, $serveur='')
{
	global $tables_principales, $tables_auxiliaires, $table_des_tables, $connexions;

	if (!spip_connect($serveur)) return null;
	$s = $serveur ? $serveur : 0;
	$nom_sql = $nom;

	if ($connexions[$s]['spip_connect_version']) {
		// base sous SPIP, le nom SQL peut etre autre
		if (isset($table_des_tables[$nom])) {
		  // indirection (table principale avec nom!=type)
			$t = $table_des_tables[$nom];
			$nom_sql = 'spip_' . $t;
			if (!isset($connexions[$s]['tables'][$nom_sql])) {
				include_spip('base/serial');
				$connexions[$s]['tables'][$nom_sql] = $tables_principales[$nom_sql];
				$connexions[$s]['tables'][$nom_sql]['table']= $nom_sql;
				$connexions[$s]['tables'][$nom_sql]['id_table']= $t;
			} # table principale deja vue, ok.
		} else {
			include_spip('base/auxiliaires');
			if (isset($tables_auxiliaires['spip_' .$nom])) {
				$nom_sql = 'spip_' . $nom;
				if (!isset($connexions[$s]['tables'][$nom_sql])) {
					$connexions[$s]['tables'][$nom_sql] = $tables_auxiliaires[$nom_sql];
					$connexions[$s]['tables'][$nom_sql]['table']= $nom_sql;
					$connexions[$s]['tables'][$nom_sql]['id_table']= $nom;
				} # table locale a cote de SPIP: noms egaux
			} # auxiliaire deja vue, ok.
		}
	}

	if (isset($connexions[$s]['tables'][$nom_sql]))
		return $connexions[$s]['tables'][$nom_sql];

	$desc = sql_showtable($nom_sql, $serveur, ($nom_sql != $nom));
	if (!$desc OR !$desc['field']) {
		  spip_log("table inconnue $serveur $nom");
		  return null;
	} else {
		$desc['table']= $nom_sql;
		$desc['id_table']= $nom;
	}
	return	$connexions[$s]['tables'][$nom_sql] = $desc;
}

// Cette fonction est vouee a disparaitre

@@ -377,6 +318,7 @@ function trouver_table($nom, $serveur='')
function description_table($nom){

        global $tables_principales, $tables_auxiliaires;
	static $f;

        include_spip('base/serial');
        if (isset($tables_principales[$nom]))
@@ -386,7 +328,8 @@ function description_table($nom){
        if (isset($tables_auxiliaires[$nom]))
                return $tables_auxiliaires[$nom];

	return trouver_table($nom);
	if (!$f) $f = charger_fonction('trouver_table', 'base');
	return $f($nom);
}

?>
+74 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2007                                                *
 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
 *                                                                         *
 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
\***************************************************************************/

if (!defined("_ECRIRE_INC_VERSION")) return;

// 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)
// table = nom SQL de la table (avec le prefixe spip_ pour les stds)
// id_table = nom SPIP de la table (i.e. type de boucle)
// le compilateur produit  FROM $r['table'] AS $r['id_table']
// Cette fonction intervient a la compilation, 
// mais aussi pour la balise contextuelle EXPOSE.

// http://doc.spip.org/@trouver_table
function base_trouver_table_dist($nom, $serveur='')
{
	global $tables_principales, $tables_auxiliaires, $table_des_tables, $connexions;

	if (!spip_connect($serveur)) return null;
	$s = $serveur ? $serveur : 0;
	$nom_sql = $nom;

	if ($connexions[$s]['spip_connect_version']) {
		// base sous SPIP, le nom SQL peut etre autre
		if (isset($table_des_tables[$nom])) {
		  // indirection (table principale avec nom!=type)
			$t = $table_des_tables[$nom];
			$nom_sql = 'spip_' . $t;
			if (!isset($connexions[$s]['tables'][$nom_sql])) {
				include_spip('base/serial');
				$connexions[$s]['tables'][$nom_sql] = $tables_principales[$nom_sql];
				$connexions[$s]['tables'][$nom_sql]['table']= $nom_sql;
				$connexions[$s]['tables'][$nom_sql]['id_table']= $t;
			} # table principale deja vue, ok.
		} else {
			include_spip('base/auxiliaires');
			if (isset($tables_auxiliaires['spip_' .$nom])) {
				$nom_sql = 'spip_' . $nom;
				if (!isset($connexions[$s]['tables'][$nom_sql])) {
					$connexions[$s]['tables'][$nom_sql] = $tables_auxiliaires[$nom_sql];
					$connexions[$s]['tables'][$nom_sql]['table']= $nom_sql;
					$connexions[$s]['tables'][$nom_sql]['id_table']= $nom;
				} # table locale a cote de SPIP: noms egaux
			} # auxiliaire deja vue, ok.
		}
	}

	if (isset($connexions[$s]['tables'][$nom_sql]))
		return $connexions[$s]['tables'][$nom_sql];

	$desc = sql_showtable($nom_sql, $serveur, ($nom_sql != $nom));
	if (!$desc OR !$desc['field']) {
		  spip_log("table inconnue $serveur $nom");
		  return null;
	} else {
		$desc['table']= $nom_sql;
		$desc['id_table']= $nom;
	}
	return	$connexions[$s]['tables'][$nom_sql] = $desc;
}
?>
+4 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -670,6 +670,9 @@ function code_boucle(&$boucles, $id, $nom)
// http://doc.spip.org/@public_compiler_dist
function public_compiler_dist($squelette, $nom, $gram, $sourcefile, $connect=''){
	global $tables_jointures;
	static $trouver_table;
	if (!$trouver_table)
		$trouver_table = charger_fonction('trouver_table', 'base');

	// Pre-traitement : reperer le charset du squelette, et le convertir
	// Bonus : supprime le BOM
@@ -699,7 +702,7 @@ function public_compiler_dist($squelette, $nom, $gram, $sourcefile, $connect='')
		if ($type != 'boucle') {
			if (!$boucles[$id]->sql_serveur AND $connect)
				$boucles[$id]->sql_serveur = $connect;
			$show = trouver_table($type, $boucles[$id]->sql_serveur);
			$show = $trouver_table($type, $boucles[$id]->sql_serveur);
			if ($show) {
				$boucles[$id]->show = $show;
				// recopie des 2 infos les plus importantes
+15 −3
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -799,7 +799,11 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
// http://doc.spip.org/@critere_secteur_forum
function critere_secteur_forum($idb, &$boucles, $val, $crit)
{
	$desc = trouver_table('articles', $boucles[$idb]->sql_serveur);
	static $trouver_table;
	if (!$trouver_table)
		$trouver_table = charger_fonction('trouver_table', 'base');

	$desc = $trouver_table('articles', $boucles[$idb]->sql_serveur);
	return calculer_critere_externe_init($boucles[$idb], array($desc['table']), 'id_secteur', $desc, $crit->cond, true);
}

@@ -933,6 +937,10 @@ function liste_champs_jointures($nom,$desc){
// http://doc.spip.org/@calculer_chaine_jointures
function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu=array(), $milieu_prec = false)
{
	static $trouver_table;
	if (!$trouver_table)
		$trouver_table = charger_fonction('trouver_table', 'base');

	list($dnom,$ddesc) = $depart;
	list($anom,$adesc) = $arrivee;
	if (!count($vu))
@@ -952,7 +960,7 @@ 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_table($v, $boucle->sql_serveur))) {
			    ($def = $trouver_table($v, $boucle->sql_serveur))) {
				$milieu = array_intersect($ddesc['key'], trouver_cles_table($def['key']));
				$new[] = $v;
				foreach ($milieu as $k)
@@ -991,8 +999,12 @@ function trouver_cles_table($keys)
// http://doc.spip.org/@trouver_champ_exterieur
function trouver_champ_exterieur($cle, $joints, &$boucle, $checkarrivee = false)
{
  static $trouver_table;
  if (!$trouver_table)
		$trouver_table = charger_fonction('trouver_table', 'base');

  foreach($joints as $k => $join) {
    if ($join && $table = trouver_table($join, $boucle->sql_serveur)) {
    if ($join && $table = $trouver_table($join, $boucle->sql_serveur)) {
      if (isset($table['field']) && 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);
Chargement en cours