/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
- * Copyright (c) 2001-2016 *
+ * Copyright (c) 2001-2017 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
/**
* Gestion de l'obtention des descriptions de tables SQL
*
- * @package SPIP\SQL\Tables
-**/
-if (!defined('_ECRIRE_INC_VERSION')) return;
+ * @package SPIP\Core\SQL\Tables
+ **/
+if (!defined('_ECRIRE_INC_VERSION')) {
+ return;
+}
include_spip('base/objets');
/**
* Retourne la description d'une table SQL
*
* Cela sert notamment au moment de la compilation des boucles, critères et balise.
- *
+ *
* Les champs et clés de la tables sont retrouvés prioritairement via le
* gestionnaire de base de données. Les descriptions sont complétées,
* pour les tables éditoriales, des informations déclarées ou construites
* par la déclaration des objets éditoriaux.
- *
+ *
* @example
* $trouver_table = charger_fonction('trouver_table', 'base');
* $desc = $trouver_table('spip_groupes_mots');
- *
+ *
* Cette fonction intervient à la compilation, mais aussi pour la balise
* contextuelle EXPOSE ou certains critères.
- *
+ *
* L'ensemble des descriptions de table d'un serveur est stocké dans un
* fichier cache/sql_desc.txt par soucis de performance. Un appel
* avec $nom vide est une demande explicite de vidange de ce cache
*
* @see lister_tables_objets_sql()
- *
+ *
* @api
* @param string $nom
* Nom de la table
* - id_table : nom SPIP de la table (type de boucle)
* le compilateur produit FROM $r['table'] AS $r['id_table']
* - Toutes les autres informations des objets éditoriaux si la table est l'un d'eux.
- *
*
-**/
-function base_trouver_table_dist($nom, $serveur='', $table_spip = true){
- static $nom_cache_desc_sql=array();
- global $tables_principales, $tables_auxiliaires, $table_des_tables;
+ *
+ **/
+function base_trouver_table_dist($nom, $serveur = '', $table_spip = true) {
+ static $nom_cache_desc_sql = array();
if (!spip_connect($serveur)
- OR !preg_match('/^[a-zA-Z0-9._-]*/',$nom))
+ or !preg_match('/^[a-zA-Z0-9._-]*/', $nom)
+ ) {
return null;
+ }
$connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
$objets_sql = lister_tables_objets_sql("::md5");
// le nom du cache depend du serveur mais aussi du nom de la db et du prefixe
// ce qui permet une auto invalidation en cas de modif manuelle du fichier
// de connexion, et tout risque d'ambiguite
- if (!isset($nom_cache_desc_sql[$serveur][$objets_sql])){
+ if (!isset($nom_cache_desc_sql[$serveur][$objets_sql])) {
$nom_cache_desc_sql[$serveur][$objets_sql] =
- _DIR_CACHE . 'sql_desc_'
- . ($serveur ? "{$serveur}_":"")
- . substr(md5($connexion['db'].":".$connexion['prefixe'].":$objets_sql"),0,8)
- .'.txt';
+ _DIR_CACHE . 'sql_desc_'
+ . ($serveur ? "{$serveur}_" : "")
+ . substr(md5($connexion['db'] . ":" . $connexion['prefixe'] . ":$objets_sql"), 0, 8)
+ . '.txt';
// nouveau nom de cache = nouvelle version en memoire
unset($connexion['tables']);
}
// un appel avec $nom vide est une demande explicite de vidange du cache des descriptions
- if (!$nom){
+ if (!$nom) {
spip_unlink($nom_cache_desc_sql[$serveur][$objets_sql]);
$connexion['tables'] = array();
+
return null;
}
$nom_sql = $nom;
- if (preg_match('/\.(.*)$/', $nom, $s))
+ if (preg_match('/\.(.*)$/', $nom, $s)) {
$nom_sql = $s[1];
- else
+ } else {
$nom_sql = $nom;
+ }
$fdesc = $desc = '';
$connexion = &$GLOBALS['connexions'][$serveur ? $serveur : 0];
// base sous SPIP: gerer les abreviations explicites des noms de table
if ($connexion['spip_connect_version']) {
- if ($table_spip AND isset($table_des_tables[$nom])) {
- $nom = $table_des_tables[$nom];
+ if ($table_spip and isset($GLOBALS['table_des_tables'][$nom])) {
+ $nom = $GLOBALS['table_des_tables'][$nom];
$nom_sql = 'spip_' . $nom;
}
}
// on essaye de recharger le cache des decriptions de ce serveur
// dans le fichier cache
if (!isset($connexion['tables'][$nom_sql])
- AND defined('_VAR_MODE') AND _VAR_MODE!=='recalcul'
- AND (!isset($connexion['tables']) OR !$connexion['tables'])) {
- if (lire_fichier($nom_cache_desc_sql[$serveur][$objets_sql],$desc_cache)
- AND $desc_cache=unserialize($desc_cache))
- $connexion['tables'] = $desc_cache;
+ and defined('_VAR_MODE') and _VAR_MODE !== 'recalcul'
+ and (!isset($connexion['tables']) or !$connexion['tables'])
+ ) {
+ if (lire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], $desc_cache)
+ and $desc_cache = unserialize($desc_cache)
+ ) {
+ $connexion['tables'] = $desc_cache;
+ }
}
- if ($table_spip AND !isset($connexion['tables'][$nom_sql])) {
+ if ($table_spip and !isset($connexion['tables'][$nom_sql])) {
- if (isset($tables_principales[$nom_sql]))
- $fdesc = $tables_principales[$nom_sql];
+ if (isset($GLOBALS['tables_principales'][$nom_sql])) {
+ $fdesc = $GLOBALS['tables_principales'][$nom_sql];
+ }
// meme si pas d'abreviation declaree, trouver la table spip_$nom
// si c'est une table principale,
// puisqu'on le fait aussi pour les tables auxiliaires
- elseif ($nom_sql==$nom AND isset($tables_principales['spip_' .$nom])){
+ elseif ($nom_sql == $nom and isset($GLOBALS['tables_principales']['spip_' . $nom])) {
$nom_sql = 'spip_' . $nom;
- $fdesc = &$tables_principales[$nom_sql];
- }
- elseif (isset($tables_auxiliaires[$n=$nom])
- OR isset($tables_auxiliaires[$n='spip_'.$nom])) {
+ $fdesc = &$GLOBALS['tables_principales'][$nom_sql];
+ } elseif (isset($GLOBALS['tables_auxiliaires'][$n = $nom])
+ or isset($GLOBALS['tables_auxiliaires'][$n = 'spip_' . $nom])
+ ) {
$nom_sql = $n;
- $fdesc = &$tables_auxiliaires[$n];
+ $fdesc = &$GLOBALS['tables_auxiliaires'][$n];
} # table locale a cote de SPIP, comme non SPIP:
}
if (!isset($connexion['tables'][$nom_sql])) {
// La *vraie* base a la priorite
$desc = sql_showtable($nom_sql, $table_spip, $serveur);
- if (!$desc OR !$desc['field']) {
+ if (!$desc or !$desc['field']) {
if (!$fdesc) {
- spip_log("trouver_table: table inconnue '$serveur' '$nom'",_LOG_INFO_IMPORTANTE);
+ spip_log("trouver_table: table inconnue '$serveur' '$nom'", _LOG_INFO_IMPORTANTE);
+
return null;
}
// on ne sait pas lire la structure de la table :
// on retombe sur la description donnee dans les fichiers spip
$desc = $fdesc;
- }
- else {
+ $desc['exist'] = false;
+ } else {
$desc['exist'] = true;
}
$desc['table'] = $desc['table_sql'] = $nom_sql;
- $desc['connexion']= $serveur;
+ $desc['connexion'] = $serveur;
// charger les infos declarees pour cette table
// en lui passant les infos connues
// $desc est prioritaire pour la description de la table
- $desc = array_merge(lister_tables_objets_sql($nom_sql,$desc),$desc);
+ $desc = array_merge(lister_tables_objets_sql($nom_sql, $desc), $desc);
// si tables_objets_sql est bien fini d'init, on peut cacher
$connexion['tables'][$nom_sql] = $desc;
$res = &$connexion['tables'][$nom_sql];
// une nouvelle table a ete decrite
// mettons donc a jour le cache des descriptions de ce serveur
- if (is_writeable(_DIR_CACHE))
- ecrire_fichier($nom_cache_desc_sql[$serveur][$objets_sql],serialize($connexion['tables']),true);
- }
- else
+ if (is_writeable(_DIR_CACHE)) {
+ ecrire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], serialize($connexion['tables']), true);
+ }
+ } else {
$res = &$connexion['tables'][$nom_sql];
+ }
// toujours retourner $nom dans id_table
- $res['id_table']=$nom;
+ $res['id_table'] = $nom;
return $res;
}
-?>