bug 2254 [1/3]: fixed GetAuthType(); avoid crash

Improved C4::AuthoritiesMarc::GetAuthType() so that
it returns either a hashref (if the authority type exists)
or undef (if it does not exist).  The same
accessor should not be used to either return a single
value or all values of a settings list.  Note that
all existing clients of GetAuthType are expecting
either a single hashref or undef; none of them
expected the arrayref that could be returned by
the previous version of the accessor.

When BiblioAddsAuthorities is ON, addbiblio.pl
now checks the return value of GetAuthType and
no longer crashes as follows if the MARC framework
specifies an invalid authority type for a given subfield:

Can't coerce array into hash at .../cataloging/addbiblio.pl line 738.

No documentation changes.

Signed-off-by: Joshua Ferraro <jmf@liblime.com>
This commit is contained in:
Galen Charlton 2008-06-25 11:30:01 -05:00 committed by Joshua Ferraro
parent 8894d28779
commit 98f638bb14
2 changed files with 13 additions and 17 deletions

View file

@ -698,14 +698,14 @@ sub GetAuthority {
=over 4
$result= &GetAuthType( $authtypecode)
If $authtypecode is not "" then
Returns hashref to authtypecode information
else
returns ref to array of hashref information of all Authtypes
$result = &GetAuthType($authtypecode)
=back
If the authority type specified by C<$authtypecode> exists,
returns a hashref of the type's fields. If the type
does not exist, returns undef.
=cut
sub GetAuthType {
@ -713,19 +713,14 @@ sub GetAuthType {
my $dbh=C4::Context->dbh;
my $sth;
if (defined $authtypecode){ # NOTE - in MARC21 framework, '' is a valid authority
# type
# type (FIXME but why?)
$sth=$dbh->prepare("select * from auth_types where authtypecode=?");
$sth->execute($authtypecode);
} else {
$sth=$dbh->prepare("select * from auth_types");
$sth->execute;
}
my $res=$sth->fetchall_arrayref({});
if (scalar(@$res)==1){
return $res->[0];
} else {
if (my $res = $sth->fetchrow_hashref) {
return $res;
}
}
return;
}

View file

@ -767,6 +767,7 @@ AND (authtypecode IS NOT NULL AND authtypecode<>\"\")|);
###NOTICE : This is only valid if a subfield is linked to one and only one authtypecode
###NOTICE : This can be a problem. We should also look into other types and rejected forms.
my $authtypedata=GetAuthType($data->{authtypecode});
next unless $authtypedata;
my $marcrecordauth=MARC::Record->new();
my $authfield=MARC::Field->new($authtypedata->{auth_tag_to_report},'','',"a"=>"".$field->subfield('a'));
map { $authfield->add_subfields($_->[0]=>$_->[1]) if ($_->[0]=~/[A-z]/ && $_->[0] ne "a" )} $field->subfields();