PageRenderTime 34ms CodeModel.GetById 8ms RepoModel.GetById 0ms app.codeStats 0ms

/spip/ecrire/base/trouver_table.php

https://github.com/eyeswebcrea/espace-couture-sittler.fr
PHP | 149 lines | 84 code | 18 blank | 47 comment | 19 complexity | 36b713872752a54575b37103b3acc3ff MD5 | raw file
Possible License(s): LGPL-2.1, GPL-3.0
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2011 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
  9. * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
  10. \***************************************************************************/
  11. if (!defined('_ECRIRE_INC_VERSION')) return;
  12. include_spip('public/interfaces');
  13. // Trouve la description d'une table, en particulier celle d'une boucle
  14. // Si on ne la trouve pas, on demande au serveur SQL
  15. // retourne False si lui non plus ne la trouve pas.
  16. // Si on la trouve, le tableau resultat a les entrees:
  17. // field (comme dans serial.php)
  18. // key (comme dans serial.php)
  19. // table = nom SQL de la table (avec le prefixe spip_ pour les stds)
  20. // id_table = nom SPIP de la table (i.e. type de boucle)
  21. // le compilateur produit FROM $r['table'] AS $r['id_table']
  22. // Cette fonction intervient a la compilation,
  23. // mais aussi pour la balise contextuelle EXPOSE.
  24. // l'ensemble des descriptions de table d'un serveur est stocke dans un fichier cache/sql_dec.txt
  25. // par soucis de performance
  26. // un appel avec $nom vide est une demande explicite de vidange du cache des descriptions
  27. // http://doc.spip.org/@base_trouver_table_dist
  28. function base_trouver_table_dist($nom, $serveur=''){
  29. static $nom_cache_desc_sql=array();
  30. global $tables_principales, $tables_auxiliaires, $table_des_tables;
  31. if (!spip_connect($serveur)
  32. OR !preg_match('/^[a-zA-Z0-9._-]*/',$nom))
  33. return null;
  34. $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0];
  35. // le nom du cache depend du serveur mais aussi du nom de la db et du prefixe
  36. // ce qui permet une auto invalidation en cas de modif manuelle du fichier
  37. // de connexion, et tout risque d'ambiguite
  38. if (!isset($nom_cache_desc_sql[$serveur]))
  39. $nom_cache_desc_sql[$serveur] =
  40. _DIR_CACHE . 'sql_desc_'
  41. . ($serveur ? "$serveur_":"")
  42. . substr(md5($connexion['db'].":".$connexion['prefixe']),0,8)
  43. .'.txt';
  44. // un appel avec $nom vide est une demande explicite de vidange du cache des descriptions
  45. if (!$nom){
  46. spip_unlink($nom_cache_desc_sql[$serveur]);
  47. $connexion['tables'] = array();
  48. return null;
  49. }
  50. $nom_sql = $nom;
  51. if (preg_match('/\.(.*)$/', $nom, $s))
  52. $nom_sql = $s[1];
  53. else
  54. $nom_sql = $nom;
  55. $desc = '';
  56. // base sous SPIP: gerer les abreviations explicites des noms de table
  57. if ($connexion['spip_connect_version']) {
  58. include_spip('public/interfaces');
  59. if (isset($table_des_tables[$nom])) {
  60. $nom = $table_des_tables[$nom];
  61. $nom_sql = 'spip_' . $nom;
  62. }
  63. }
  64. // si c'est la premiere table qu'on cherche
  65. // et si on est pas explicitement en recalcul
  66. // on essaye de recharger le cache des decriptions de ce serveur
  67. // dans le fichier cache
  68. if (!isset($connexion['tables'][$nom])
  69. AND $GLOBALS['var_mode']!=='recalcul'
  70. AND (!isset($connexion['tables']) OR !$connexion['tables'])) {
  71. if (lire_fichier($nom_cache_desc_sql[$serveur],$desc_cache)
  72. AND $desc_cache=unserialize($desc_cache))
  73. $connexion['tables'] = $desc_cache;
  74. }
  75. if (!isset($connexion['tables'][$nom])) {
  76. include_spip('base/serial');
  77. if (isset($tables_principales[$nom_sql]))
  78. $fdesc = $tables_principales[$nom_sql];
  79. // meme si pas d'abreviation declaree, trouver la table spip_$nom
  80. // si c'est une table principale,
  81. // puisqu'on le fait aussi pour les tables auxiliaires
  82. elseif ($nom_sql==$nom AND isset($tables_principales['spip_' .$nom])){
  83. $nom_sql = 'spip_' . $nom;
  84. $fdesc = &$tables_principales[$nom_sql];
  85. }
  86. else {
  87. include_spip('base/auxiliaires');
  88. if (isset($tables_auxiliaires['spip_' .$nom])) {
  89. $nom_sql = 'spip_' . $nom;
  90. $fdesc = &$tables_auxiliaires[$nom_sql];
  91. } # table locale a cote de SPIP, comme non SPIP:
  92. }
  93. // faut il interpreter le prefixe 'spip_' ?
  94. $transposer_spip = ($nom_sql != $nom);
  95. // La *vraie* base a la priorite
  96. if (true /* !$bdesc OR !$bdesc['field'] */) {
  97. $desc = sql_showtable($nom_sql, $transposer_spip, $serveur);
  98. if (!$desc OR !$desc['field']) {
  99. if (!$fdesc) {
  100. spip_log("trouver_table: table inconnue '$serveur' '$nom'");
  101. return null;
  102. }
  103. // on ne sait pas lire la structure de la table :
  104. // on retombe sur la description donnee dans les fichiers spip
  105. $desc = $fdesc;
  106. }
  107. }
  108. // S'il n'y a pas de key (cas d'une VIEW),
  109. // on va inventer une PRIMARY KEY en prenant le premier champ
  110. // de la table
  111. if (!$desc['key'])
  112. $desc['key']['PRIMARY KEY'] = array_shift(array_keys($desc['field']));
  113. $desc['table']= $nom_sql;
  114. $desc['connexion']= $serveur;
  115. // objet_type peut provoquer un appel reentrant ici.
  116. // pour ne pas faire de boucle infinie, on stocke ce qu'on a deja trouve
  117. $connexion['tables'][$nom] = $desc;
  118. $table = table_objet(objet_type($nom));
  119. $desc['titre'] = isset($GLOBALS['table_titre'][$table])
  120. ? $GLOBALS['table_titre'][$table]
  121. : (isset($desc['field']['titre']) ? 'titre' : '');
  122. $connexion['tables'][$nom] = $desc;
  123. // une nouvelle table a ete decrite
  124. // mettons donc a jour le cache des descriptions de ce serveur
  125. if (is_writeable(_DIR_CACHE))
  126. ecrire_fichier($nom_cache_desc_sql[$serveur],serialize($connexion['tables']));
  127. }
  128. $connexion['tables'][$nom]['id_table']=$nom;
  129. return $connexion['tables'][$nom];
  130. }
  131. ?>