[SPIP] ~2.1.12 -->2.1.25
[velocampus/web/www.git] / www / ecrire / inc / import_1_3.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2014 *
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 if (!$tables) return ($import_ok = false);
29 $phpmyadmin = preg_match("{^phpmyadmin::}is",
30 $GLOBALS['meta']['restauration_version_archive'])
31 ? array(array('&quot;','&gt;'),array('"','>'))
32 : false;
33 $fin = '/' . $GLOBALS['meta']['restauration_tag_archive'];
34 }
35
36 $b = false;
37 if (!($table = xml_fetch_tag($lecteur, $b, $gz))) return false;
38 if ($table == $fin) return !($import_ok = true);
39 if (strpos($table,'=')!==FALSE) {
40 list($table, $attl) = xml_parse_tag($table);
41 $atts = array_merge($atts, $attl);
42 }
43
44 $new = isset($tables_trans[$table]) ? $tables_trans[$table]: $table;
45
46 // indique a la fois la fonction a appliquer
47 // et les infos qu'il faut lui communiquer
48 $boucle = $request['boucle'];
49
50 if (!in_array($new,$tables))
51 $field_desc[$boucle][$table] = $desc = $defaut;
52 elseif (isset($field_desc[$boucle][$table]))
53 $desc = $field_desc[$boucle][$table];
54 else {
55 // recuperer la description de la table pour connaitre ses champs valides
56 $desc = description_table($table);
57 if (!isset($desc['field']))
58 $desc = $defaut;
59 elseif (isset($request['insertion'])
60 AND $request['insertion']=='on')
61 $desc['field'] = import_collecte($desc);
62 $field_desc[$boucle][$table] = $desc;
63 #spip_log("$table :".var_export($field_desc[$boucle][$table],1),'dbrest');
64 }
65
66 $values = import_lire_champs($lecteur,
67 $desc['field'],
68 $gz,
69 $phpmyadmin,
70 '/' . $table,
71 $atts);
72
73 if ($values === false) return ($import_ok = false);
74
75 if ($values) $boucle($values, $new, $desc, $request, $atts);
76
77 return $import_ok = $new;
78 }
79
80 // Au premier tour de l'insertion, ne memoriser que le strict necessaire
81 // pour pouvoir identifier avec l'existant.
82 // (Faudrait convenir d'une structure de donnees, c'est lourd & inextensible)
83
84 // http://doc.spip.org/@import_collecte
85 function import_collecte($desc)
86 {
87 $fields = $desc['field'];
88 $b = array();
89 if (isset($fields[$p='titre']))
90 $b[$p]= $fields[$p];
91 if (isset($fields[$p='id_groupe']))
92 $b[$p]= $fields[$p];
93 if (isset($fields[$p='id_parent']))
94 $b[$p]= $fields[$p];
95 if (isset($fields[$p='id_rubrique']))
96 $b[$p]= $fields[$p];
97 if (isset($fields[$p='fichier']))
98 $b[$p]= $fields[$p];
99 if (isset($fields[$p='taille']))
100 $b[$p]= $fields[$p];
101 if (isset($fields[$p='extension']))
102 $b[$p]= $fields[$p];
103
104 $p = $desc['key']["PRIMARY KEY"];
105 $b[$p] = $fields[$p];
106 return $b;
107 }
108
109 // Les 2 derniers args ne servent que pour l'insertion
110
111 // http://doc.spip.org/@import_replace
112 function import_replace($values, $table, $desc, $request, $atts='') {
113 if (!isset($desc['field']['impt'])) {// pas de champ de gestion d'import
114 if (!sql_replace($table, $values, $desc))
115 $GLOBALS['erreur_restauration'] = sql_error();
116 } else {
117 // la table contient un champ 'impt' qui permet de gerer des interdiction d'overwrite par import
118 // impt=oui : la ligne est surchargeable par import
119 // impt=non : la ligne ne doit pas etre ecrasee par un import
120 // il faut gerer l'existence de la primary, et l'autorisation ou non de mettre a jour
121 if (!isset($desc['key']["PRIMARY KEY"]))
122 $GLOBALS['erreur_restauration'] = "champ impt sans cle primaire sur la table $table";
123 else {
124 $keys = $desc['key']["PRIMARY KEY"];
125 $keys = explode(",",$keys);
126 if (!is_array($keys)) $keys = array($keys);
127 $where = "";
128 foreach($keys as $key){
129 if (!isset($values[$key])){
130 $GLOBALS['erreur_restauration'] = "champ $key manquant a l'import sur la table $table";
131 $where = "";
132 break;
133 }
134 $where .= " AND $key=".sql_quote($values[$key]);
135 }
136 if ($where) {
137 $where = substr($where,4);
138 $impt = sql_getfetsel('impt', $table, $where);
139 #spip_log("IMPT : $table/$where/impt=$impt/",'dbrest');
140 if ($impt === NULL)
141 sql_insertq($table, $values);
142 elseif ($impt == 'oui') {
143 if (!sql_updateq($table, $values, $where))
144 $GLOBALS['erreur_restauration'] = sql_error();
145 }
146 }
147 }
148 }
149 }
150
151 // http://doc.spip.org/@import_lire_champs
152 function import_lire_champs($f, $fields, $gz, $phpmyadmin, $table, $atts)
153 {
154 $values = array();
155 $dir_img = 0;
156
157
158 if (($atts['version_base'] < '1.934')
159 AND $table == '/spip_documents') {
160
161 $dir_img = '@^'. preg_quote (isset($atts['dir_img']) ? $atts['dir_img']:'IMG/') . '@';
162 }
163
164 if (!isset($GLOBALS['meta']['charset_insertion']))
165 $charset = '';
166 else {
167 $charset = $GLOBALS['meta']['charset_insertion'];
168 if ($charset == $GLOBALS['meta']['charset'])
169 $charset = '';
170 }
171 for (;;) {
172 $b = false;
173 if (!($col = xml_fetch_tag($f, $b, $gz))) return false;
174 if ($col[0] == '/') {
175 if ($col != $table) {
176 spip_log("table $table, tag fermant inattendu:$col");
177 }
178 break;
179 }
180 $value = $b = (($col != 'maj') AND (isset($fields[$col])));
181 if (!xml_fetch_tag($f, $value, $gz)) return false;
182
183 if ($b) {
184 if ($phpmyadmin)
185 $value = str_replace($phpmyadmin[0],$phpmyadmin[1],$value);
186 elseif ($dir_img) {
187 $value = preg_replace($dir_img, '', $value);
188 }
189 if ($charset)
190 $value = importer_charset($value, $charset);
191 $values[$col]= $value;
192 }
193 }
194
195 return $values;
196 }
197 ?>