[ 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 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('"','>'),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 ?>
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 |
![]() |