Skip to content
Extraits de code Groupes Projets
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
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -426,6 +426,7 @@ ecrire/base/delete_all.php -text ...@@ -426,6 +426,7 @@ ecrire/base/delete_all.php -text
ecrire/base/delete_statistiques.php -text ecrire/base/delete_statistiques.php -text
ecrire/base/import_all.php -text ecrire/base/import_all.php -text
ecrire/base/index.php -text ecrire/base/index.php -text
ecrire/base/trouver_table.php -text
ecrire/charsets/cp1250.php -text ecrire/charsets/cp1250.php -text
ecrire/charsets/cp1251.php -text ecrire/charsets/cp1251.php -text
ecrire/charsets/cp1256.php -text ecrire/charsets/cp1256.php -text
......
...@@ -311,65 +311,6 @@ function test_sql_int($type) ...@@ -311,65 +311,6 @@ function test_sql_int($type)
OR strpos($type, 'tinyint') === 0); 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 // Cette fonction est vouee a disparaitre
...@@ -377,6 +318,7 @@ function trouver_table($nom, $serveur='') ...@@ -377,6 +318,7 @@ function trouver_table($nom, $serveur='')
function description_table($nom){ function description_table($nom){
global $tables_principales, $tables_auxiliaires; global $tables_principales, $tables_auxiliaires;
static $f;
include_spip('base/serial'); include_spip('base/serial');
if (isset($tables_principales[$nom])) if (isset($tables_principales[$nom]))
...@@ -386,7 +328,8 @@ function description_table($nom){ ...@@ -386,7 +328,8 @@ function description_table($nom){
if (isset($tables_auxiliaires[$nom])) if (isset($tables_auxiliaires[$nom]))
return $tables_auxiliaires[$nom]; return $tables_auxiliaires[$nom];
return trouver_table($nom); if (!$f) $f = charger_fonction('trouver_table', 'base');
return $f($nom);
} }
?> ?>
<?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;
}
?>
...@@ -670,6 +670,9 @@ function code_boucle(&$boucles, $id, $nom) ...@@ -670,6 +670,9 @@ function code_boucle(&$boucles, $id, $nom)
// http://doc.spip.org/@public_compiler_dist // http://doc.spip.org/@public_compiler_dist
function public_compiler_dist($squelette, $nom, $gram, $sourcefile, $connect=''){ function public_compiler_dist($squelette, $nom, $gram, $sourcefile, $connect=''){
global $tables_jointures; 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 // Pre-traitement : reperer le charset du squelette, et le convertir
// Bonus : supprime le BOM // Bonus : supprime le BOM
...@@ -699,7 +702,7 @@ function public_compiler_dist($squelette, $nom, $gram, $sourcefile, $connect='') ...@@ -699,7 +702,7 @@ function public_compiler_dist($squelette, $nom, $gram, $sourcefile, $connect='')
if ($type != 'boucle') { if ($type != 'boucle') {
if (!$boucles[$id]->sql_serveur AND $connect) if (!$boucles[$id]->sql_serveur AND $connect)
$boucles[$id]->sql_serveur = $connect; $boucles[$id]->sql_serveur = $connect;
$show = trouver_table($type, $boucles[$id]->sql_serveur); $show = $trouver_table($type, $boucles[$id]->sql_serveur);
if ($show) { if ($show) {
$boucles[$id]->show = $show; $boucles[$id]->show = $show;
// recopie des 2 infos les plus importantes // recopie des 2 infos les plus importantes
......
...@@ -799,7 +799,11 @@ function calculer_critere_infixe($idb, &$boucles, $crit) { ...@@ -799,7 +799,11 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
// http://doc.spip.org/@critere_secteur_forum // http://doc.spip.org/@critere_secteur_forum
function critere_secteur_forum($idb, &$boucles, $val, $crit) 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); 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){ ...@@ -933,6 +937,10 @@ function liste_champs_jointures($nom,$desc){
// http://doc.spip.org/@calculer_chaine_jointures // http://doc.spip.org/@calculer_chaine_jointures
function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu=array(), $milieu_prec = false) 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($dnom,$ddesc) = $depart;
list($anom,$adesc) = $arrivee; list($anom,$adesc) = $arrivee;
if (!count($vu)) if (!count($vu))
...@@ -952,7 +960,7 @@ function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu=array(), $mi ...@@ -952,7 +960,7 @@ function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu=array(), $mi
$new = $vu; $new = $vu;
foreach($boucle->jointures as $v) { foreach($boucle->jointures as $v) {
if ($v && (!in_array($v,$vu)) && 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'])); $milieu = array_intersect($ddesc['key'], trouver_cles_table($def['key']));
$new[] = $v; $new[] = $v;
foreach ($milieu as $k) foreach ($milieu as $k)
...@@ -991,8 +999,12 @@ function trouver_cles_table($keys) ...@@ -991,8 +999,12 @@ function trouver_cles_table($keys)
// http://doc.spip.org/@trouver_champ_exterieur // http://doc.spip.org/@trouver_champ_exterieur
function trouver_champ_exterieur($cle, $joints, &$boucle, $checkarrivee = false) 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) { 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']) 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 && ($checkarrivee==false || $checkarrivee==$table['table'])) // si on sait ou on veut arriver, il faut que ca colle
return array($table['table'], $table); return array($table['table'], $table);
......
...@@ -103,6 +103,10 @@ function index_tables_en_pile($idb, $nom_champ, &$boucles) { ...@@ -103,6 +103,10 @@ function index_tables_en_pile($idb, $nom_champ, &$boucles) {
// http://doc.spip.org/@index_exception // http://doc.spip.org/@index_exception
function index_exception(&$boucle, $desc, $nom_champ, $excep) function index_exception(&$boucle, $desc, $nom_champ, $excep)
{ {
static $trouver_table;
if (!$trouver_table)
$trouver_table = charger_fonction('trouver_table', 'base');
if (is_array($excep)) { if (is_array($excep)) {
// permettre aux plugins de gerer eux meme des jointures derogatoire ingerables // permettre aux plugins de gerer eux meme des jointures derogatoire ingerables
$t = NULL; $t = NULL;
...@@ -114,7 +118,7 @@ function index_exception(&$boucle, $desc, $nom_champ, $excep) ...@@ -114,7 +118,7 @@ function index_exception(&$boucle, $desc, $nom_champ, $excep)
list($e, $x) = $excep; #PHP4 affecte de gauche a droite list($e, $x) = $excep; #PHP4 affecte de gauche a droite
$excep = $x; #PHP5 de droite a gauche ! $excep = $x; #PHP5 de droite a gauche !
if (!$t = array_search($e, $boucle->from)) { if (!$t = array_search($e, $boucle->from)) {
$j = trouver_table($e, $boucle->sql_serveur); $j = $trouver_table($e, $boucle->sql_serveur);
if ($j) { if ($j) {
$t = 'J' . count($boucle->from); $t = 'J' . count($boucle->from);
$boucle->from[$t] = $j['table']; $boucle->from[$t] = $j['table'];
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter