From 3bd0ff4faba9e76f8f501e24741b04899e0c8730 Mon Sep 17 00:00:00 2001 From: Peter Lorimer Date: Wed, 29 Jun 2011 15:52:54 +0100 Subject: [PATCH 2/2] Bug: 6539 - Used Business::ISBN to validate the ISBN intead of rolling my own Content-Type: text/plain; charset="utf-8" --- C4/Search.pm | 69 ++++++++++++++++++--------------------------------------- 1 files changed, 22 insertions(+), 47 deletions(-) diff --git a/C4/Search.pm b/C4/Search.pm index be96946..5648faa 100644 --- a/C4/Search.pm +++ b/C4/Search.pm @@ -33,7 +33,7 @@ use C4::Debug; use C4::Items; use YAML; use URI::Escape; -use POSIX; +use Business::ISBN; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $DEBUG); @@ -1424,7 +1424,15 @@ sub searchResults { #find branchname #get branch information..... my %branches; my $bsth =$dbh->prepare("SELECT branchcode,branchname FROM branches "); $bsth->execute(); while ( my $bdata = $bsth->fetchrow_hashref ) { $branches{ $bdata->{'branchcode'} } = $bdata->{'branchname'}; @@ -1687,6 +1695,16 @@ sub searchResults { $item_in_transit_count++ if $transfertwhen ne ''; $item_onhold_count++ if $reservestatus eq 'Waiting'; $item->{status} = $item->{wthdrawn} . "-" . $item->{itemlost} . "-" . $item->{damaged} . "-" . $item->{notforloan}; # can place hold on item ? if ((!$item->{damaged} || C4::Context->preference('AllowHoldsOnDamagedItems')) && !$item->{itemlost} && !$item->{withdrawn} ) { $can_place_holds = 1; } $other_count++; my $key = $prefix . $item->{status}; @@ -2596,9 +2614,9 @@ $template->param ( MYLOOP => C4::Search::z3950_search_args($searchscalar) ) sub z3950_search_args { my $bibrec = shift; - + my $isbn = Business::ISBN->new($bibrec); - if (validate_isbn($bibrec) == 1) + if (defined $isbn && $isbn->is_valid) { $bibrec = { isbn => $bibrec } if !ref $bibrec; } @@ -2644,51 +2662,8 @@ OR adds a new authority record =cut -=head -BOOL validate_isbn($isbn_number) -This function validates an isbn number by: -1. Checking it is 10 or 13 characters long -2. If it is 10 characters long, checks the lasd character is an 'X' and all other characters are digits -3. If it is 13 characters long, checks it begins with '97' and all other characters are digits - -=cut -sub validate_isbn { - my $isbn = shift; - - # Handle ISBNs with spaces or hyphens in them - $isbn =~ s/\s+//g; - $isbn =~ s/\-//g; - - # Is it the correct length ? - if (length($isbn) != 10 && length($isbn) != 13) - { return 0; } - else { - - # Is the last char 'x' for ISBN10 ? - my @chars = split('', $isbn); - if (length($isbn) == 10 && uc($chars[9]) eq 'X') - { - # Are all but the last characters digits ? - if (isdigit(substr($isbn,0,length($isbn)-1)) ) - { return 1;} - } - - # Is it 13 chars long and begin with '97' ? - if ( ($chars[0] eq '9' && $chars[1] eq '7') && length($isbn) == 13) - { - # is it made up of digits? - if (isdigit($isbn)) - { return 1;} - - - } - - } - # If this function has not yet successfully returned the return failure - return 0; -} sub BiblioAddAuthorities{ my ( $record, $frameworkcode ) = @_; -- 1.7.4.1