[ Index ] |
|
Code source de SPIP 1.9.2c |
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('<', '<', str_replace('&', '&', $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 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Wed Nov 21 10:20:27 2007 | par Balluche grâce à PHPXref 0.7 |
![]() |