Skip to content
Extraits de code Groupes Projets
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
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -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,19 +268,17 @@ 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));
}
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']);
if (!$f('spip_meta', '', '', '', '', '', '', $index)) {
unset($connexions[$index]);
spip_log("spip_connect: table meta vide ($index)");
return false;
}
$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];
......
......@@ -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;
......
......@@ -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";
......@@ -454,15 +453,14 @@ function critere_par_jointure(&$boucle, $join)
list($table, $champ) = $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);
$type = $boucle->type_requete;
$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);
if ($cle) $t = "L$cle";
else erreur_squelette(_T('zbug_info_erreur_squelette'), "{par ?} BOUCLE$idb");
$cle = trouver_champ_exterieur($champ, $boucle->jointures, $boucle);
if ($cle)
$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");
}
return "'" . $t . '.' . $champ . "'";
......@@ -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)
// http://doc.spip.org/@trouver_def_table
function trouver_def_table($nom, &$boucle)
// 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)
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;
}
$desc = $tables_des_serveurs_sql[$s];
if (isset($desc[$nom_table]))
return array($nom_table, $desc[$nom_table]);
include_spip('base/auxiliaires');
$nom_table = 'spip_' . $nom;
if ($desc = $tables_auxiliaires[$nom_table])
return array($nom_table, $desc);
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['table']= $nom_table;
$desc['serveur']= $s;
$desc['type']= $t;
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
......
......@@ -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
......
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