PageRenderTime 46ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/_plugins_/dump_xml/inc/import_1_3.php

https://bitbucket.org/pombredanne/spip-zone-treemap
PHP | 197 lines | 154 code | 18 blank | 25 comment | 26 complexity | 0833d1aa844a97818c391a0aeca14ccf MD5 | raw file
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2010 *
  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. // http://doc.spip.org/@inc_import_1_3_dist
  13. function inc_import_1_3_dist($lecteur, $request, $gz='fread', $atts=array()) {
  14. global $import_ok, $tables_trans, $trans;
  15. static $tables = '';
  16. static $phpmyadmin, $fin;
  17. static $field_desc = array ();
  18. static $defaut = array('field' => array());
  19. // au premier appel, init des invariants de boucle
  20. if (!$tables OR $trans) {
  21. $init = $request['init'];
  22. $tables = $init($request);
  23. if (!$tables) return ($import_ok = false);
  24. $phpmyadmin = preg_match("{^phpmyadmin::}is",
  25. $GLOBALS['meta']['restauration_version_archive'])
  26. ? array(array('&quot;','&gt;'),array('"','>'))
  27. : false;
  28. $fin = '/' . $GLOBALS['meta']['restauration_tag_archive'];
  29. }
  30. $b = false;
  31. if (!($table = xml_fetch_tag($lecteur, $b, $gz))) return false;
  32. if ($table == $fin) return !($import_ok = true);
  33. if (strpos($table,'=')!==FALSE) {
  34. list($table, $attl) = xml_parse_tag($table);
  35. $atts = array_merge($atts, $attl);
  36. }
  37. $new = isset($tables_trans[$table]) ? $tables_trans[$table]: $table;
  38. // indique a la fois la fonction a appliquer
  39. // et les infos qu'il faut lui communiquer
  40. $boucle = $request['boucle'];
  41. if (!in_array($new,$tables))
  42. $field_desc[$boucle][$table] = $desc = $defaut;
  43. elseif (isset($field_desc[$boucle][$table]))
  44. $desc = $field_desc[$boucle][$table];
  45. else {
  46. // recuperer la description de la table pour connaitre ses champs valides
  47. $desc = description_table($table);
  48. if (!isset($desc['field']))
  49. $desc = $defaut;
  50. elseif (isset($request['insertion'])
  51. AND $request['insertion']=='on')
  52. $desc['field'] = import_collecte($desc);
  53. $field_desc[$boucle][$table] = $desc;
  54. #spip_log("$table :".var_export($field_desc[$boucle][$table],1),'dbrest');
  55. }
  56. $values = import_lire_champs($lecteur,
  57. $desc['field'],
  58. $gz,
  59. $phpmyadmin,
  60. '/' . $table,
  61. $atts);
  62. if ($values === false) return ($import_ok = false);
  63. if ($values) $boucle($values, $new, $desc, $request, $atts);
  64. return $import_ok = $new;
  65. }
  66. // Au premier tour de l'insertion, ne memoriser que le strict necessaire
  67. // pour pouvoir identifier avec l'existant.
  68. // (Faudrait convenir d'une structure de donnees, c'est lourd & inextensible)
  69. // http://doc.spip.org/@import_collecte
  70. function import_collecte($desc)
  71. {
  72. $fields = $desc['field'];
  73. $b = array();
  74. if (isset($fields[$p='titre']))
  75. $b[$p]= $fields[$p];
  76. if (isset($fields[$p='id_groupe']))
  77. $b[$p]= $fields[$p];
  78. if (isset($fields[$p='id_parent']))
  79. $b[$p]= $fields[$p];
  80. if (isset($fields[$p='id_rubrique']))
  81. $b[$p]= $fields[$p];
  82. if (isset($fields[$p='fichier']))
  83. $b[$p]= $fields[$p];
  84. if (isset($fields[$p='taille']))
  85. $b[$p]= $fields[$p];
  86. if (isset($fields[$p='extension']))
  87. $b[$p]= $fields[$p];
  88. $p = $desc['key']["PRIMARY KEY"];
  89. $b[$p] = $fields[$p];
  90. return $b;
  91. }
  92. // Les 2 derniers args ne servent que pour l'insertion
  93. // http://doc.spip.org/@import_replace
  94. function import_replace($values, $table, $desc, $request, $atts='') {
  95. if (!isset($desc['field']['impt'])) {// pas de champ de gestion d'import
  96. if (!sql_replace($table, $values, $desc))
  97. $GLOBALS['erreur_restauration'] = sql_error();
  98. } else {
  99. // la table contient un champ 'impt' qui permet de gerer des interdiction d'overwrite par import
  100. // impt=oui : la ligne est surchargeable par import
  101. // impt=non : la ligne ne doit pas etre ecrasee par un import
  102. // il faut gerer l'existence de la primary, et l'autorisation ou non de mettre a jour
  103. if (!isset($desc['key']["PRIMARY KEY"]))
  104. $GLOBALS['erreur_restauration'] = "champ impt sans cle primaire sur la table $table";
  105. else {
  106. $keys = $desc['key']["PRIMARY KEY"];
  107. $keys = explode(",",$keys);
  108. if (!is_array($keys)) $keys = array($keys);
  109. $where = "";
  110. foreach($keys as $key){
  111. if (!isset($values[$key])){
  112. $GLOBALS['erreur_restauration'] = "champ $key manquant a l'import sur la table $table";
  113. $where = "";
  114. break;
  115. }
  116. $where .= " AND $key=".sql_quote($values[$key]);
  117. }
  118. if ($where) {
  119. $where = substr($where,4);
  120. $impt = sql_getfetsel('impt', $table, $where);
  121. #spip_log("IMPT : $table/$where/impt=$impt/",'dbrest');
  122. if ($impt === NULL)
  123. sql_insertq($table, $values);
  124. elseif ($impt == 'oui') {
  125. if (!sql_updateq($table, $values, $where))
  126. $GLOBALS['erreur_restauration'] = sql_error();
  127. }
  128. }
  129. }
  130. }
  131. }
  132. // http://doc.spip.org/@import_lire_champs
  133. function import_lire_champs($f, $fields, $gz, $phpmyadmin, $table, $atts)
  134. {
  135. $values = array();
  136. $dir_img = 0;
  137. if (($atts['version_base'] < '1.934')
  138. AND $table == '/spip_documents') {
  139. $dir_img = '@^'. preg_quote (isset($atts['dir_img']) ? $atts['dir_img']:'IMG/') . '@';
  140. }
  141. if (!isset($GLOBALS['meta']['charset_insertion']))
  142. $charset = '';
  143. else {
  144. $charset = $GLOBALS['meta']['charset_insertion'];
  145. if ($charset == $GLOBALS['meta']['charset'])
  146. $charset = '';
  147. }
  148. for (;;) {
  149. $b = false;
  150. if (!($col = xml_fetch_tag($f, $b, $gz))) return false;
  151. if ($col[0] == '/') {
  152. if ($col != $table) {
  153. spip_log("table $table, tag fermant inattendu:$col");
  154. }
  155. break;
  156. }
  157. $value = $b = (($col != 'maj') AND (isset($fields[$col])));
  158. if (!xml_fetch_tag($f, $value, $gz)) return false;
  159. if ($b) {
  160. if ($phpmyadmin)
  161. $value = str_replace($phpmyadmin[0],$phpmyadmin[1],$value);
  162. elseif ($dir_img) {
  163. $value = preg_replace($dir_img, '', $value);
  164. }
  165. if ($charset)
  166. $value = importer_charset($value, $charset);
  167. $values[$col]= $value;
  168. }
  169. }
  170. return $values;
  171. }
  172. ?>