X-Git-Url: http://git.cyclocoop.org/?p=velocampus%2Fweb%2Fwww.git;a=blobdiff_plain;f=www%2Fecrire%2Finc%2Fimport_1_3.php;fp=www%2Fecrire%2Finc%2Fimport_1_3.php;h=66377a5100a5c612fbbced880c1d17966d8b765c;hp=0000000000000000000000000000000000000000;hb=80b4d3e85f78d402ed2e73f8f5d1bf4c19962eed;hpb=aaf970bf4cdaf76689ecc10609048e18d073820c diff --git a/www/ecrire/inc/import_1_3.php b/www/ecrire/inc/import_1_3.php new file mode 100644 index 0000000..66377a5 --- /dev/null +++ b/www/ecrire/inc/import_1_3.php @@ -0,0 +1,197 @@ + 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; +} +?>