referencias_reciprocas
#my $DEBUG=1;
use DBI;
use Data::Dumper;
our $dbh = DBI->connect('DBI:mysql:ri-intermedio','ri','ri') or die $DBI::errstr ;
my $recorrer_base = "SELECT * FROM todo ORDER BY nombre";
my $st_todo = $dbh->prepare($recorrer_base);
my %reciproco = (
"r_referente_de" => "r_referente",
"r_referente" => "r_referente_de",
"r_integrante_de" => "r_integrado_por",
"r_integrado_por" => "r_integrante_de",
"r_linea_accion_con" => "r_linea_accion_con",
"r_actividad_puntual_con" => "r_actividad_puntual_con",
"r_apoyo_de" => "r_apoyo_a",
"r_apoyo_a" => "r_apoyo_de",
"r_menciona_a" => "r_mencionado_en",
"r_mencionado_en" => "r_menciona_a",
);
my @rfields = (
"r_referente_de",
"r_referente",
"r_integrante_de",
"r_integrado_por",
"r_linea_accion_con",
"r_actividad_puntual_con",
"r_apoyo_de",
"r_apoyo_a",
"r_menciona_a",
"r_mencionado_en",
);
my %r_referente_de,
%r_referente,
%r_integrante_de,
%r_integrado_por,
%r_linea_accion_con,
%r_actividad_puntual_con,
%r_apoyo_de,
%r_apoyo_a,
%r_menciona_a,
%r_mencionado_en;
my $campo;
my $r_field;
my $query;
my $new_id;
my %actor;
my %actores;
my %actores_id;
my $actorref;
$st_todo->execute();
# me armo hashes para referencias cruzadas (para no estar haciendo mil queries a la base de datos)...
while ( $actorref = $st_todo->fetchrow_hashref ) {
%actor = %$actorref;
$nombre = $actor{nombre};
$old_id = $actor{id};
$new_id = $actor{new_id};
$actores{$nombre} = $new_id;
$actores_id{$new_id} = $nombre;
foreach $campo (@rfields) {
# si no hay nada, en el campo, lo ignoro
next unless $actor{$campo};
$ids = $actor{$campo};
$recip = $reciproco{$campo};
${$campo}{$new_id} .= "$ids,";
@destinos = split(/\s*,\s*/, $ids);
foreach $destino (@destinos) {
next unless $destino;
${$recip}{$destino} .= "$new_id,";
}
}
}
# limpiemos las referencias cruzadas
foreach $campo (@rfields) {
$DEBUG && print STDERR "$campo ==>" . Dumper(\{%$campo});
foreach $id (keys %$campo) {
$lista = ${$campo}{$id};
# saco las comas superfluas
$lista =~ s/,+/,/g;
$lista =~ s/,+/,/g;
# ordeno
@lista = sort {$a <=> $b} split(/,/, $lista);
# saco las repetidas
%aparecio=();
@lista_ok=();
foreach $elem (@lista){
push (@lista_ok, $elem) unless $aparecio{$elem}++;
}
${$campo}{$id} = join(",",@lista_ok);
}
}
# hago el mismo query nuevamente, pero ahora, para generar los updates necesarios
$st_todo->execute();
while ( $actorref = $st_todo->fetchrow_hashref ) {
%actor = %$actorref;
$nombre = $actor{nombre};
$old_id = $actor{id};
$new_id = $actor{new_id}; # este deberia estar ya cargado (en la vuelta anterior)
my $query = "";
my $coma = 0;
foreach $campo (@rfields) {
# si no hay nada para poner en el campo, lo ignoro
# no me fijo en lo que hay antes porque lo voy a pisar
# todo y aparte, si habia algo, seguro voy a tener
# que poner algo (al menos lo mismo)
next unless ${$campo}{$new_id};
$quoted = $dbh->quote(${$campo}{$new_id});
$query .= ($coma++?", ":"") . "$campo = $quoted";
}
next unless $query;
$query = "UPDATE todo SET $query WHERE new_id = $new_id";
print "$query;\n";
} ResponsabilidadSocialEmpresaria/CargaDeDatosEnDrupal/GeneradorDeReciprocos (última edición 2008-01-29 14:14:47 efectuada por localhost)