array()); // au premier appel, init des invariants de boucle if (!$tables OR $trans) { $init = $request['init']; $tables = $init($request); if (!$tables) return ($import_ok = false); $phpmyadmin = preg_match("{^phpmyadmin::}is", $GLOBALS['meta']['restauration_version_archive']) ? array(array('"','>'),array('"','>')) : false; $fin = '/' . $GLOBALS['meta']['restauration_tag_archive']; } $b = false; if (!($table = xml_fetch_tag($lecteur, $b, $gz))) return false; if ($table == $fin) return !($import_ok = true); if (strpos($table,'=')!==FALSE) { list($table, $attl) = xml_parse_tag($table); $atts = array_merge($atts, $attl); } $new = isset($tables_trans[$table]) ? $tables_trans[$table]: $table; // indique a la fois la fonction a appliquer // et les infos qu'il faut lui communiquer $boucle = $request['boucle']; if (!in_array($new,$tables)) $field_desc[$boucle][$table] = $desc = $defaut; elseif (isset($field_desc[$boucle][$table])) $desc = $field_desc[$boucle][$table]; else { // recuperer la description de la table pour connaitre ses champs valides $desc = description_table($table); if (!isset($desc['field'])) $desc = $defaut; elseif (isset($request['insertion']) AND $request['insertion']=='on') $desc['field'] = import_collecte($desc); $field_desc[$boucle][$table] = $desc; #spip_log("$table :".var_export($field_desc[$boucle][$table],1),'dbrest'); } $values = import_lire_champs($lecteur, $desc['field'], $gz, $phpmyadmin, '/' . $table, $atts); if ($values === false) return ($import_ok = false); if ($values) $boucle($values, $new, $desc, $request, $atts); return $import_ok = $new; } // Au premier tour de l'insertion, ne memoriser que le strict necessaire // pour pouvoir identifier avec l'existant. // (Faudrait convenir d'une structure de donnees, c'est lourd & inextensible) // http://doc.spip.org/@import_collecte function import_collecte($desc) { $fields = $desc['field']; $b = array(); if (isset($fields[$p='titre'])) $b[$p]= $fields[$p]; if (isset($fields[$p='id_groupe'])) $b[$p]= $fields[$p]; if (isset($fields[$p='id_parent'])) $b[$p]= $fields[$p]; if (isset($fields[$p='id_rubrique'])) $b[$p]= $fields[$p]; if (isset($fields[$p='fichier'])) $b[$p]= $fields[$p]; if (isset($fields[$p='taille'])) $b[$p]= $fields[$p]; if (isset($fields[$p='extension'])) $b[$p]= $fields[$p]; $p = $desc['key']["PRIMARY KEY"]; $b[$p] = $fields[$p]; return $b; } // Les 2 derniers args ne servent que pour l'insertion // http://doc.spip.org/@import_replace function import_replace($values, $table, $desc, $request, $atts='') { if (!isset($desc['field']['impt'])) {// pas de champ de gestion d'import if (!sql_replace($table, $values, $desc)) $GLOBALS['erreur_restauration'] = sql_error(); } else { // la table contient un champ 'impt' qui permet de gerer des interdiction d'overwrite par import // impt=oui : la ligne est surchargeable par import // impt=non : la ligne ne doit pas etre ecrasee par un import // il faut gerer l'existence de la primary, et l'autorisation ou non de mettre a jour if (!isset($desc['key']["PRIMARY KEY"])) $GLOBALS['erreur_restauration'] = "champ impt sans cle primaire sur la table $table"; else { $keys = $desc['key']["PRIMARY KEY"]; $keys = explode(",",$keys); if (!is_array($keys)) $keys = array($keys); $where = ""; foreach($keys as $key){ if (!isset($values[$key])){ $GLOBALS['erreur_restauration'] = "champ $key manquant a l'import sur la table $table"; $where = ""; break; } $where .= " AND $key=".sql_quote($values[$key]); } if ($where) { $where = substr($where,4); $impt = sql_getfetsel('impt', $table, $where); #spip_log("IMPT : $table/$where/impt=$impt/",'dbrest'); if ($impt === NULL) sql_insertq($table, $values); elseif ($impt == 'oui') { if (!sql_updateq($table, $values, $where)) $GLOBALS['erreur_restauration'] = sql_error(); } } } } } // http://doc.spip.org/@import_lire_champs function import_lire_champs($f, $fields, $gz, $phpmyadmin, $table, $atts) { $values = array(); $dir_img = 0; if (($atts['version_base'] < '1.934') AND $table == '/spip_documents') { $dir_img = '@^'. preg_quote (isset($atts['dir_img']) ? $atts['dir_img']:'IMG/') . '@'; } if (!isset($GLOBALS['meta']['charset_insertion'])) $charset = ''; else { $charset = $GLOBALS['meta']['charset_insertion']; if ($charset == $GLOBALS['meta']['charset']) $charset = ''; } for (;;) { $b = false; if (!($col = xml_fetch_tag($f, $b, $gz))) return false; if ($col[0] == '/') { if ($col != $table) { spip_log("table $table, tag fermant inattendu:$col"); } break; } $value = $b = (($col != 'maj') AND (isset($fields[$col]))); if (!xml_fetch_tag($f, $value, $gz)) return false; if ($b) { if ($phpmyadmin) $value = str_replace($phpmyadmin[0],$phpmyadmin[1],$value); elseif ($dir_img) { $value = preg_replace($dir_img, '', $value); } if ($charset) $value = importer_charset($value, $charset); $values[$col]= $value; } } return $values; } ?>