Valider 9966c826 rédigé par esj's avatar esj
Parcourir les fichiers

Multibase et #877: les globales '''$tables_des_serveurs_sql''' et...

Multibase et #877: les globales '''$tables_des_serveurs_sql''' et '''$type_des_serveurs''' disparaissent. Les informations quelles contenaient se retrouvent dans la globale '''connexion''', avec les sous-index respectifs '''tables''' et '''spip_connect_version'''. Une valeur nulle pour '''spip_connect_version''' indique que la base externe n'est pas sous SPIP (donc pas de gestion de préfixe). 

Ces disparitions permettent de centraliser dans la fonction '''trouver_table''' toutes les recherches de table afin d'améliorer facilement ce genre de recherche à l'avenir. Cette fonction quitte le fichier "criteres.php" car elle n'est plus spécifique à la compilation des criteres. Elle dispense le compilateur d'initialiser à chaque appel le tableau des tables SQL prédéfinies, ce qui est
aussi un gain.
parent 78392e91
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+2 −3
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -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, $type_des_serveurs;
	global $connexions;

	$index = $serveur ? $serveur : 0;
	if (isset($connexions[$index])) return $connexions[$index];
@@ -255,8 +255,7 @@ function spip_connect($serveur='') {
	}

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

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

+0 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -286,7 +286,6 @@ $tables_auxiliaires = array();
$table_primary = array();
$table_date = array();
$tables_jointures = array();
$tables_des_serveurs_sql['localhost'] =  &$tables_principales;

// Liste des statuts. 
$liste_des_statuts = array(
+55 −5
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -616,6 +616,58 @@ function compile_cas($tableau, $descr, &$boucles, $id_boucle) {
	return $codes;
}


// 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_table
function trouver_table($type, $boucle)
{
	global $tables_principales, $tables_auxiliaires, $table_des_tables, $connexions;

	$serveur = $boucle->sql_serveur;
	if (!spip_connect($serveur)) return null;
	$s = $serveur ? $serveur : 0;
	$spip = $connexions[$s]['spip_connect_version'];
	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;
		if (!isset($connexions[$s]['tables'][$nom_table]))
			$connexions[$s]['tables'][$nom_table] = 
				$tables_principales[$nom_table];
	} elseif ($spip AND isset($tables_auxiliaires['spip_' .$type])) {
		$t = $type;
		$nom_table = 'spip_' . $t;
		if (!isset($connexions[$s]['tables'][$nom_table]))
			$connexions[$s]['tables'][$nom_table] = 
				$tables_auxiliaires[$nom_table];
	} else	$nom_table = $t = $type;
	spip_log("%%%% $t $nom_table " . isset($connexions[$s]['tables'][$nom_table]));
	if (!isset($connexions[$s]['tables'][$nom_table])) {
		$desc = sql_showtable($nom_table, $serveur, ($nom_table != $type));
		if (!$desc OR !$desc['field']) {
		  erreur_squelette(_T('zbug_table_inconnue', array('table' => $s ? "$serveur:$type" : $type)),
					 $boucle->id_boucle);
			return null;
		}
		$connexions[$s]['tables'][$nom_table] = $desc;
	} else $desc = $connexions[$s]['tables'][$nom_table];
	
	$desc['table']= $nom_table;
	$desc['serveur']= $s;
	$desc['type']= $t;

	return $desc;
}

// affichage du code produit

// http://doc.spip.org/@code_boucle
@@ -673,7 +725,7 @@ function code_boucle(&$boucles, $id, $nom)

// http://doc.spip.org/@public_compiler_dist
function public_compiler_dist($squelette, $nom, $gram, $sourcefile, $connect=''){
	global  $table_des_tables, $tables_des_serveurs_sql, $tables_principales, $tables_auxiliaires, $tables_jointures;
	global $tables_jointures;

	// Pre-traitement : reperer le charset du squelette, et le convertir
	// Bonus : supprime le BOM
@@ -695,10 +747,8 @@ function public_compiler_dist($squelette, $nom, $gram, $sourcefile, $connect='')
	// tableau des informations sur le squelette
	$descr = array('nom' => $nom, 'sourcefile' => $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);
	// Signaler une boucle documents (les autres influent dessus)

	foreach($boucles as $id => $boucle) {
		$type = $boucle->type_requete;
		if ($type != 'boucle') {
+6 −71
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -318,19 +318,9 @@ function critere_collecte_dist($idb,&$boucles, $crit) {
// http://doc.spip.org/@calculer_critere_arg_dynamique
function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix='')
{
	global $table_des_tables, $tables_des_serveurs_sql;

	$boucle = $boucles[$idb];

	$arg = calculer_liste($crit, array(), $boucles, $boucle->id_parent);
	$r = $boucle->type_requete;
	$s = $boucles[$idb]->sql_serveur;
	if (!$s) $s = 0;
	$t = $table_des_tables[$r];
	// pour les tables non Spip
	if (!$t) $t = $r; else $t = "spip_$t";
	$desc = $tables_des_serveurs_sql[$s][$t];

	$desc = trouver_table($boucle->type_requete, $boucle);
	if (is_array($desc['field'])){
		$liste_field = implode(',',array_map('_q',array_keys($desc['field'])));
		return	"((\$x = preg_replace(\"/\\W/\",'',$arg)) ? ( in_array(\$x,array($liste_field))  ? ('$boucle->id_table.' . \$x$suffix):(\$x$suffix) ) : '')";
@@ -347,7 +337,7 @@ function critere_par_dist($idb, &$boucles, $crit) {

// http://doc.spip.org/@critere_parinverse
function critere_parinverse($idb, &$boucles, $crit, $sens='') {
	global $table_des_tables, $tables_des_serveurs_sql,  $exceptions_des_jointures;
	global $exceptions_des_jointures;
	$boucle = &$boucles[$idb];
	if ($crit->not) $sens = $sens ? "" : " . ' DESC'";
	$collecte = (isset($boucle->modificateur['collecte']))?" . ".$boucle->modificateur['collecte']:"";
@@ -414,13 +404,7 @@ function critere_parinverse($idb, &$boucles, $crit, $sens='') {
		}
		// par champ. Verifier qu'ils sont presents.
		else {
		  $r = $boucle->type_requete;
		  $s = $boucles[$idb]->sql_serveur;
		  if (!$s) $s = 0;
		  $t = $table_des_tables[$r];
		  // pour les tables non Spip
		  if (!$t) $t = $r; else $t = "spip_$t";
		  $desc = $tables_des_serveurs_sql[$s][$t];
			$desc = trouver_table($boucle->type_requete, $boucle);
			if ($desc['field'][$par])
				$par = $boucle->id_table.".".$par;
		  // sinon tant pis, ca doit etre un champ synthetise (cf points)
@@ -447,7 +431,6 @@ function critere_parinverse($idb, &$boucles, $crit, $sens='') {
// http://doc.spip.org/@critere_par_jointure
function critere_par_jointure(&$boucle, $join)
{
  global $table_des_tables;
  list($table, $champ) = $join;
  $t = array_search($table, $boucle->from);
  if (!$t) {
@@ -1015,54 +998,6 @@ function trouver_cles_table($keys)
  return array_keys($res);
}

// 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_table
function trouver_table($type, $boucle)
{
	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])) {
		if (!spip_connect($serveur)) return null;
	}
	$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 OR !$desc['field']) {
		  erreur_squelette(_T('zbug_table_inconnue', array('table' => $s ? "$serveur:$type" : $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;

	return $desc;
}

// http://doc.spip.org/@trouver_champ_exterieur
function trouver_champ_exterieur($cle, $joints, &$boucle, $checkarrivee = false)
{
+6 −8
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -157,7 +157,7 @@ $table_criteres_infixes = array('<', '>', '<=', '>=', '==', '===', '!=', '!==',
//ces variables ne sont pas initialisees par "$var = array()"
// afin de permettre leur extension dans mes_options.php etc

global $tables_des_serveurs_sql, $tables_principales; // (voir inc_serialbase)
global $tables_principales; // (voir inc_serialbase)
global $exceptions_des_tables, $table_des_tables;
global $table_date;

@@ -191,20 +191,18 @@ $exceptions_des_tables['signatures']['date']='date_time';
$exceptions_des_tables['signatures']['nom']='nom_email';
$exceptions_des_tables['signatures']['email']='ad_email';

$exceptions_des_tables['documents']['type_document']=array('spip_types_documents'
$exceptions_des_tables['documents']['type_document']=array('types_documents'
, 'titre');
$exceptions_des_tables['documents']['extension_document']=array('spip_types_documents', 'extension');
$exceptions_des_tables['documents']['mime_type']=array('spip_types_documents'
$exceptions_des_tables['documents']['extension_document']=array('types_documents', 'extension');
$exceptions_des_tables['documents']['mime_type']=array('types_documents'
, 'mime_type');

# ne sert plus ? verifier balise_URL_ARTICLE
$exceptions_des_tables['syndic_articles']['url_article']='url';
# ne sert plus ? verifier balise_LESAUTEURS
$exceptions_des_tables['syndic_articles']['lesauteurs']='lesauteurs'; 
$exceptions_des_tables['syndic_articles']['url_site']=array('spip_syndic',
'url_site');
$exceptions_des_tables['syndic_articles']['nom_site']=array('spip_syndic',
'nom_site');
$exceptions_des_tables['syndic_articles']['url_site']=array('syndic', 'url_site');
$exceptions_des_tables['syndic_articles']['nom_site']=array('syndic', 'nom_site');

$table_date['articles']='date';
$table_date['auteurs']='date';
Chargement en cours