Bug 5914 : BuildUnimarchierarchies can go into an infinite loop Squashed commit of the following:

commit 58e18dfa4109fcdde3c71675ff07ed6aae86b258
Author: Henri-Damien LAURENT <henridamien.laurent@biblibre.com>
Date:   Tue May 18 16:54:49 2010 +0200

    Bug 5914 : followup BuildUnimarchierarchies fixing infinite loop

commit bbbcb7fcb0ff36eb8a072d9b0442996e71ebb247
Author: Henri-Damien LAURENT <henridamien.laurent@biblibre.com>
Date:   Tue May 18 13:11:44 2010 +0200

    Bug 5914 : BuildUnimarcHierarchies : Fixing infinite loop

    When referenced authority in 5XX$3 would be the same as the current authid, the script would get into infinite loop

    Conflicts solved: C4/AuthoritiesMarc.pm

commit 3581021997bc8965af807738c47d5fd27f2fd97f
Author: Henri-Damien LAURENT <henridamien.laurent@biblibre.com>
Date:   Wed Apr 7 15:15:59 2010 +0200

    Bug 5914 : BuildUnimarcHierarchies : Fixing infinite loop

    When referenced authority in 5XX$3 would be the same as the current authid, the script would get into infinite loop

Signed-off-by: Stéphane Delaune <stephane.delaune@biblibre.com>
Signed-off-by: Jonathan Druart <jonathan.druart@biblibre.com>
Signed-off-by: Chris Cormack <chrisc@catalyst.net.nz>
This commit is contained in:
Chris Cormack 2011-04-05 10:50:42 +02:00
parent 66de13af9a
commit 706a881b7f

View file

@ -1125,33 +1125,34 @@ sub BuildUnimarcHierarchies{
my $data = GetHeaderAuthority($authid);
if ($data->{'authtrees'} and not $force){
return $data->{'authtrees'};
} elsif ($data->{'authtrees'}){
$hierarchies=$data->{'authtrees'};
# } elsif ($data->{'authtrees'}){
# $hierarchies=$data->{'authtrees'};
} else {
my $record = GetAuthority($authid);
my $found;
if ($record){
foreach my $field ($record->field('550')){
if ($field->subfield('5') && $field->subfield('5') eq 'g'){
my $parentrecord = GetAuthority($field->subfield('3'));
my $localresult=$hierarchies;
my $trees;
$trees = BuildUnimarcHierarchies($field->subfield('3'));
my @trees;
if ($trees=~/;/){
@trees = split(/;/,$trees);
} else {
push @trees, $trees;
}
foreach (@trees){
$_.= ",$authid";
}
@globalresult = (@globalresult,@trees);
$found=1;
}
$hierarchies=join(";",@globalresult);
}
}
return unless $record;
foreach my $field ($record->field('5..')){
if ($field->subfield('5') && $field->subfield('5') eq 'g'){
my $subfauthid=_get_authid_subfield($field);
next if ($subfauthid eq $authid);
my $parentrecord = GetAuthority($subfauthid);
my $localresult=$hierarchies;
my $trees;
$trees = BuildUnimarcHierarchies($subfauthid);
my @trees;
if ($trees=~/;/){
@trees = split(/;/,$trees);
} else {
push @trees, $trees;
}
foreach (@trees){
$_.= ",$authid";
}
@globalresult = (@globalresult,@trees);
$found=1;
}
$hierarchies=join(";",@globalresult);
}
#Unless there is no ancestor, I am alone.
$hierarchies="$authid" unless ($hierarchies);
}
@ -1188,15 +1189,16 @@ sub BuildUnimarcHierarchy{
my $parents=""; my $children="";
my (@loopparents,@loopchildren);
foreach my $field ($record->field('5..')){
my $subfauthid=_get_authid_subfield($field);
if ($field->subfield('5') && $field->subfield('a')){
if ($field->subfield('5') eq 'h'){
push @loopchildren, { "childauthid"=>$subfauthid,"childvalue"=>$field->subfield('a')};
}elsif ($field->subfield('5') eq 'g'){
push @loopparents, { "parentauthid"=>$subfauthid,"parentvalue"=>$field->subfield('a')};
}
my $subfauthid=_get_authid_subfield($field);
if ($subfauthid && $field->subfield('5') && $field->subfield('a')){
if ($field->subfield('5') eq 'h'){
push @loopchildren, { "childauthid"=>$field->subfield('3'),"childvalue"=>$field->subfield('a')};
}
elsif ($field->subfield('5') eq 'g'){
push @loopparents, { "parentauthid"=>$field->subfield('3'),"parentvalue"=>$field->subfield('a')};
}
# brothers could get in there with an else
}
}
}
$cell{"ifparents"}=1 if (scalar(@loopparents)>0);
$cell{"ifchildren"}=1 if (scalar(@loopchildren)>0);