X-Git-Url: http://git.cyclocoop.org/?p=velocampus%2Fweb%2Fwww.git;a=blobdiff_plain;f=www%2Fecrire%2Finc%2Fimport_insere.php;fp=www%2Fecrire%2Finc%2Fimport_insere.php;h=cd43d15f0fa90bf4e2c4d82ae09be40f38966ea7;hp=0000000000000000000000000000000000000000;hb=80b4d3e85f78d402ed2e73f8f5d1bf4c19962eed;hpb=aaf970bf4cdaf76689ecc10609048e18d073820c diff --git a/www/ecrire/inc/import_insere.php b/www/ecrire/inc/import_insere.php new file mode 100644 index 0000000..cd43d15 --- /dev/null +++ b/www/ecrire/inc/import_insere.php @@ -0,0 +1,488 @@ + "VARCHAR(16) NOT NULL", + "ajout" => "integer NOT NULL", // en fait booleen + "titre" => "text NOT NULL", + "id_old" => "bigint (21) DEFAULT '0' NOT NULL", + "id_new" => "bigint (21) DEFAULT '0' NOT NULL"); + + $key = array( + "PRIMARY KEY" => "id_old, id_new, type", + "KEY id_old" => "id_old"); + + $v = sql_create('spip_translate', $field, $key, true); + if (!$v) { + spip_log("echec de la creation de la table de fusion"); + return false; + } + // au cas ou la derniere fois ce serait terminee anormalement + sql_delete("spip_translate"); + // pour PG + $GLOBALS['tables_principales']['spip_translate'] = + array('field' => $field, 'key' => $key); + return insere_1bis_init($request); +} + +// http://doc.spip.org/@insere_1bis_init +function insere_1bis_init($request) { + + // l'insertion porte sur les tables principales ... + $t = array_keys($GLOBALS['tables_principales']); + // ... mais pas cette table a cause de la duplication des login + unset($t[array_search('spip_auteurs', $t)]); + // ni celle-ci, les qui est liee implicitement a la precedente + unset($t[array_search('spip_messages', $t)]); + // et pour celles-ci restent a programmer les regles + unset($t[array_search('spip_forum', $t)]); + unset($t[array_search('spip_syndic', $t)]); + unset($t[array_search('spip_signatures', $t)]); + return $t; +} + +// En passe 2, relire les tables principales et les tables auxiliaires +// sur les mots et les documents car on sait les identifier + +// http://doc.spip.org/@insere_2_init +function insere_2_init($request) { + $t = insere_1bis_init($request); + + // ne pas importer cette table, son homologue est prioritaire + unset($t[array_search('spip_types_documents', $t)]); + + $t[]= 'spip_mots_articles'; + $t[]= 'spip_mots_breves'; + $t[]= 'spip_mots_rubriques'; + $t[]= 'spip_mots_syndic'; + $t[]= 'spip_mots_forum'; + $t[]= 'spip_mots_documents'; + $t[]= 'spip_documents_liens'; + + return $t; +} + +// construire le tableau PHP de la table spip_translate +// (mis en table pour pouvoir reprendre apres interruption) + +// http://doc.spip.org/@translate_init +function translate_init($request) { + + include_spip('inc/texte'); // pour les Regexp des raccourcis + include_spip('inc/chercher_logo'); // pour les noms des logos + include_spip('inc/distant'); // pour recuperer les logos + + $q = sql_select('*', "spip_translate"); + $trans = array(); + while ($r = sql_fetch($q)) { + $trans[$r['type']][$r['id_old']] = array($r['id_new'], $r['titre'], $r['ajout']); + } + return $trans; +} + + +// http://doc.spip.org/@import_insere +function import_insere($values, $table, $desc, $request, $atts) { + + static $jesais = array(); + + $type_id = $desc['key']["PRIMARY KEY"]; + // reserver une place dans les tables principales si nouveau + $ajout = 0; + + if ((!function_exists($f = 'import_identifie_' . $type_id)) + OR (!($n = $f($values, $table, $desc, $request)))) { + // pas d'importation de types_doc (a revoir) + if ($table == 'spip_types_documents') return; + $n = sql_insertq($table); + $ajout=1; + } + + if (is_array($n)) + list($id, $titre) = $n; + else {$id = $n; $titre = "";} + sql_insertq('spip_translate', array( + 'id_old' => $values[$type_id], + 'id_new' => $id, + 'titre' => $titre, + 'type' => $type_id, + 'ajout' => $ajout)); +} + +// Renumerotation des entites collectees +// Appelle la fonction specifique a la table, ou a defaut la std. +// Le tableau de correspondance est global, et permet qu'un numero +// d'une entite soit calcule une seule fois, a sa premiere occurrence. +// (Mais des requetes avec jointures eviteraient sa construction. A voir) + +// http://doc.spip.org/@import_translate +function import_translate($values, $table, $desc, $request, $atts) { + + if (!function_exists($f = 'import_translate_' . $table)) + $f = 'import_translate_std'; + $f($values, $table, $desc, $request, $atts); +} + +// La fonction d'insertion apres renumerotation. +// Afin qu'inserer une 2e fois la meme sauvegarde ne change pas la base, +// chaque entree de la sauvegarde est ignoree s'il existe une entree +// de meme titre avec le meme contexte (parent etc) dans la base installee. +// Une synchronisation plus fine serait preferable, cf [8004] + +// http://doc.spip.org/@import_inserer_translate +function import_inserer_translate($values, $table, $desc, $request, $atts) { + global $trans; + $p = $desc['key']["PRIMARY KEY"]; + $v = $values[$p]; + if (!isset($trans[$p]) OR !isset($trans[$p][$v]) OR $trans[$p][$v][2]){ + sql_replace($table, $values); + $on = isset($atts['on']) ? ($atts['on']) : ''; + $off = isset($atts['off']) ? ($atts['off']) : ''; + if ($on OR $off) { + $t = type_du_logo($p); + $url = $request['url_site']; + if (!$url) $url = $atts['adresse_site']; + if (substr($url,-1) !='/') $url .='/'; + $url .= $atts['dir_logos']; + $new = $trans[$p][$v][0]; + if ($on) { + if ($logo = recuperer_page($url . $t . "on$v." . $on)) + ecrire_fichier(_DIR_LOGOS. $t . "on$new." . $on, $logo); + } + if ($off) { + if ($logo = recuperer_page($url . $t . "off$v." . $off)) + ecrire_fichier(_DIR_LOGOS. $t . "off$new." . $off, $logo); + } + } + } +} + +// Insertion avec renumerotation, y compris des raccourcis. +// http://doc.spip.org/@import_translate_std +function import_translate_std($values, $table, $desc, $request, $atts) { + + foreach ($values as $k => $v) { + if ($k=='id_parent' OR $k=='id_secteur') + $type = 'id_rubrique'; + else $type = $k; + + $values[$k]= importe_raccourci(importe_translate_maj($type, $v)); + } + import_inserer_translate($values, $table, $desc, $request, $atts); +} + +// http://doc.spip.org/@import_translate_spip_articles +function import_translate_spip_articles($values, $table, $desc, $request, $atts) { + $v = $values['chapo']; + if ($v[0]=='=' AND preg_match(_RACCOURCI_CHAPO, substr($v,1))) + $values['chapo'] = '=[->' . substr($v,1) . ']'; + if ($request['statut'] == 'on' AND $values['statut'] == 'publie') + $values['statut'] = 'prop'; + import_translate_std($values, $table, $desc, $request, $atts); +} + +// http://doc.spip.org/@import_translate_spip_breves +function import_translate_spip_breves($values, $table, $desc, $request, $atts) { + if ($request['statut'] == 'on' AND $values['statut'] == 'publie') + $values['statut'] = 'prop'; + import_translate_std($values, $table, $desc, $request, $atts); +} + +// Les doc importes deviennent distants, a fortiori s'ils etaient deja +// Gerer les vieilles sauvegardes où le Path etait en dur +// http://doc.spip.org/@import_translate_spip_documents +function import_translate_spip_documents($values, $table, $desc, $request, $atts) { + + if ($values['distant'] === 'oui') { + $url = ''; + } else { + $values['distant'] = 'oui'; + $url = $request['url_site']; + if (!$url) $url = $atts['adresse_site']; + if (substr($url,-1) !='/') $url .='/'; + // deja dans la BD avant cette epoque + if ($atts['version_base'] >= '1.934') + $url .= $atts['dir_img']; + } + $url .= $values['fichier']; + unset($values['fichier']); + foreach ($values as $k => $v) { + $values[$k]= importe_raccourci(importe_translate_maj($k, $v)); + + } + $values['fichier'] = $url; + import_inserer_translate($values, $table, $desc, $request, $atts); +} + +function import_translate_spip_documents_liens($values, $table, $desc, $request, $atts) { + + $values['id_document']= (importe_translate_maj('id_document', $values['id_document'])); + $values['id_objet']= (importe_translate_maj('id_' .$values['objet'], $values['id_objet'])); + + sql_replace($table, $values); +} + +// Fonction de renumerotation, par delegation aux fonction specialisees +// Si une allocation est finalement necessaire, celles-ci doivent repercuter +// la renumerotation sur la table SQL temporaire pour qu'en cas de reprise +// sur Time-Out il n'y ait pas reallocation. +// En l'absence d'allocation, cet acces SQL peut etre omis, quitte a +// recalculer le nouveau numero si une autre occurrence est rencontree +// a la reprise. Pas dramatique. + +// http://doc.spip.org/@importe_translate_maj +function importe_translate_maj($k, $v) +{ + global $trans; + if (!(isset($trans[$k]) AND isset($trans[$k][$v]))) return $v; + list($g, $titre, $ajout) = $trans[$k][$v]; + if ($g <= 0) { + $f = 'import_identifie_parent_' . $k; + if (function_exists($f)) { + $g = $f($g, $titre, $v); + if ($g > 0) + // memoriser qu'on insere + $trans[$k][$v][2]=1; + else $g = (0-$g); + $trans[$k][$v][0] = $g; + } else spip_log("$f manquante"); + } + return $g; +} + +define('_RACCOURCI_MODELE_ALL', '@' . _RACCOURCI_MODELE .'@isS'); + +// http://doc.spip.org/@importe_raccourci +function importe_raccourci($v) +{ + if (preg_match_all(_RACCOURCI_LIEN, $v, $m, PREG_SET_ORDER)) { + foreach ($m as $regs) { + // supprimer 'http://' ou 'mailto:' + $lien = vider_url($regs[count($regs)-1]); + if ($match = typer_raccourci($lien)) { + list($f,$objet,$id,$params,$ancre) = $match; + $k = 'id_' . $f; + $g = importe_translate_maj($k, $id); + if ($g != $id) { + + $rac = '[' . $regs[1] . '->' . $regs[2] . $objet . $g . $params . $ancre .']'; + $v = str_replace($regs[0], $rac, $v); + } + } + } + } + + if (preg_match_all(_RACCOURCI_MODELE_ALL, $v, $m, PREG_SET_ORDER)) { + foreach ($m as $regs) { + $g = importe_translate_maj('id_document', $regs[3]); + if ($g != $regs[3]) { + $rac = '<' . $regs[2] . $g . $regs[4] . '>' . $regs[5]; + $v = str_replace($regs[0], $rac, $v); + } + } + } + return $v; +} + +// un document importe est considere comme identique a un document local +// s'ils ont meme taille et meme nom et que le present n'est pas detruit +// Et ne pas importer les incoherences (docs sans extension) +// http://doc.spip.org/@import_identifie_id_document +function import_identifie_id_document($values, $table, $desc, $request) { + if (!$values['extension']) return false; + $t = $values['taille']; + $f = $values['fichier']; + $h = $request['url_site'] . $f; + $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) . ')'); + if (!$r) return false; + if (($r['distant'] != 'oui') + AND !file_exists(_DIR_IMG . $r['titre'])) + return false; + return array($r['id'], $r['titre']); +} + +// un type de document importe est considere comme identique a un type present +// s'ils ont meme extension et meme titre +// Sinon il ne sera PAS importe +// http://doc.spip.org/@import_identifie_id_type +function import_identifie_id_type($values, $table, $desc, $request) { + $e = $values['extension']; + $t = $values['titre']; + $r = sql_fetsel("id_type AS id, titre", "spip_types_documents", "extension=" . sql_quote($e) . " AND titre=" . sql_quote($t)); + return $r ? array($r['id'], $r['titre']) : false; +} + +// deux groupes de mots ne peuvent avoir le meme titre ==> identification +// http://doc.spip.org/@import_identifie_id_groupe +function import_identifie_id_groupe($values, $table, $desc, $request) { + $r = sql_fetsel("id_groupe AS id, titre", "spip_groupes_mots", "titre=" . sql_quote($values['titre'])); + return $r ? array($r['id'], $r['titre']) : false; +} + +// pour un mot le titre est insuffisant, il faut aussi l'identite du groupe. +// Memoriser ces 2 infos et le signaler a import_translate grace a 1 negatif +// http://doc.spip.org/@import_identifie_id_mot +function import_identifie_id_mot($values, $table, $desc, $request) { + return array((0 - $values['id_groupe']), $values['titre']); +} + +// Passe 2: mot de meme titre et de meme groupe ==> identification +// http://doc.spip.org/@import_identifie_parent_id_mot +function import_identifie_parent_id_mot($id_groupe, $titre, $v) +{ + global $trans; + $titre = sql_quote($titre); + $id_groupe = 0-$id_groupe; + if (isset($trans['id_groupe']) + AND isset($trans['id_groupe'][$id_groupe])) { + $new = $trans['id_groupe'][$id_groupe][0]; + $r = sql_fetsel("id_mot", "spip_mots", "titre=$titre AND id_groupe=$new" ); + if ($r) return (0 - $r['id_mot']); + } + if ($r = sql_insertq('spip_mots')) + sql_replace('spip_translate', array( + 'id_old' => $v, + 'id_new' => $r, + 'titre' => $titre, + 'type' => 'id_mot', + 'ajout' => 1)); + else spip_log("Impossible d'inserer dans spip_mots"); + return $r; +} + +// idem pour les articles +// http://doc.spip.org/@import_identifie_id_article +function import_identifie_id_article($values, $table, $desc, $request) { + return array((0 - $values['id_rubrique']), $values['titre']); +} + +// Passe 2 des articles comme pour les mots + +// http://doc.spip.org/@import_identifie_parent_id_article +function import_identifie_parent_id_article($id_parent, $titre, $v) +{ + $id_parent = importe_translate_maj('id_rubrique', (0 - $id_parent)); + + $titre = sql_quote($titre); + $r = sql_fetsel("id_article", "spip_articles", "titre=$titre AND id_rubrique=$id_parent AND statut<>'poubelle'" ); + if ($r) return (0 - $r['id_article']); + + if ($r = sql_insertq('spip_articles')) + sql_replace('spip_translate', array( + 'id_old' => $v, + 'id_new' => $r, + 'titre' => $titre, + 'type' => 'id_article', + 'ajout' => 1), + $GLOBALS['tables_principales']['spip_translate'] + ); + else spip_log("Impossible d'inserer dans spip_articles"); + return $r; +} + +// idem pour les breves +// http://doc.spip.org/@import_identifie_id_breve +function import_identifie_id_breve($values, $table, $desc, $request) { + return array((0 - $values['id_rubrique']), $values['titre']); +} + +// Passe 2 des breves comme pour les mots + +// http://doc.spip.org/@import_identifie_parent_id_breve +function import_identifie_parent_id_breve($id_parent, $titre, $v) +{ + $id_parent = importe_translate_maj('id_rubrique', (0 - $id_parent)); + + $titre = sql_quote($titre); + $r = sql_fetsel("id_breve", "spip_breves", "titre=$titre AND id_rubrique=$id_parent AND statut<>'refuse'" ); + if ($r) return (0 - $r['id_breve']); + + if ($r = sql_insertq('spip_breves')) + sql_replace('spip_translate', array( + 'id_old' => $v, + 'id_new' => $r, + 'titre' => $titre, + 'type' => 'id_breve', + 'ajout' => 1), + $GLOBALS['tables_principales']['spip_translate'] + ); + else spip_log("Impossible d'inserer dans spip_breves"); + return $r; +} + + +// pour une rubrique le titre est insuffisant, il faut l'identite du parent +// Memoriser ces 2 infos et le signaler a import_translate grace a 1 negatif +// http://doc.spip.org/@import_identifie_id_rubrique +function import_identifie_id_rubrique($values, $table, $desc, $request) { + return array((0 - $values['id_parent']), $values['titre']); +} + +// Passe 2 des rubriques, renumerotation en cascade. +// rubrique de meme titre et de meme parent ==> identification +// http://doc.spip.org/@import_identifie_parent_id_rubrique +function import_identifie_parent_id_rubrique($id_parent, $titre, $v) +{ + global $trans; + if (isset($trans['id_rubrique'])) { + if ($id_parent < 0) { + $id_parent = (0 - $id_parent); + $gparent = $trans['id_rubrique'][$id_parent][0]; + // parent deja renumerote depuis le debut la passe 2 + if ($gparent >= 0) + $id_parent = $gparent; + else { + // premiere occurrence du parent + $pitre = $trans['id_rubrique'][$id_parent][1]; + $n = import_identifie_parent_id_rubrique($gparent, $pitre, $id_parent); + $trans['id_rubrique'][$id_parent][0] = ($n>0) ? $n: (0-$n); + // parent tout neuf, + // pas la peine de chercher un titre homonyme + if ($n > 0) { + $trans['id_rubrique'][$id_parent][2]=1; // nouvelle rub. + return import_alloue_id_rubrique($n, $titre, $v); + } else $id_parent = (0 - $n); + } + } + + $r = sql_fetsel("id_rubrique", "spip_rubriques", "titre=" . sql_quote($titre) . " AND id_parent=" . intval($id_parent)); + if ($r) { + return (0 - $r['id_rubrique']); + } + return import_alloue_id_rubrique($id_parent, $titre, $v); + } +} + +// reserver la place en mettant titre et parent tout de suite +// pour que le SELECT ci-dessus fonctionne a la prochaine occurrence + +// http://doc.spip.org/@import_alloue_id_rubrique +function import_alloue_id_rubrique($id_parent, $titre, $v) { + if ($r = sql_insertq('spip_rubriques', array('titre' => $titre, id_parent => $id_parent))) + sql_replace('spip_translate', array( + 'id_old' => $v, + 'id_new' => $r, + 'titre' => $titre, + 'type' => 'id_rubrique', + 'ajout' => 1), + $GLOBALS['tables_principales']['spip_translate']); + else spip_log("Impossible d'inserer dans spip_rubriques"); + return $r; +} +?>