[ Index ]
 

Code source de SPIP 1.9.2c

Accédez au Source d'autres logiciels libres

title

Body

[fermer]

/ecrire/inc/ -> export.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  include_spip('base/serial');
  15  include_spip('base/auxiliaires');
  16  include_spip('public/interfaces'); // pour table_des_tables
  17  
  18  $GLOBALS['version_archive'] = '1.3';
  19  // NB: Ce fichier peut ajouter des tables (old-style)
  20  // donc il faut l'inclure "en globals"
  21  if ($f = include_spip('mes_fonctions', false)) {
  22      global $dossier_squelettes;
  23      @include_once ($f); 
  24  }
  25  if (@is_readable(_DIR_TMP."charger_plugins_fonctions.php")){
  26      // chargement optimise precompile
  27      include_once(_DIR_TMP."charger_plugins_fonctions.php");
  28  }
  29  
  30  // par defaut tout est exporte sauf les tables ci-dessous
  31  
  32  global $EXPORT_tables_noexport;
  33  
  34  if (!isset($EXPORT_tables_noexport)){
  35      $EXPORT_tables_noexport= array(
  36          'spip_caches',
  37          'spip_index',
  38          'spip_index_dico',
  39          'spip_referers',
  40          'spip_referers_articles',
  41          'spip_visites',
  42          'spip_visites_articles',
  43          'spip_ortho_cache',
  44          'spip_ortho_dico',
  45          'spip_versions', // le dump des fragments n'est pas robuste
  46          'spip_versions_fragments' // le dump des fragments n'est pas robuste
  47          );
  48      if (!$GLOBALS['connect_toutes_rubriques']){
  49          $EXPORT_tables_noexport[]='spip_messages';
  50          $EXPORT_tables_noexport[]='spip_auteurs_messages';
  51      }
  52  }
  53  
  54  // construction de la liste des tables pour le dump :
  55  // toutes les tables principales
  56  // + toutes les tables auxiliaires hors relations
  57  // + les tables relations dont les deux tables liees sont dans la liste
  58  
  59  // http://doc.spip.org/@export_all_list_tables
  60  function export_all_list_tables()
  61  {
  62      $tables_for_dump = array();
  63      $tables_pointees = array();
  64      global $EXPORT_tables_noexport;
  65      global $tables_principales;
  66      global $tables_auxiliaires;
  67      global $table_des_tables;
  68      global $tables_jointures;
  69  
  70  // on construit un index des tables de liens
  71  // pour les ajouter SI les deux tables qu'ils connectent sont sauvegardees
  72      $tables_for_link = array();
  73      foreach($tables_jointures as $table => $liste_relations)
  74          if (is_array($liste_relations))
  75          {
  76              $nom = $table;
  77              if (!isset($tables_auxiliaires[$nom])&&!isset($tables_principales[$nom]))
  78                  $nom = "spip_$table";
  79              if (isset($tables_auxiliaires[$nom])||isset($tables_principales[$nom])){
  80                  foreach($liste_relations as $link_table){
  81                      if (isset($tables_auxiliaires[$link_table])/*||isset($tables_principales[$link_table])*/){
  82                          $tables_for_link[$link_table][] = $nom;
  83                      }
  84                      else if (isset($tables_auxiliaires["spip_$link_table"])/*||isset($tables_principales["spip_$link_table"])*/){
  85                          $tables_for_link["spip_$link_table"][] = $nom;
  86                      }
  87                  }
  88              }
  89          }
  90      
  91      $liste_tables = array_merge(array_keys($tables_principales),array_keys($tables_auxiliaires));
  92      foreach($liste_tables as $table){
  93        //        $name = preg_replace("{^spip_}","",$table);
  94        if (        !isset($tables_pointees[$table]) 
  95                &&    !in_array($table,$EXPORT_tables_noexport) 
  96                &&    !isset($tables_for_link[$table])){
  97              $tables_for_dump[] = $table;
  98              $tables_pointees[$table] = 1;
  99          }
 100      }
 101      foreach ($tables_for_link as $link_table =>$liste){
 102          $connecte = true;
 103          foreach($liste as $connect_table)
 104              if (!in_array($connect_table,$tables_for_dump))
 105                  $connecte = false;
 106          if ($connecte)
 107              # on ajoute les liaisons en premier
 108              # si une restauration est interrompue,
 109              # cela se verra mieux si il manque des objets
 110              # que des liens
 111              array_unshift($tables_for_dump,$link_table);
 112      }
 113      return array($tables_for_dump, $tables_for_link);
 114  }
 115  
 116  // Concatenation des tranches
 117  // Il faudrait ouvrir une seule fois le fichier, et d'abord sous un autre nom
 118  // et sans detruire les tranches: au final renommage+destruction massive pour
 119  // prevenir autant que possible un Time-out.
 120  
 121  // http://doc.spip.org/@ramasse_parties
 122  function ramasse_parties($dir, $archive)
 123  {
 124      $files = preg_files($dir . $archive . ".part_[0-9]+_[0-9]+[.gz]?");
 125  
 126      $ok = true;
 127      $files_o = array();
 128      $but = $dir . $archive;
 129      foreach($files as $f) {
 130        $contenu = "";
 131        if (lire_fichier ($f, $contenu)) {
 132          if (!ecrire_fichier($but,$contenu,false,false))
 133            { $ok = false; break;}
 134        }
 135        @unlink($f);
 136        $files_o[]=$f;
 137      }
 138      return $ok ? $files_o : false;
 139  }
 140  
 141  define('_EXPORT_TRANCHES_LIMITE', 400);
 142  define('_EXTENSION_PARTIES', '.gz');
 143  
 144  //
 145  // Exportation de table SQL au format xml
 146  // La constante ci-dessus determine la taille des tranches,
 147  // chaque tranche etant copiee immediatement dans un fichier 
 148  // et son numero memorisee dans le serveur SQL.
 149  // En cas d'abandon sur Time-out, le travail pourra ainsi avancer.
 150  // Au final, on regroupe les tranches en un seul fichier
 151  // et on memorise dans le serveur qu'on va passer a la table suivante.
 152  
 153  // http://doc.spip.org/@export_objets
 154  function export_objets($table, $etape, $cpt, $dir, $archive, $gz, $total) {
 155      global $tables_principales;
 156  
 157      $filetable = $dir . $archive . '.part_' . sprintf('%03d',$etape);
 158      $prim = isset($tables_principales[$table])
 159        ? $tables_principales[$table]['key']["PRIMARY KEY"]
 160        : '';
 161      $debut = $cpt * _EXPORT_TRANCHES_LIMITE;
 162  
 163      while (1){ // on ne connait pas le nb de paquets d'avance
 164  
 165          $string = build_while($debut, $table, $prim);
 166          $cpt++;
 167          $debut +=  _EXPORT_TRANCHES_LIMITE;
 168          $status_dump = "$gz::$archive::$etape::$cpt";
 169  
 170          // attention $string vide ne suffit pas a sortir
 171          // car les admins restreints peuvent parcourir
 172          // une portion de table vide pour eux.
 173          if ($string) { 
 174              // on ecrit dans un fichier generique
 175              // puis on le renomme pour avoir une operation atomique 
 176              ecrire_fichier ($temp = $filetable . '.temp' . _EXTENSION_PARTIES, $string);
 177      // le fichier destination peut deja exister
 178      // si on sort d'un timeout entre le rename et le ecrire_meta
 179              if (file_exists($f = $filetable . sprintf('_%04d',$cpt) . _EXTENSION_PARTIES)) @unlink($f);
 180              rename($temp, $f);
 181          }
 182          // on se contente d'une ecriture en base pour aller plus vite
 183          // a la relecture on en profitera pour mettre le cache a jour
 184          ecrire_meta("status_dump", $status_dump,'non');
 185          if ($debut >= $total) {break;}
 186          echo " $debut";
 187      }
 188      echo " $total."; 
 189      
 190      # on prefere ne pas faire le ramassage ici de peur d'etre interrompu par le timeout au mauvais moment
 191      # le ramassage aura lieu en debut de hit suivant, et ne sera normalement pas interrompu car le temps pour ramasser
 192      # est plus court que le temps pour creer les parties
 193      // ramasse_parties($dir.$archive, $dir.$archive);
 194  }
 195  
 196  // Construit la version xml  des champs d'une table
 197  
 198  // http://doc.spip.org/@build_while
 199  function build_while($debut, $table, $prim) {
 200      global $connect_toutes_rubriques, $chercher_logo ;
 201  
 202      $result = spip_query("SELECT * FROM $table LIMIT $debut," . _EXPORT_TRANCHES_LIMITE);
 203  
 204      $string = '';
 205      while ($row = spip_fetch_array($result,SPIP_ASSOC)) {
 206        if ((!isset($row['impt'])) OR $row['impt']=='oui') {
 207              if (!($ok = $connect_toutes_rubriques)) {
 208                  if (isset($row['id_rubrique']))
 209                    $ok = autoriser('publierdans','rubrique',$row['id_rubrique']);
 210                  elseif (isset($row['id_article']))
 211                    $ok = autoriser('modifier','article',$row['id_article']);
 212                  else $ok = true;
 213              }
 214              if ($ok) {
 215                $attributs = "";
 216                  if ($chercher_logo) {
 217                      if ($logo = $chercher_logo($row[$prim], $prim, 'on'))
 218                        $attributs .= ' on="' . $logo[3] . '"';
 219                      if ($logo = $chercher_logo($row[$prim], $prim, 'off'))
 220                        $attributs .= ' off="' . $logo[3] . '"';
 221                  }
 222  
 223                  $string .= "<$table$attributs>\n";
 224                  foreach ($row as $k => $v) {
 225                      $string .= "<$k>" . text_to_xml($row[$k]) . "</$k>\n";
 226                }
 227                  $string .= "</$table>\n\n";
 228              }
 229        }
 230      }
 231      spip_free_result($result);
 232      return $string;
 233  }
 234  
 235  // Conversion texte -> xml (ajout d'entites)
 236  // http://doc.spip.org/@text_to_xml
 237  function text_to_xml($string) {
 238      return str_replace('<', '&lt;', str_replace('&', '&amp;', $string));
 239  }
 240  
 241  // production de l'entete du fichier d'archive
 242  
 243  // http://doc.spip.org/@export_entete
 244  function export_entete()
 245  {
 246      return
 247  "<" . "?xml version=\"1.0\" encoding=\"".
 248  $GLOBALS['meta']['charset']."\"?".">\n" .
 249  "<SPIP 
 250      version=\"" . $GLOBALS['spip_version_affichee'] . "\" 
 251      version_base=\"" . $GLOBALS['spip_version'] . "\" 
 252      version_archive=\"" . $GLOBALS['version_archive'] . "\"
 253      adresse_site=\"" .  $GLOBALS['meta']["adresse_site"] . "\"
 254      dir_img=\"" . _DIR_IMG . "\"
 255      dir_logos=\"" . _DIR_LOGOS . "\"
 256  >\n";
 257  }
 258  
 259  // http://doc.spip.org/@export_enpied
 260  function export_enpied () { return  "</SPIP>\n";}
 261  
 262  ?>


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