[ Index ]
 

Code source de SPIP 1.9.2c

Accédez au Source d'autres logiciels libres

title

Body

[fermer]

/ecrire/inc/ -> import_1_3.php (source)

   1  <?php
   2  
   3  /***************************************************************************\
   4   *  SPIP, Systeme de publication pour l'internet                           *
   5   *                                                                         *
   6   *  Copyright (c) 2001-2007                                                *
   7   *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
   8   *                                                                         *
   9   *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
  10   *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
  11  \***************************************************************************/
  12  
  13  if (!defined("_ECRIRE_INC_VERSION")) return;
  14  
  15  // http://doc.spip.org/@inc_import_1_3_dist
  16  function inc_import_1_3_dist($lecteur, $request, $gz='fread', $atts=array()) {
  17    global $import_ok, $tables_trans,  $trans;
  18      static $tables = '';
  19      static $phpmyadmin, $fin;
  20      static $field_desc = array ();
  21      static $defaut = array('field' => array());
  22  
  23      // au premier appel, init des invariants de boucle 
  24  
  25      if (!$tables OR $trans) {
  26          $init = $request['init'];
  27          $tables = $init($request);
  28          $phpmyadmin = preg_match("{^phpmyadmin::}is",
  29              $GLOBALS['meta']['version_archive_restauration'])
  30              ? array(array('&quot;','&gt;'),array('"','>'))
  31              : false;
  32          $fin = '/' . $GLOBALS['meta']['tag_archive_restauration'];
  33      }
  34  
  35      $b = false;
  36      if (!($table = xml_fetch_tag($lecteur, $b, $gz))) return false;
  37      if ($table == $fin) return !($import_ok = true);
  38      if (strpos($table,'=')) {
  39        list($table, $attl) = xml_parse_tag($table);
  40        $atts = array_merge($atts, $attl);
  41      }
  42  
  43      $new = isset($tables_trans[$table]) ? $tables_trans[$table]: $table; 
  44  
  45      // indique a la fois la fonction a appliquer
  46      // et les infos qu'il faut lui communiquer
  47      $boucle = $request['boucle'];
  48  
  49      if (!in_array($new,$tables))
  50          $field_desc[$boucle][$table] = $desc = $defaut;
  51      elseif (isset($field_desc[$boucle][$table]))
  52          $desc = $field_desc[$boucle][$table];
  53      else {
  54  // recuperer la description de la table pour connaitre ses champs valides
  55          list($nom,$desc) = description_table($table);
  56          if (!isset($desc['field']))
  57              $desc = $defaut;
  58          elseif ($request['insertion']=='on')
  59              $desc['field'] = import_collecte($desc); 
  60          $field_desc[$boucle][$table] = $desc;
  61      }
  62  
  63      $values = import_lire_champs($lecteur,
  64                       $desc['field'],
  65                       $gz,
  66                       $phpmyadmin,
  67                       '/' . $table);
  68  
  69      if ($values === false) return  ($import_ok = false);
  70  
  71      if ($values) $boucle($values, $new, $desc, $request, $atts);
  72  
  73      return $import_ok = $new;
  74  }
  75  
  76  // Au premier tour de l'insertion, ne memoriser que le strict necessaire 
  77  // pour pouvoir identifier avec l'existant.
  78  // (Faudrait convenir d'une structure de donnees, c'est lourd & inextensible)
  79  
  80  // http://doc.spip.org/@import_collecte
  81  function import_collecte($desc)
  82  {
  83      $fields = $desc['field'];
  84      $b = array();
  85      if (isset($fields[$p='titre']))
  86        $b[$p]= $fields[$p];
  87      if (isset($fields[$p='id_groupe']))
  88        $b[$p]= $fields[$p];
  89      if (isset($fields[$p='id_parent']))
  90        $b[$p]= $fields[$p];
  91      if (isset($fields[$p='id_rubrique']))
  92        $b[$p]= $fields[$p];
  93      if (isset($fields[$p='fichier']))
  94        $b[$p]= $fields[$p];
  95      if (isset($fields[$p='taille']))
  96        $b[$p]= $fields[$p];
  97      if (isset($fields[$p='extension']))
  98        $b[$p]= $fields[$p];
  99  
 100      $p = $desc['key']["PRIMARY KEY"];
 101      $b[$p] = $fields[$p];
 102      return $b;
 103  }
 104  
 105  // Les 2 derniers args ne servent que pour l'insertion
 106  
 107  // http://doc.spip.org/@import_replace
 108  function import_replace($values, $table, $desc, $request, $atts='') {
 109      if (!isset($desc['field']['impt'])) {// pas de champ de gestion d'import
 110          if (!spip_query("REPLACE $table (" . join(',',array_keys($values)) . ') VALUES (' .join(',',array_map('_q', $values)) . ')')) {
 111              $GLOBALS['erreur_restauration'] = spip_sql_error();
 112        }
 113      }
 114      else {
 115          // la table contient un champ 'impt' qui permet de gerer des interdiction d'overwrite par import
 116          // impt=oui : la ligne est surchargeable par import
 117          // impt=non : la ligne ne doit pas etre ecrasee par un import
 118          // il faut gerer l'existence de la primary, et l'autorisation ou non de mettre a jour
 119          $where = "";
 120          if (!isset($desc['key']["PRIMARY KEY"]))
 121              $GLOBALS['erreur_restauration'] = "champ impt sans cle primaire sur la table $table";
 122          else {
 123              $keys = $desc['key']["PRIMARY KEY"];
 124              $keys = explode(",",$keys);
 125              if (!is_array($keys)) $keys = array($keys);
 126              $w = "";
 127              foreach($keys as $key){
 128                  if (!isset($values[$key])){
 129                      $GLOBALS['erreur_restauration'] = "champ $key manquant a l'import sur la table $table";
 130                      $w .= " AND 0=1";
 131                      continue;
 132                  }
 133                  $w .= " AND $key="._q($values[$key]);
 134              }
 135              $where = strlen($w)?substr($w,5):"0=1";
 136          }
 137          if ($where!="") {
 138              $res = spip_query("SELECT * FROM $table WHERE ".$where." AND impt='oui'");
 139              if (spip_num_rows($res)){
 140                  $set = "";
 141                  foreach($values as $key=>$value) $set .= ",$key="._q($value);
 142                  $set = substr($set,1);
 143                  if (!spip_query("UPDATE $table SET $set WHERE ".$where." AND impt='oui'")) {
 144                      $GLOBALS['erreur_restauration'] = spip_sql_error();
 145                  }
 146              }
 147              else{
 148                  spip_query("INSERT $table (" . join(',',array_keys($values)) . ') VALUES (' .join(',',array_map('_q', $values)) . ')');
 149              }
 150          }
 151      }
 152  }
 153  
 154  // http://doc.spip.org/@import_lire_champs
 155  function import_lire_champs($f, $fields, $gz, $phpmyadmin, $table)
 156  {
 157      $values = array();
 158      
 159      if (!isset($GLOBALS['meta']['charset_insertion']))
 160          $charset = '';
 161      else {
 162          $charset == $GLOBALS['meta']['charset_insertion'];
 163          if ($charset == $GLOBALS['meta']['charset'])
 164              $charset = '';
 165      }
 166  
 167      for (;;) {
 168          $b = false;
 169          if (!($col = xml_fetch_tag($f, $b, $gz))) return false;
 170          if ($col[0] == '/') { 
 171              if ($col != $table) {
 172                  spip_log("table $table, tag fermant inattendu:$col");
 173            }
 174              break;
 175          }
 176          $value = $b = (($col != 'maj') AND (isset($fields[$col])));
 177          if (!xml_fetch_tag($f, $value, $gz)) return false;
 178  
 179          if ($b) {
 180              if ($phpmyadmin)
 181                  $value = str_replace($phpmyadmin[0],$phpmyadmin[1],$value);
 182              if ($char) 
 183                  $value = importer_charset($value, $charset);
 184              $values[$col]= $value;
 185          }
 186      }
 187  
 188      return $values;
 189  }
 190  ?>


Généré le : Wed Nov 21 10:20:27 2007 par Balluche grâce à PHPXref 0.7
  Clicky Web Analytics