Changeset 74437 in spip-zone for _plugins_/fusion_spip


Ignore:
Timestamp:
Jul 23, 2013, 12:56:41 PM (6 years ago)
Author:
nicolas.dorigny@…
Message:

Modif : travailler uniquement sur une intersection des champs communs aux deux tables
Modif : dans la recherche de liens et de modèles, ne pas traiter les clés primaires composées

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/fusion_spip/trunk/inc/fusion_spip.php

    r73604 r74437  
    116116                }
    117117        }
    118 
     118        sort($erreurs);
    119119        return $erreurs;
    120120}
     
    132132
    133133        // liste des champs à recopier
    134         $champs_select = array_keys($shema['field']);
     134        // $champs_select = array_keys($shema['field']);
     135
     136        // on a déjà signalé par un warning que des champs manquaient dans la table source
     137        // on va travailler sur l'intersection des champs de la table source et hote
     138        $shema_source = sql_showtable($nom_table, false, $connect);
     139        $champs_select = array_intersect(array_keys($shema['field']), array_keys($shema_source['field']));
    135140
    136141        // Retrouve la clé primaire à partir du nom d'objet ou de table
     
    571576                $cle_primaire = id_table_objet($objet);
    572577
    573                 // selectionner les objets contenant des liens
    574                 $select = array();
    575                 $where = array();
    576                 foreach ($champs as $champ) {
    577                         $select[] = 'o.'.$champ;
    578                         $where[] = 'o.'.$champ.' regexp "\[.*\->('.join('|', array_keys($objets_liens)).')*[0-9]+\]"';
    579                 }
    580                 $select = join(', ', $select);
    581                 $where = join(' or ', $where);
    582                 $objets_import = sql_allfetsel(
    583                         'o.'.$cle_primaire.', '.$select,
    584                         'spip_fusion_spip a join '.$table.' o on (a.id_final = o.'.$cle_primaire.' and a.objet="'.$objet.'" and a.site_origine='._q($connect).')',
    585                         $where
    586                 );
    587 
    588                 foreach ($objets_import as $obj_import) {
    589                         $update_array = array();
     578                // uniquement pour les clés primaires simples
     579                if(strpos($cle_primaire,',')===false){
     580
     581                        // selectionner les objets contenant des liens
     582                        $select = array();
     583                        $where = array();
    590584                        foreach ($champs as $champ) {
    591                                 // recenser tous les liens dans le champ
    592                                 $nb_liens = preg_match_all('/\[([^][]*?([[]\w*[]][^][]*)*)->(>?)([^]]*)\]/msS', $obj_import[$champ], $liens_trouves, PREG_SET_ORDER);
    593                                 if ($nb_liens) {
    594                                         // pour chaque lien trouvé, remplacer id_origine par id_final
    595                                         foreach ($liens_trouves as $lien_trouve) {
    596                                                 // extraire l'id du quatrieme motif du preg_matchall
    597                                                 $id_origine_lien = preg_replace('#[a-z]*#', '', $lien_trouve[4]);
    598                                                 $type_lien = preg_replace('#[0-9]*#', '', $lien_trouve[4]);
    599                                                 $objet_lien = $objets_liens[$type_lien];
    600                                                 $nouveau_id = sql_fetsel('id_final', 'spip_fusion_spip', 'id_origine='._q($id_origine_lien).' and objet="'.$objet_lien.'" and site_origine="'.$connect.'"');
    601                                                 if ($nouveau_id['id_final']) {
    602                                                         $pattern_cherche = '#\[([^][]*?([[]\w*[]][^][]*)*)->'.$type_lien.$id_origine_lien.'\]#';
    603                                                         // ajouter une signature pour éviter les remplacements en cascade
    604                                                         $pattern_remplace = '[$1->__final__'.$type_lien.$nouveau_id['id_final'].']';
    605                                                         $obj_import[$champ] = preg_replace($pattern_cherche, $pattern_remplace, $obj_import[$champ]);
     585                                $select[] = 'o.'.$champ;
     586                                $where[] = 'o.'.$champ.' regexp "\[.*\->('.join('|', array_keys($objets_liens)).')*[0-9]+\]"';
     587                        }
     588                        $select = join(', ', $select);
     589                        $where = join(' or ', $where);
     590                        $objets_import = sql_allfetsel(
     591                                'o.'.$cle_primaire.', '.$select,
     592                                'spip_fusion_spip a join '.$table.' o on (a.id_final = o.'.$cle_primaire.' and a.objet="'.$objet.'" and a.site_origine='._q($connect).')',
     593                                $where
     594                        );
     595
     596                        foreach ($objets_import as $obj_import) {
     597                                $update_array = array();
     598                                foreach ($champs as $champ) {
     599                                        // recenser tous les liens dans le champ
     600                                        $nb_liens = preg_match_all('/\[([^][]*?([[]\w*[]][^][]*)*)->(>?)([^]]*)\]/msS', $obj_import[$champ], $liens_trouves, PREG_SET_ORDER);
     601                                        if ($nb_liens) {
     602                                                // pour chaque lien trouvé, remplacer id_origine par id_final
     603                                                foreach ($liens_trouves as $lien_trouve) {
     604                                                        // extraire l'id du quatrieme motif du preg_matchall
     605                                                        $id_origine_lien = preg_replace('#[a-z]*#', '', $lien_trouve[4]);
     606                                                        $type_lien = preg_replace('#[0-9]*#', '', $lien_trouve[4]);
     607                                                        $objet_lien = $objets_liens[$type_lien];
     608                                                        $nouveau_id = sql_fetsel('id_final', 'spip_fusion_spip', 'id_origine='._q($id_origine_lien).' and objet="'.$objet_lien.'" and site_origine="'.$connect.'"');
     609                                                        if ($nouveau_id['id_final']) {
     610                                                                $pattern_cherche = '#\[([^][]*?([[]\w*[]][^][]*)*)->'.$type_lien.$id_origine_lien.'\]#';
     611                                                                // ajouter une signature pour éviter les remplacements en cascade
     612                                                                $pattern_remplace = '[$1->__final__'.$type_lien.$nouveau_id['id_final'].']';
     613                                                                $obj_import[$champ] = preg_replace($pattern_cherche, $pattern_remplace, $obj_import[$champ]);
     614                                                        }
    606615                                                }
     616                                                $obj_import[$champ] = str_replace('__final__', '', $obj_import[$champ]);
     617                                                $update_array[$champ] = $obj_import[$champ];
    607618                                        }
    608                                         $obj_import[$champ] = str_replace('__final__', '', $obj_import[$champ]);
    609                                         $update_array[$champ] = $obj_import[$champ];
    610619                                }
    611                         }
    612                         if ($update_array) {
    613                                 sql_updateq($table, $update_array, $cle_primaire.'='._q($obj_import[$cle_primaire]));
    614                                 $objets_mis_a_jour++;
     620                                if ($update_array) {
     621                                        sql_updateq($table, $update_array, $cle_primaire.'='._q($obj_import[$cle_primaire]));
     622                                        $objets_mis_a_jour++;
     623                                }
    615624                        }
    616625                }
     
    650659                $cle_primaire = id_table_objet($objet);
    651660
    652                 // selectionner les objets contenant les modèles recherchés
    653                 $select = array();
    654                 $where = array();
    655                 foreach ($champs as $champ) {
    656                         $select[] = 'o.'.$champ;
    657                         $where[] = 'o.'.$champ.' regexp "<('.join('|', $modeles).')+[0-9]+"';
    658                 }
    659                 $select = join(', ', $select);
    660                 $where = join(' or ', $where);
    661 
    662                 $res = sql_select(
    663                         'o.'.$cle_primaire.', '.$select,
    664                         'spip_fusion_spip a join '.$table.' o on (a.id_final = o.'.$cle_primaire.' and a.objet="'.$objet.'" and a.site_origine='._q($connect).')',
    665                         $where
    666                 );
    667                 while ($obj_import = sql_fetch($res)) {
    668                         $update_array = array();
     661                // uniquement pour les clés primaires simples
     662                if(strpos($cle_primaire,',')===false){
     663                        // selectionner les objets contenant les modèles recherchés
     664                        $select = array();
     665                        $where = array();
    669666                        foreach ($champs as $champ) {
    670                                 // recenser tous les modèles dans le champ
    671                                 $nb_liens = preg_match_all('#<('.join('|', $modeles).'){1}([0-9]+)#', $obj_import[$champ], $liens_trouves, PREG_SET_ORDER);
    672                                 if ($nb_liens) {
    673                                         // pour chaque lien trouvé, le remplacer id_origine par id_final
    674                                         foreach ($liens_trouves as $lien_trouve) {
    675                                                 $id_origine_lien = $lien_trouve[2];
    676                                                 $modele = $lien_trouve[1];
    677                                                 $nouveau_id = sql_fetsel('id_final', 'spip_fusion_spip', 'id_origine='._q($id_origine_lien).' and objet="document" and site_origine="'.$connect.'"');
    678                                                 if ($nouveau_id['id_final']) {
    679                                                         $pattern_cherche = '#<'.$modele.$id_origine_lien.'#';
    680                                                         $pattern_remplace = '<'.$modele.$nouveau_id['id_final'];
    681                                                         $obj_import[$champ] = preg_replace($pattern_cherche, $pattern_remplace, $obj_import[$champ]);
     667                                $select[] = 'o.'.$champ;
     668                                $where[] = 'o.'.$champ.' regexp "<('.join('|', $modeles).')+[0-9]+"';
     669                        }
     670                        $select = join(', ', $select);
     671                        $where = join(' or ', $where);
     672
     673                        $res = sql_select(
     674                                'o.'.$cle_primaire.', '.$select,
     675                                'spip_fusion_spip a join '.$table.' o on (a.id_final = o.'.$cle_primaire.' and a.objet="'.$objet.'" and a.site_origine='._q($connect).')',
     676                                $where
     677                        );
     678                        while ($obj_import = sql_fetch($res)) {
     679                                $update_array = array();
     680                                foreach ($champs as $champ) {
     681                                        // recenser tous les modèles dans le champ
     682                                        $nb_liens = preg_match_all('#<('.join('|', $modeles).'){1}([0-9]+)#', $obj_import[$champ], $liens_trouves, PREG_SET_ORDER);
     683                                        if ($nb_liens) {
     684                                                // pour chaque lien trouvé, le remplacer id_origine par id_final
     685                                                foreach ($liens_trouves as $lien_trouve) {
     686                                                        $id_origine_lien = $lien_trouve[2];
     687                                                        $modele = $lien_trouve[1];
     688                                                        $nouveau_id = sql_fetsel('id_final', 'spip_fusion_spip', 'id_origine='._q($id_origine_lien).' and objet="document" and site_origine="'.$connect.'"');
     689                                                        if ($nouveau_id['id_final']) {
     690                                                                $pattern_cherche = '#<'.$modele.$id_origine_lien.'#';
     691                                                                $pattern_remplace = '<'.$modele.$nouveau_id['id_final'];
     692                                                                $obj_import[$champ] = preg_replace($pattern_cherche, $pattern_remplace, $obj_import[$champ]);
     693                                                        }
    682694                                                }
     695                                                $update_array[$champ] = $obj_import[$champ];
    683696                                        }
    684                                         $update_array[$champ] = $obj_import[$champ];
    685697                                }
    686                         }
    687                         if ($update_array) {
    688                                 sql_updateq($table, $update_array, $cle_primaire.'='._q($obj_import[$cle_primaire]));
    689                                 $objets_mis_a_jour++;
     698                                if ($update_array) {
     699                                        sql_updateq($table, $update_array, $cle_primaire.'='._q($obj_import[$cle_primaire]));
     700                                        $objets_mis_a_jour++;
     701                                }
    690702                        }
    691703                }
Note: See TracChangeset for help on using the changeset viewer.