[Koha-patches] [PATCH] Bug 5914 : BuildUnimarchierarchies can go into an infinite loop Squashed commit of the following:

Chris Cormack chrisc at catalyst.net.nz
Mon Mar 21 23:35:36 CET 2011


commit 58e18dfa4109fcdde3c71675ff07ed6aae86b258
Author: Henri-Damien LAURENT <henridamien.laurent at 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 at 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 at 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
---
 C4/AuthoritiesMarc.pm |   67 +++++++++++++++++++++++++-----------------------
 1 files changed, 35 insertions(+), 32 deletions(-)

diff --git a/C4/AuthoritiesMarc.pm b/C4/AuthoritiesMarc.pm
index f3cc948..56c377a 100644
--- a/C4/AuthoritiesMarc.pm
+++ b/C4/AuthoritiesMarc.pm
@@ -1123,33 +1123,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, at trees);
-			$found=1;
-		  }
-		  $hierarchies=join(";", at 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, at trees);
+        $found=1;
+      }
+      $hierarchies=join(";", at globalresult);
+    }
     #Unless there is no ancestor, I am alone.
     $hierarchies="$authid" unless ($hierarchies);
   }
@@ -1185,15 +1186,17 @@ sub BuildUnimarcHierarchy{
   my %cell;
   my $parents=""; my $children="";
   my (@loopparents, at loopchildren);
-  foreach my $field ($record->field('550')){
-    if ($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')};
-      }
+  foreach my $field ($record->field('5..')){
+      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);
-- 
1.7.1



More information about the Koha-patches mailing list