Bug 4108 Catch cases when GetMember is generating errors

Fixed two calls where new interface was not used
Arguably new syntax allows more options than we require but it was not catching
error cases (when 0 or undef is passed). It also can now be called in ways
which would validly return multiple hits but explicitly does not
(nor does calling code expect this)
This patch should quieten the flood of errors

Signed-off-by: Galen Charlton <gmcharlt@gmail.com>
This commit is contained in:
Colin Campbell 2010-02-04 18:22:48 +00:00 committed by Galen Charlton
parent f93ee104de
commit e321fc9184
3 changed files with 40 additions and 16 deletions

View File

@ -529,22 +529,44 @@ the C<borrowers> table in the Koha database.
#'
sub GetMember {
my ( %information ) = @_;
if (exists $information{borrowernumber} && !defined $information{borrowernumber}) {
#passing mysql's kohaadmin?? Makes no sense as a query
return;
}
my $dbh = C4::Context->dbh;
my $sth;
my $select = "
SELECT borrowers.*, categories.category_type, categories.description
FROM borrowers
LEFT JOIN categories on borrowers.categorycode=categories.categorycode
";
$select.=" WHERE ".join(" AND ",map {"$_ = ?"}keys %information);
$select=~s/AND $//;
my $select =
q{SELECT borrowers.*, categories.category_type, categories.description
FROM borrowers
LEFT JOIN categories on borrowers.categorycode=categories.categorycode WHERE };
my $more_p = 0;
my @values = ();
for (keys %information ) {
if ($more_p) {
$select .= ' AND ';
}
else {
$more_p++;
}
if (defined $information{$_}) {
$select .= "$_ = ?";
push @values, $information{$_};
}
else {
$select .= "$_ IS NULL";
}
}
$debug && warn $select, " ",values %information;
$sth = $dbh->prepare("$select");
my $sth = $dbh->prepare("$select");
$sth->execute(map{$information{$_}} keys %information);
my $data = $sth->fetchall_arrayref({});
return undef if (scalar(@$data)==0);
if (scalar(@$data)==1) {return $$data[0];}
($data) and return $data;
#FIXME interface to this routine now allows generation of a result set
#so whole array should be returned but bowhere in the current code expects this
if (@{$data} ) {
return $data->[0];
}
return;
}

View File

@ -188,7 +188,7 @@ sub hold_patron_name {
sub hold_patron_bcode {
my $self = shift or return;
my $borrowernumber = (@_ ? shift: $self->hold_patron_id()) or return;
my $holder = GetMember($borrowernumber, 'borrowernumber');
my $holder = GetMember(borrowernumber => $borrowernumber);
if ($holder) {
if ($holder->{cardnumber}) {
return $holder->{cardnumber};

View File

@ -67,6 +67,7 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
);
# budget
warn("LOGGED=$loggedinuser");
my $borrower= GetMember('borrowernumber' => $loggedinuser);
my ( $flags, $homebranch )= ($borrower->{'flags'},$borrower->{'branchcode'});
@ -147,7 +148,7 @@ foreach my $result (@results) {
my $r = GetBranchName( $result->{'budget_owner_id'} );
$result->{'budget_branchname'} = GetBranchName( $result->{'budget_branchcode'} );
my $member = GetMember( $result->{'budget_owner_id'} );
my $member = GetMember( borrowernumber => $result->{budget_owner_id} );
my $member_full = $member->{'firstname'} . ' ' . $member->{'surname'} if $member;
$result->{'budget_owner'} = $member_full;
@ -168,8 +169,9 @@ foreach my $result (@results) {
# my $spent_percent = ( $result->{'budget_spent'} / $result->{'budget_amount'} ) * 100;
# $result->{'budget_spent_percent'} = sprintf( "%00d", $spent_percent );
my $borrower = &GetMember( $result->{budget_owner_id} );
$result->{budget_owner_name} = $borrower->{'firstname'} . ' ' . $borrower->{'surname'} if $borrower;
if ($member) {
$result->{budget_owner_name} = $member->{'firstname'} . ' ' . $member->{'surname'};
}
push( @loop_budget, { %{$result}, toggle => $toggle++ % 2, } );
}