cd43d15f0fa90bf4e2c4d82ae09be40f38966ea7
[velocampus/web/www.git] / www / ecrire / inc / import_insere.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2011 *
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/@insere_1_init
16 function insere_1_init($request) {
17
18 // table des translations
19
20 $field = array(
21 "type" => "VARCHAR(16) NOT NULL",
22 "ajout" => "integer NOT NULL", // en fait booleen
23 "titre" => "text NOT NULL",
24 "id_old" => "bigint (21) DEFAULT '0' NOT NULL",
25 "id_new" => "bigint (21) DEFAULT '0' NOT NULL");
26
27 $key = array(
28 "PRIMARY KEY" => "id_old, id_new, type",
29 "KEY id_old" => "id_old");
30
31 $v = sql_create('spip_translate', $field, $key, true);
32 if (!$v) {
33 spip_log("echec de la creation de la table de fusion");
34 return false;
35 }
36 // au cas ou la derniere fois ce serait terminee anormalement
37 sql_delete("spip_translate");
38 // pour PG
39 $GLOBALS['tables_principales']['spip_translate'] =
40 array('field' => $field, 'key' => $key);
41 return insere_1bis_init($request);
42 }
43
44 // http://doc.spip.org/@insere_1bis_init
45 function insere_1bis_init($request) {
46
47 // l'insertion porte sur les tables principales ...
48 $t = array_keys($GLOBALS['tables_principales']);
49 // ... mais pas cette table a cause de la duplication des login
50 unset($t[array_search('spip_auteurs', $t)]);
51 // ni celle-ci, les qui est liee implicitement a la precedente
52 unset($t[array_search('spip_messages', $t)]);
53 // et pour celles-ci restent a programmer les regles
54 unset($t[array_search('spip_forum', $t)]);
55 unset($t[array_search('spip_syndic', $t)]);
56 unset($t[array_search('spip_signatures', $t)]);
57 return $t;
58 }
59
60 // En passe 2, relire les tables principales et les tables auxiliaires
61 // sur les mots et les documents car on sait les identifier
62
63 // http://doc.spip.org/@insere_2_init
64 function insere_2_init($request) {
65 $t = insere_1bis_init($request);
66
67 // ne pas importer cette table, son homologue est prioritaire
68 unset($t[array_search('spip_types_documents', $t)]);
69
70 $t[]= 'spip_mots_articles';
71 $t[]= 'spip_mots_breves';
72 $t[]= 'spip_mots_rubriques';
73 $t[]= 'spip_mots_syndic';
74 $t[]= 'spip_mots_forum';
75 $t[]= 'spip_mots_documents';
76 $t[]= 'spip_documents_liens';
77
78 return $t;
79 }
80
81 // construire le tableau PHP de la table spip_translate
82 // (mis en table pour pouvoir reprendre apres interruption)
83
84 // http://doc.spip.org/@translate_init
85 function translate_init($request) {
86
87 include_spip('inc/texte'); // pour les Regexp des raccourcis
88 include_spip('inc/chercher_logo'); // pour les noms des logos
89 include_spip('inc/distant'); // pour recuperer les logos
90
91 $q = sql_select('*', "spip_translate");
92 $trans = array();
93 while ($r = sql_fetch($q)) {
94 $trans[$r['type']][$r['id_old']] = array($r['id_new'], $r['titre'], $r['ajout']);
95 }
96 return $trans;
97 }
98
99
100 // http://doc.spip.org/@import_insere
101 function import_insere($values, $table, $desc, $request, $atts) {
102
103 static $jesais = array();
104
105 $type_id = $desc['key']["PRIMARY KEY"];
106 // reserver une place dans les tables principales si nouveau
107 $ajout = 0;
108
109 if ((!function_exists($f = 'import_identifie_' . $type_id))
110 OR (!($n = $f($values, $table, $desc, $request)))) {
111 // pas d'importation de types_doc (a revoir)
112 if ($table == 'spip_types_documents') return;
113 $n = sql_insertq($table);
114 $ajout=1;
115 }
116
117 if (is_array($n))
118 list($id, $titre) = $n;
119 else {$id = $n; $titre = "";}
120 sql_insertq('spip_translate', array(
121 'id_old' => $values[$type_id],
122 'id_new' => $id,
123 'titre' => $titre,
124 'type' => $type_id,
125 'ajout' => $ajout));
126 }
127
128 // Renumerotation des entites collectees
129 // Appelle la fonction specifique a la table, ou a defaut la std.
130 // Le tableau de correspondance est global, et permet qu'un numero
131 // d'une entite soit calcule une seule fois, a sa premiere occurrence.
132 // (Mais des requetes avec jointures eviteraient sa construction. A voir)
133
134 // http://doc.spip.org/@import_translate
135 function import_translate($values, $table, $desc, $request, $atts) {
136
137 if (!function_exists($f = 'import_translate_' . $table))
138 $f = 'import_translate_std';
139 $f($values, $table, $desc, $request, $atts);
140 }
141
142 // La fonction d'insertion apres renumerotation.
143 // Afin qu'inserer une 2e fois la meme sauvegarde ne change pas la base,
144 // chaque entree de la sauvegarde est ignoree s'il existe une entree
145 // de meme titre avec le meme contexte (parent etc) dans la base installee.
146 // Une synchronisation plus fine serait preferable, cf [8004]
147
148 // http://doc.spip.org/@import_inserer_translate
149 function import_inserer_translate($values, $table, $desc, $request, $atts) {
150 global $trans;
151 $p = $desc['key']["PRIMARY KEY"];
152 $v = $values[$p];
153 if (!isset($trans[$p]) OR !isset($trans[$p][$v]) OR $trans[$p][$v][2]){
154 sql_replace($table, $values);
155 $on = isset($atts['on']) ? ($atts['on']) : '';
156 $off = isset($atts['off']) ? ($atts['off']) : '';
157 if ($on OR $off) {
158 $t = type_du_logo($p);
159 $url = $request['url_site'];
160 if (!$url) $url = $atts['adresse_site'];
161 if (substr($url,-1) !='/') $url .='/';
162 $url .= $atts['dir_logos'];
163 $new = $trans[$p][$v][0];
164 if ($on) {
165 if ($logo = recuperer_page($url . $t . "on$v." . $on))
166 ecrire_fichier(_DIR_LOGOS. $t . "on$new." . $on, $logo);
167 }
168 if ($off) {
169 if ($logo = recuperer_page($url . $t . "off$v." . $off))
170 ecrire_fichier(_DIR_LOGOS. $t . "off$new." . $off, $logo);
171 }
172 }
173 }
174 }
175
176 // Insertion avec renumerotation, y compris des raccourcis.
177 // http://doc.spip.org/@import_translate_std
178 function import_translate_std($values, $table, $desc, $request, $atts) {
179
180 foreach ($values as $k => $v) {
181 if ($k=='id_parent' OR $k=='id_secteur')
182 $type = 'id_rubrique';
183 else $type = $k;
184
185 $values[$k]= importe_raccourci(importe_translate_maj($type, $v));
186 }
187 import_inserer_translate($values, $table, $desc, $request, $atts);
188 }
189
190 // http://doc.spip.org/@import_translate_spip_articles
191 function import_translate_spip_articles($values, $table, $desc, $request, $atts) {
192 $v = $values['chapo'];
193 if ($v[0]=='=' AND preg_match(_RACCOURCI_CHAPO, substr($v,1)))
194 $values['chapo'] = '=[->' . substr($v,1) . ']';
195 if ($request['statut'] == 'on' AND $values['statut'] == 'publie')
196 $values['statut'] = 'prop';
197 import_translate_std($values, $table, $desc, $request, $atts);
198 }
199
200 // http://doc.spip.org/@import_translate_spip_breves
201 function import_translate_spip_breves($values, $table, $desc, $request, $atts) {
202 if ($request['statut'] == 'on' AND $values['statut'] == 'publie')
203 $values['statut'] = 'prop';
204 import_translate_std($values, $table, $desc, $request, $atts);
205 }
206
207 // Les doc importes deviennent distants, a fortiori s'ils etaient deja
208 // Gerer les vieilles sauvegardes oĂą le Path etait en dur
209 // http://doc.spip.org/@import_translate_spip_documents
210 function import_translate_spip_documents($values, $table, $desc, $request, $atts) {
211
212 if ($values['distant'] === 'oui') {
213 $url = '';
214 } else {
215 $values['distant'] = 'oui';
216 $url = $request['url_site'];
217 if (!$url) $url = $atts['adresse_site'];
218 if (substr($url,-1) !='/') $url .='/';
219 // deja dans la BD avant cette epoque
220 if ($atts['version_base'] >= '1.934')
221 $url .= $atts['dir_img'];
222 }
223 $url .= $values['fichier'];
224 unset($values['fichier']);
225 foreach ($values as $k => $v) {
226 $values[$k]= importe_raccourci(importe_translate_maj($k, $v));
227
228 }
229 $values['fichier'] = $url;
230 import_inserer_translate($values, $table, $desc, $request, $atts);
231 }
232
233 function import_translate_spip_documents_liens($values, $table, $desc, $request, $atts) {
234
235 $values['id_document']= (importe_translate_maj('id_document', $values['id_document']));
236 $values['id_objet']= (importe_translate_maj('id_' .$values['objet'], $values['id_objet']));
237
238 sql_replace($table, $values);
239 }
240
241 // Fonction de renumerotation, par delegation aux fonction specialisees
242 // Si une allocation est finalement necessaire, celles-ci doivent repercuter
243 // la renumerotation sur la table SQL temporaire pour qu'en cas de reprise
244 // sur Time-Out il n'y ait pas reallocation.
245 // En l'absence d'allocation, cet acces SQL peut etre omis, quitte a
246 // recalculer le nouveau numero si une autre occurrence est rencontree
247 // a la reprise. Pas dramatique.
248
249 // http://doc.spip.org/@importe_translate_maj
250 function importe_translate_maj($k, $v)
251 {
252 global $trans;
253 if (!(isset($trans[$k]) AND isset($trans[$k][$v]))) return $v;
254 list($g, $titre, $ajout) = $trans[$k][$v];
255 if ($g <= 0) {
256 $f = 'import_identifie_parent_' . $k;
257 if (function_exists($f)) {
258 $g = $f($g, $titre, $v);
259 if ($g > 0)
260 // memoriser qu'on insere
261 $trans[$k][$v][2]=1;
262 else $g = (0-$g);
263 $trans[$k][$v][0] = $g;
264 } else spip_log("$f manquante");
265 }
266 return $g;
267 }
268
269 define('_RACCOURCI_MODELE_ALL', '@' . _RACCOURCI_MODELE .'@isS');
270
271 // http://doc.spip.org/@importe_raccourci
272 function importe_raccourci($v)
273 {
274 if (preg_match_all(_RACCOURCI_LIEN, $v, $m, PREG_SET_ORDER)) {
275 foreach ($m as $regs) {
276 // supprimer 'http://' ou 'mailto:'
277 $lien = vider_url($regs[count($regs)-1]);
278 if ($match = typer_raccourci($lien)) {
279 list($f,$objet,$id,$params,$ancre) = $match;
280 $k = 'id_' . $f;
281 $g = importe_translate_maj($k, $id);
282 if ($g != $id) {
283
284 $rac = '[' . $regs[1] . '->' . $regs[2] . $objet . $g . $params . $ancre .']';
285 $v = str_replace($regs[0], $rac, $v);
286 }
287 }
288 }
289 }
290
291 if (preg_match_all(_RACCOURCI_MODELE_ALL, $v, $m, PREG_SET_ORDER)) {
292 foreach ($m as $regs) {
293 $g = importe_translate_maj('id_document', $regs[3]);
294 if ($g != $regs[3]) {
295 $rac = '<' . $regs[2] . $g . $regs[4] . '>' . $regs[5];
296 $v = str_replace($regs[0], $rac, $v);
297 }
298 }
299 }
300 return $v;
301 }
302
303 // un document importe est considere comme identique a un document local
304 // s'ils ont meme taille et meme nom et que le present n'est pas detruit
305 // Et ne pas importer les incoherences (docs sans extension)
306 // http://doc.spip.org/@import_identifie_id_document
307 function import_identifie_id_document($values, $table, $desc, $request) {
308 if (!$values['extension']) return false;
309 $t = $values['taille'];
310 $f = $values['fichier'];
311 $h = $request['url_site'] . $f;
312 $r = sql_fetsel("id_document AS id, fichier AS titre, distant", "spip_documents", "taille=" . sql_quote($t) . " AND (fichier=" . sql_quote($f) . " OR fichier= " . sql_quote($h) . ')');
313 if (!$r) return false;
314 if (($r['distant'] != 'oui')
315 AND !file_exists(_DIR_IMG . $r['titre']))
316 return false;
317 return array($r['id'], $r['titre']);
318 }
319
320 // un type de document importe est considere comme identique a un type present
321 // s'ils ont meme extension et meme titre
322 // Sinon il ne sera PAS importe
323 // http://doc.spip.org/@import_identifie_id_type
324 function import_identifie_id_type($values, $table, $desc, $request) {
325 $e = $values['extension'];
326 $t = $values['titre'];
327 $r = sql_fetsel("id_type AS id, titre", "spip_types_documents", "extension=" . sql_quote($e) . " AND titre=" . sql_quote($t));
328 return $r ? array($r['id'], $r['titre']) : false;
329 }
330
331 // deux groupes de mots ne peuvent avoir le meme titre ==> identification
332 // http://doc.spip.org/@import_identifie_id_groupe
333 function import_identifie_id_groupe($values, $table, $desc, $request) {
334 $r = sql_fetsel("id_groupe AS id, titre", "spip_groupes_mots", "titre=" . sql_quote($values['titre']));
335 return $r ? array($r['id'], $r['titre']) : false;
336 }
337
338 // pour un mot le titre est insuffisant, il faut aussi l'identite du groupe.
339 // Memoriser ces 2 infos et le signaler a import_translate grace a 1 negatif
340 // http://doc.spip.org/@import_identifie_id_mot
341 function import_identifie_id_mot($values, $table, $desc, $request) {
342 return array((0 - $values['id_groupe']), $values['titre']);
343 }
344
345 // Passe 2: mot de meme titre et de meme groupe ==> identification
346 // http://doc.spip.org/@import_identifie_parent_id_mot
347 function import_identifie_parent_id_mot($id_groupe, $titre, $v)
348 {
349 global $trans;
350 $titre = sql_quote($titre);
351 $id_groupe = 0-$id_groupe;
352 if (isset($trans['id_groupe'])
353 AND isset($trans['id_groupe'][$id_groupe])) {
354 $new = $trans['id_groupe'][$id_groupe][0];
355 $r = sql_fetsel("id_mot", "spip_mots", "titre=$titre AND id_groupe=$new" );
356 if ($r) return (0 - $r['id_mot']);
357 }
358 if ($r = sql_insertq('spip_mots'))
359 sql_replace('spip_translate', array(
360 'id_old' => $v,
361 'id_new' => $r,
362 'titre' => $titre,
363 'type' => 'id_mot',
364 'ajout' => 1));
365 else spip_log("Impossible d'inserer dans spip_mots");
366 return $r;
367 }
368
369 // idem pour les articles
370 // http://doc.spip.org/@import_identifie_id_article
371 function import_identifie_id_article($values, $table, $desc, $request) {
372 return array((0 - $values['id_rubrique']), $values['titre']);
373 }
374
375 // Passe 2 des articles comme pour les mots
376
377 // http://doc.spip.org/@import_identifie_parent_id_article
378 function import_identifie_parent_id_article($id_parent, $titre, $v)
379 {
380 $id_parent = importe_translate_maj('id_rubrique', (0 - $id_parent));
381
382 $titre = sql_quote($titre);
383 $r = sql_fetsel("id_article", "spip_articles", "titre=$titre AND id_rubrique=$id_parent AND statut<>'poubelle'" );
384 if ($r) return (0 - $r['id_article']);
385
386 if ($r = sql_insertq('spip_articles'))
387 sql_replace('spip_translate', array(
388 'id_old' => $v,
389 'id_new' => $r,
390 'titre' => $titre,
391 'type' => 'id_article',
392 'ajout' => 1),
393 $GLOBALS['tables_principales']['spip_translate']
394 );
395 else spip_log("Impossible d'inserer dans spip_articles");
396 return $r;
397 }
398
399 // idem pour les breves
400 // http://doc.spip.org/@import_identifie_id_breve
401 function import_identifie_id_breve($values, $table, $desc, $request) {
402 return array((0 - $values['id_rubrique']), $values['titre']);
403 }
404
405 // Passe 2 des breves comme pour les mots
406
407 // http://doc.spip.org/@import_identifie_parent_id_breve
408 function import_identifie_parent_id_breve($id_parent, $titre, $v)
409 {
410 $id_parent = importe_translate_maj('id_rubrique', (0 - $id_parent));
411
412 $titre = sql_quote($titre);
413 $r = sql_fetsel("id_breve", "spip_breves", "titre=$titre AND id_rubrique=$id_parent AND statut<>'refuse'" );
414 if ($r) return (0 - $r['id_breve']);
415
416 if ($r = sql_insertq('spip_breves'))
417 sql_replace('spip_translate', array(
418 'id_old' => $v,
419 'id_new' => $r,
420 'titre' => $titre,
421 'type' => 'id_breve',
422 'ajout' => 1),
423 $GLOBALS['tables_principales']['spip_translate']
424 );
425 else spip_log("Impossible d'inserer dans spip_breves");
426 return $r;
427 }
428
429
430 // pour une rubrique le titre est insuffisant, il faut l'identite du parent
431 // Memoriser ces 2 infos et le signaler a import_translate grace a 1 negatif
432 // http://doc.spip.org/@import_identifie_id_rubrique
433 function import_identifie_id_rubrique($values, $table, $desc, $request) {
434 return array((0 - $values['id_parent']), $values['titre']);
435 }
436
437 // Passe 2 des rubriques, renumerotation en cascade.
438 // rubrique de meme titre et de meme parent ==> identification
439 // http://doc.spip.org/@import_identifie_parent_id_rubrique
440 function import_identifie_parent_id_rubrique($id_parent, $titre, $v)
441 {
442 global $trans;
443 if (isset($trans['id_rubrique'])) {
444 if ($id_parent < 0) {
445 $id_parent = (0 - $id_parent);
446 $gparent = $trans['id_rubrique'][$id_parent][0];
447 // parent deja renumerote depuis le debut la passe 2
448 if ($gparent >= 0)
449 $id_parent = $gparent;
450 else {
451 // premiere occurrence du parent
452 $pitre = $trans['id_rubrique'][$id_parent][1];
453 $n = import_identifie_parent_id_rubrique($gparent, $pitre, $id_parent);
454 $trans['id_rubrique'][$id_parent][0] = ($n>0) ? $n: (0-$n);
455 // parent tout neuf,
456 // pas la peine de chercher un titre homonyme
457 if ($n > 0) {
458 $trans['id_rubrique'][$id_parent][2]=1; // nouvelle rub.
459 return import_alloue_id_rubrique($n, $titre, $v);
460 } else $id_parent = (0 - $n);
461 }
462 }
463
464 $r = sql_fetsel("id_rubrique", "spip_rubriques", "titre=" . sql_quote($titre) . " AND id_parent=" . intval($id_parent));
465 if ($r) {
466 return (0 - $r['id_rubrique']);
467 }
468 return import_alloue_id_rubrique($id_parent, $titre, $v);
469 }
470 }
471
472 // reserver la place en mettant titre et parent tout de suite
473 // pour que le SELECT ci-dessus fonctionne a la prochaine occurrence
474
475 // http://doc.spip.org/@import_alloue_id_rubrique
476 function import_alloue_id_rubrique($id_parent, $titre, $v) {
477 if ($r = sql_insertq('spip_rubriques', array('titre' => $titre, id_parent => $id_parent)))
478 sql_replace('spip_translate', array(
479 'id_old' => $v,
480 'id_new' => $r,
481 'titre' => $titre,
482 'type' => 'id_rubrique',
483 'ajout' => 1),
484 $GLOBALS['tables_principales']['spip_translate']);
485 else spip_log("Impossible d'inserer dans spip_rubriques");
486 return $r;
487 }
488 ?>