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
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
......
......@@ -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);
}
?>
<?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)
// 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
......
......@@ -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);
......
......@@ -103,6 +103,10 @@ function index_tables_en_pile($idb, $nom_champ, &$boucles) {
// http://doc.spip.org/@index_exception
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)) {
// permettre aux plugins de gerer eux meme des jointures derogatoire ingerables
$t = NULL;
......@@ -114,7 +118,7 @@ function index_exception(&$boucle, $desc, $nom_champ, $excep)
list($e, $x) = $excep; #PHP4 affecte de gauche a droite
$excep = $x; #PHP5 de droite a gauche !
if (!$t = array_search($e, $boucle->from)) {
$j = trouver_table($e, $boucle->sql_serveur);
$j = $trouver_table($e, $boucle->sql_serveur);
if ($j) {
$t = 'J' . count($boucle->from);
$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