From 3576aff3fb835d1903d50f562c68d669b2d58be1 Mon Sep 17 00:00:00 2001 From: Marcel de Rooy Date: Mon, 19 Nov 2012 13:53:49 +0100 Subject: [PATCH] Bug 9105: Move Z3950 search code to Breeding module As a first step in realizing the goals of report 6536 (Z3950 Search improvements), this patch moves identical code in acquisition and cataloging to module level. A followup deals with formatting. Note that this patch should not change any behavior. Signed-off-by: Jonathan Druart I did not find any regression --- C4/Breeding.pm | 261 ++++++++++++++++++++++++++++++++++++- acqui/z3950_search.pl | 297 ++++++------------------------------------- cataloguing/z3950_search.pl | 265 ++++---------------------------------- 3 files changed, 323 insertions(+), 500 deletions(-) diff --git a/C4/Breeding.pm b/C4/Breeding.pm index 9dedc4d..85a1a89 100644 --- a/C4/Breeding.pm +++ b/C4/Breeding.pm @@ -33,7 +33,7 @@ BEGIN { $VERSION = 3.07.00.049; require Exporter; @ISA = qw(Exporter); - @EXPORT = qw(&ImportBreeding &BreedingSearch); + @EXPORT = qw(&ImportBreeding &BreedingSearch &Z3950Search); } =head1 NAME @@ -213,6 +213,265 @@ sub BreedingSearch { return($count, @results); } # sub breedingsearch + +=head2 Z3950Search + +Z3950Search($pars, $template); + +Parameters for Z3950 search are all passed via the $pars hash. It may contain isbn, title, author, dewey, subject, lccall, controlnumber, stdid, srchany. +Also it should contain an arrayref id that points to a list of id's of the z3950 targets to be queried (see z3950servers table). +This code is used in acqui/z3950_search and cataloging/z3950_search. +The second parameter $template is a Template object. The routine uses this parameter to store the found values into the template. + +=cut + +sub Z3950Search { + my ($pars, $template)= @_; + + my $dbh = C4::Context->dbh; + my @id= @{$pars->{id}}; + my $random= $pars->{random}; + my $page= $pars->{page}; + my $biblionumber= $pars->{biblionumber}; + + my $isbn= $pars->{isbn}; + my $issn= $pars->{issn}; + my $title= $pars->{title}; + my $author= $pars->{author}; + my $dewey= $pars->{dewey}; + my $subject= $pars->{subject}; + my $lccn= $pars->{lccn}; + my $lccall= $pars->{lccall}; + my $controlnumber= $pars->{controlnumber}; + + +my $show_next = 0; +my $total_pages = 0; + +my $noconnection; +my $attr = ''; +my $term; +my $host; +my $server; +my $database; +my $port; +my $marcdata; +my @encoding; +my @results; +my $count; +my $toggle; +my $record; +my $oldbiblio; +my $errmsg; +my @serverhost; +my @servername; +my @breeding_loop = (); + + + my @oConnection; + my @oResult; + my @errconn; + my $s = 0; + my $query; + my $nterms=0; + if ($isbn) { + $term=$isbn; + $query .= " \@attr 1=7 \@attr 5=1 \"$term\" "; + $nterms++; + } + if ($issn) { + $term=$issn; + $query .= " \@attr 1=8 \@attr 5=1 \"$term\" "; + $nterms++; + } + if ($title) { + utf8::decode($title); + $query .= " \@attr 1=4 \"$title\" "; + $nterms++; + } + if ($author) { + utf8::decode($author); + $query .= " \@attr 1=1003 \"$author\" "; + $nterms++; + } + if ($dewey) { + $query .= " \@attr 1=16 \"$dewey\" "; + $nterms++; + } + if ($subject) { + utf8::decode($subject); + $query .= " \@attr 1=21 \"$subject\" "; + $nterms++; + } + if ($lccn) { + $query .= " \@attr 1=9 $lccn "; + $nterms++; + } + if ($lccall) { + $query .= " \@attr 1=16 \@attr 2=3 \@attr 3=1 \@attr 4=1 \@attr 5=1 \@attr 6=1 \"$lccall\" "; + $nterms++; + } + if ($controlnumber) { + $query .= " \@attr 1=12 \"$controlnumber\" "; + $nterms++; + } +for my $i (1..$nterms-1) { + $query = "\@and " . $query; +} +warn "query ".$query if $DEBUG; + + foreach my $servid (@id) { + my $sth = $dbh->prepare("select * from z3950servers where id=?"); + $sth->execute($servid); + while ( $server = $sth->fetchrow_hashref ) { + warn "serverinfo ".join(':',%$server) if $DEBUG; + my $option1 = new ZOOM::Options(); + $option1->option( 'async' => 1 ); + $option1->option( 'elementSetName', 'F' ); + $option1->option( 'databaseName', $server->{db} ); + $option1->option( 'user', $server->{userid} ) if $server->{userid}; + $option1->option( 'password', $server->{password} ) + if $server->{password}; + $option1->option( 'preferredRecordSyntax', $server->{syntax} ); + $oConnection[$s] = create ZOOM::Connection($option1) + || $DEBUG + && warn( "" . $oConnection[$s]->errmsg() ); + warn( "server data", $server->{name}, $server->{port} ) if $DEBUG; + $oConnection[$s]->connect( $server->{host}, $server->{port} ) + || $DEBUG + && warn( "" . $oConnection[$s]->errmsg() ); + $serverhost[$s] = $server->{host}; + $servername[$s] = $server->{name}; + $encoding[$s] = ($server->{encoding}?$server->{encoding}:"iso-5426"); + $s++; + } ## while fetch + } # foreach + my $nremaining = $s; + my $firstresult = 1; + + for ( my $z = 0 ; $z < $s ; $z++ ) { + warn "doing the search" if $DEBUG; + $oResult[$z] = $oConnection[$z]->search_pqf($query) + || $DEBUG + && warn( "somthing went wrong: " . $oConnection[$s]->errmsg() ); + + # $oResult[$z] = $oConnection[$z]->search_pqf($query); + } + + warn "# nremaining = $nremaining\n" if $DEBUG; + + while ( $nremaining-- ) { + + my $k; + my $event; + while ( ( $k = ZOOM::event( \@oConnection ) ) != 0 ) { + $event = $oConnection[ $k - 1 ]->last_event(); + warn( "connection ", $k - 1, ": event $event (", + ZOOM::event_str($event), ")\n" ) + if $DEBUG; + last if $event == ZOOM::Event::ZEND; + } + + if ( $k != 0 ) { + $k--; + warn "event from $k server = ",$serverhost[$k] if $DEBUG; + my ( $error, $errmsg, $addinfo, $diagset ) = + $oConnection[$k]->error_x(); + if ($error) { + if ($error =~ m/^(10000|10007)$/ ) { + push(@errconn, {'server' => $serverhost[$k]}); + } + $DEBUG and warn "$k $serverhost[$k] error $query: $errmsg ($error) $addinfo\n"; + } + else { + my $numresults = $oResult[$k]->size(); + warn "numresults = $numresults" if $DEBUG; + my $i; + my $result = ''; + if ( $numresults > 0 and $numresults >= (($page-1)*20)) { + $show_next = 1 if $numresults >= ($page*20); + $total_pages = int($numresults/20)+1 if $total_pages < ($numresults/20); + for ($i = ($page-1)*20; $i < (($numresults < ($page*20)) ? $numresults : ($page*20)); $i++) { + my $rec = $oResult[$k]->record($i); + if ($rec) { + my $marcrecord; + $marcdata = $rec->raw(); + + my ($charset_result, $charset_errors); + ($marcrecord, $charset_result, $charset_errors) = + MarcToUTF8Record($marcdata, C4::Context->preference('marcflavour'), $encoding[$k]); +####WARNING records coming from Z3950 clients are in various character sets MARC8,UTF8,UNIMARC etc +## In HEAD i change everything to UTF-8 +# In rel2_2 i am not sure what encoding is so no character conversion is done here +##Add necessary encoding changes to here -TG + + # Normalize the record so it doesn't have separated diacritics + SetUTF8Flag($marcrecord); + + my $oldbiblio = TransformMarcToKoha( $dbh, $marcrecord, "" ); + $oldbiblio->{isbn} =~ s/ |-|\.//g if $oldbiblio->{isbn}; + # pad | and ( with spaces to allow line breaks in the HTML + $oldbiblio->{isbn} =~ s/\|/ \| /g if $oldbiblio->{isbn}; + $oldbiblio->{isbn} =~ s/\(/ \(/g if $oldbiblio->{isbn}; + + $oldbiblio->{issn} =~ s/ |-|\.//g if $oldbiblio->{issn}; + # pad | and ( with spaces to allow line breaks in the HTML + $oldbiblio->{issn} =~ s/\|/ \| /g if $oldbiblio->{issn}; + $oldbiblio->{issn} =~ s/\(/ \(/g if $oldbiblio->{issn}; + my ( + $notmarcrecord, $alreadyindb, $alreadyinfarm, + $imported, $breedingid + ) + = ImportBreeding( $marcdata, 2, $serverhost[$k], $encoding[$k], $random, 'z3950' ); + my %row_data; + $row_data{server} = $servername[$k]; + $row_data{isbn} = $oldbiblio->{isbn}; + $row_data{lccn} = $oldbiblio->{lccn}; + $row_data{title} = $oldbiblio->{title}; + $row_data{author} = $oldbiblio->{author}; + $row_data{breedingid} = $breedingid; + $row_data{biblionumber} = $biblionumber; + push( @breeding_loop, \%row_data ); + + } else { + push(@breeding_loop,{'server'=>$servername[$k],'title'=>join(': ',$oConnection[$k]->error_x()),'breedingid'=>-1,'biblionumber'=>-1}); + } # $rec + } # upto 5 results + } #$numresults + } + } # if $k !=0 + my $numberpending = $nremaining - 1; + + my @servers = (); + foreach my $id (@id) { + push(@servers,{id => $id}); + } + + $template->param( + breeding_loop => \@breeding_loop, + server => $servername[$k], + numberpending => $numberpending, + current_page => $page, + servers => \@servers, + total_pages => $total_pages, + ); + $template->param(show_nextbutton=>1) if $show_next; + $template->param(show_prevbutton=>1) if $page != 1; + + # print $template->output if $firstresult !=1; + $firstresult++; + + } # while nremaining + + $template->param( + breeding_loop => \@breeding_loop, + #server => $servername[$k], + numberpending => $nremaining > 0 ? $nremaining : 0, + errconn => \@errconn + ); + +} + 1; __END__ diff --git a/acqui/z3950_search.pl b/acqui/z3950_search.pl index 68cd0d6..e266b41 100755 --- a/acqui/z3950_search.pl +++ b/acqui/z3950_search.pl @@ -25,13 +25,13 @@ use CGI; use C4::Auth; use C4::Output; -use C4::Biblio; +#use C4::Biblio; use C4::Context; use C4::Breeding; use C4::Koha; -use C4::Charset; +#use C4::Charset; use C4::Bookseller qw/ GetBookSellerFromId /; -use ZOOM; +#use ZOOM; my $input = new CGI; my ( $template, $loggedinuser, $cookie ) = get_template_and_user( @@ -47,10 +47,8 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user( my $dbh = C4::Context->dbh; -my $error = $input->param('error'); -my $biblionumber = $input->param('biblionumber'); -$biblionumber = 0 unless $biblionumber; -my $frameworkcode = $input->param('frameworkcode'); +my $biblionumber = $input->param('biblionumber')||0; +my $frameworkcode = $input->param('frameworkcode')||''; my $title = $input->param('title'); my $author = $input->param('author'); my $isbn = $input->param('isbn'); @@ -60,40 +58,12 @@ my $lccall = $input->param('lccall'); my $subject = $input->param('subject'); my $dewey = $input->param('dewey'); my $controlnumber = $input->param('controlnumber'); -my $op = $input->param('op'); +my $op = $input->param('op')||''; my $booksellerid = $input->param('booksellerid'); my $basketno = $input->param('basketno'); my $page = $input->param('current_page') || 1; $page = $input->param('goto_page') if $input->param('changepage_goto'); -my $show_next = 0; -my $total_pages = 0; - -my $noconnection; -my $attr = ''; -my $term; -my $host; -my $server; -my $database; -my $port; -my $marcdata; -my @encoding; -my @results; -my $count; -my $toggle; -my $record; -my $oldbiblio; -my $errmsg; -my @serverhost; -my @servername; -my @breeding_loop = (); -my $random = $input->param('random'); -unless ($random) -{ # this var is not useful anymore just kept to keep rel2_2 compatibility - $random = rand(1000000000); -} - -my $DEBUG = $ENV{DEBUG} || 0; # if set to 1, many debug message are send on syslog. # get framework list my $frameworks = getframeworks; @@ -114,23 +84,19 @@ $template->param( frameworkcode => $frameworkcode, frameworkcodeloop => \@frameworkcodeloop, booksellerid => $booksellerid, basketno => $basketno, - name => $vendor->{'name'} + name => $vendor->{'name'}, + isbn => $isbn, + issn => $issn, + lccn => $lccn, + lccall => $lccall, + title => $title, + author => $author, + controlnumber=> $controlnumber, + biblionumber => $biblionumber, + dewey => $dewey, + subject => $subject, ); - -$template->param( - isbn => $isbn, - issn => $issn, - lccn => $lccn, - lccall => $lccall, - title => $title, - author => $author, - controlnumber=> $controlnumber, - biblionumber => $biblionumber, - dewey => $dewey, - subject => $subject, -); - if ( $op ne "do_search" ) { my $sth = $dbh->prepare("select id,host,name,checked from z3950servers order by host"); $sth->execute(); @@ -143,214 +109,27 @@ if ( $op ne "do_search" ) { exit; } - my @id = $input->param('id'); - - if ( not @id ) { - # empty server list -> report and exit - $template->param( emptyserverlist => 1 ); - output_html_with_http_headers $input, $cookie, $template->output; - exit; - } - - my @oConnection; - my @oResult; - my @errconn; - my $s = 0; - my $query; - my $nterms; - if ($isbn) { - $term=$isbn; - $query .= " \@attr 1=7 \@attr 5=1 \"$term\" "; - $nterms++; - } - if ($issn) { - $term=$issn; - $query .= " \@attr 1=8 \@attr 5=1 \"$term\" "; - $nterms++; - } - if ($title) { - utf8::decode($title); - $query .= " \@attr 1=4 \"$title\" "; - $nterms++; - } - if ($author) { - utf8::decode($author); - $query .= " \@attr 1=1003 \"$author\" "; - $nterms++; - } - if ($dewey) { - $query .= " \@attr 1=16 \"$dewey\" "; - $nterms++; - } - if ($subject) { - utf8::decode($subject); - $query .= " \@attr 1=21 \"$subject\" "; - $nterms++; - } - if ($lccn) { - $query .= " \@attr 1=9 $lccn "; - $nterms++; - } - if ($lccall) { - $query .= " \@attr 1=16 \@attr 2=3 \@attr 3=1 \@attr 4=1 \@attr 5=1 \@attr 6=1 \"$lccall\" "; - $nterms++; - } - if ($controlnumber) { - $query .= " \@attr 1=12 \"$controlnumber\" "; - $nterms++; - } -for my $i (1..$nterms-1) { - $query = "\@and " . $query; +my @id = $input->param('id'); +if (@id==0) { + $template->param( emptyserverlist => 1 ); + output_html_with_http_headers $input, $cookie, $template->output; + exit; } -warn "query ".$query if $DEBUG; - - foreach my $servid (@id) { - my $sth = $dbh->prepare("select * from z3950servers where id=?"); - $sth->execute($servid); - while ( $server = $sth->fetchrow_hashref ) { - warn "serverinfo ".join(':',%$server) if $DEBUG; - my $option1 = new ZOOM::Options(); - $option1->option( 'async' => 1 ); - $option1->option( 'elementSetName', 'F' ); - $option1->option( 'databaseName', $server->{db} ); - $option1->option( 'user', $server->{userid} ) if $server->{userid}; - $option1->option( 'password', $server->{password} ) - if $server->{password}; - $option1->option( 'preferredRecordSyntax', $server->{syntax} ); - $oConnection[$s] = create ZOOM::Connection($option1) - || $DEBUG - && warn( "" . $oConnection[$s]->errmsg() ); - warn( "server data", $server->{name}, $server->{port} ) if $DEBUG; - $oConnection[$s]->connect( $server->{host}, $server->{port} ) - || $DEBUG - && warn( "" . $oConnection[$s]->errmsg() ); - $serverhost[$s] = $server->{host}; - $servername[$s] = $server->{name}; - $encoding[$s] = ($server->{encoding}?$server->{encoding}:"iso-5426"); - $s++; - } ## while fetch - } # foreach - my $nremaining = $s; - my $firstresult = 1; - for ( my $z = 0 ; $z < $s ; $z++ ) { - warn "doing the search" if $DEBUG; - $oResult[$z] = $oConnection[$z]->search_pqf($query) - || $DEBUG - && warn( "somthing went wrong: " . $oConnection[$s]->errmsg() ); - - # $oResult[$z] = $oConnection[$z]->search_pqf($query); - } - - warn "# nremaining = $nremaining\n" if $DEBUG; - - while ( $nremaining-- ) { - - my $k; - my $event; - while ( ( $k = ZOOM::event( \@oConnection ) ) != 0 ) { - $event = $oConnection[ $k - 1 ]->last_event(); - warn( "connection ", $k - 1, ": event $event (", - ZOOM::event_str($event), ")\n" ) - if $DEBUG; - last if $event == ZOOM::Event::ZEND; - } - - if ( $k != 0 ) { - $k--; - warn "event from $k server = ",$serverhost[$k] if $DEBUG; - my ( $error, $errmsg, $addinfo, $diagset ) = - $oConnection[$k]->error_x(); - if ($error) { - if ($error =~ m/^(10000|10007)$/ ) { - push(@errconn, {'server' => $serverhost[$k]}); - } - $DEBUG and warn "$k $serverhost[$k] error $query: $errmsg ($error) $addinfo\n"; - } - else { - my $numresults = $oResult[$k]->size(); - warn "numresults = $numresults" if $DEBUG; - my $i; - my $result = ''; - if ( $numresults > 0 and $numresults >= (($page-1)*20)) { - $show_next = 1 if $numresults >= ($page*20); - $total_pages = int($numresults/20)+1 if $total_pages < ($numresults/20); - for ($i = ($page-1)*20; $i < (($numresults < ($page*20)) ? $numresults : ($page*20)); $i++) { - my $rec = $oResult[$k]->record($i); - if ($rec) { - my $marcrecord; - $marcdata = $rec->raw(); - - my ($charset_result, $charset_errors); - ($marcrecord, $charset_result, $charset_errors) = - MarcToUTF8Record($marcdata, C4::Context->preference('marcflavour'), $encoding[$k]); -####WARNING records coming from Z3950 clients are in various character sets MARC8,UTF8,UNIMARC etc -## In HEAD i change everything to UTF-8 -# In rel2_2 i am not sure what encoding is so no character conversion is done here -##Add necessary encoding changes to here -TG - - # Normalize the record so it doesn't have separated diacritics - SetUTF8Flag($marcrecord); - - my $oldbiblio = TransformMarcToKoha( $dbh, $marcrecord, "" ); - $oldbiblio->{isbn} =~ s/ |-|\.//g if $oldbiblio->{isbn}; - # pad | and ( with spaces to allow line breaks in the HTML - $oldbiblio->{isbn} =~ s/\|/ \| /g if $oldbiblio->{isbn}; - $oldbiblio->{isbn} =~ s/\(/ \(/g if $oldbiblio->{isbn}; - - $oldbiblio->{issn} =~ s/ |-|\.//g if $oldbiblio->{issn}; - # pad | and ( with spaces to allow line breaks in the HTML - $oldbiblio->{issn} =~ s/\|/ \| /g if $oldbiblio->{issn}; - $oldbiblio->{issn} =~ s/\(/ \(/g if $oldbiblio->{issn}; - my ( - $notmarcrecord, $alreadyindb, $alreadyinfarm, - $imported, $breedingid - ) - = ImportBreeding( $marcdata, 2, $serverhost[$k], $encoding[$k], $random, 'z3950' ); - my %row_data; - $row_data{server} = $servername[$k]; - $row_data{isbn} = $oldbiblio->{isbn}; - $row_data{lccn} = $oldbiblio->{lccn}; - $row_data{title} = $oldbiblio->{title}; - $row_data{author} = $oldbiblio->{author}; - $row_data{breedingid} = $breedingid; - $row_data{biblionumber} = $biblionumber; - push( @breeding_loop, \%row_data ); - - } else { - push(@breeding_loop,{'server'=>$servername[$k],'title'=>join(': ',$oConnection[$k]->error_x()),'breedingid'=>-1,'biblionumber'=>-1}); - } # $rec - } # upto 5 results - } #$numresults - } - } # if $k !=0 - my $numberpending = $nremaining - 1; - - my @servers = (); - foreach my $id (@id) { - push(@servers,{id => $id}); - } - - $template->param( - breeding_loop => \@breeding_loop, - server => $servername[$k], - numberpending => $numberpending, - current_page => $page, - servers => \@servers, - total_pages => $total_pages, - ); - $template->param(show_nextbutton=>1) if $show_next; - $template->param(show_prevbutton=>1) if $page != 1; - - # print $template->output if $firstresult !=1; - $firstresult++; - - } # while nremaining - -$template->param( -breeding_loop => \@breeding_loop, -#server => $servername[$k], -numberpending => $nremaining > 0 ? $nremaining : 0, -errconn => \@errconn -); +my $pars= { + random => $input->param('random') || rand(1000000000), + biblionumber => $biblionumber, + page => $page, + id => \@id, + isbn => $isbn, + title => $title, + author => $author, + dewey => $dewey, + subject => $subject, + lccall => $lccall, + controlnumber => $controlnumber, + stdid => 0, + srchany => 0, +}; +Z3950Search($pars, $template); output_html_with_http_headers $input, $cookie, $template->output; diff --git a/cataloguing/z3950_search.pl b/cataloguing/z3950_search.pl index fd4eff9..8bf5792 100755 --- a/cataloguing/z3950_search.pl +++ b/cataloguing/z3950_search.pl @@ -19,17 +19,17 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. use strict; -#use warnings; FIXME - Bug 2505 +use warnings; use CGI; use C4::Auth; use C4::Output; -use C4::Biblio; +#use C4::Biblio; use C4::Context; use C4::Breeding; use C4::Koha; -use C4::Charset; -use ZOOM; +#use C4::Charset; +#use ZOOM; my $input = new CGI; my $dbh = C4::Context->dbh; @@ -47,34 +47,10 @@ my $dewey = $input->param('dewey'); my $controlnumber = $input->param('controlnumber'); my $stdid = $input->param('stdid'); my $srchany = $input->param('srchany'); -my $random = $input->param('random') || rand(1000000000); # this var is not useful anymore just kept for rel2_2 compatibility -my $op = $input->param('op'); +my $op = $input->param('op')||''; my $page = $input->param('current_page') || 1; $page = $input->param('goto_page') if $input->param('changepage_goto'); -my $show_next = 0; -my $total_pages = 0; - -my $numberpending; -my $attr = ''; -my $term; -my $host; -my $server; -my $database; -my $port; -my $marcdata; -my @encoding; -my @results; -my $count; -my $record; -my $oldbiblio; -my $errmsg; -my @serverloop = (); -my @serverhost; -my @servername; -my @breeding_loop = (); - -my $DEBUG = 0; # if set to 1, many debug message are send on syslog. my ( $template, $loggedinuser, $cookie ) = get_template_and_user({ template_name => "cataloguing/z3950_search.tmpl", @@ -110,222 +86,31 @@ if ( $op ne "do_search" ) { opsearch => "search", ); output_html_with_http_headers $input, $cookie, $template->output; + exit; } -else { - my @id = $input->param('id'); - if ( not defined @id ) { +my @id = $input->param('id'); +if ( @id==0 ) { # empty server list -> report and exit $template->param( emptyserverlist => 1 ); output_html_with_http_headers $input, $cookie, $template->output; exit; - } - - my @oConnection; - my @oResult; - my @errconn; - my $s = 0; - my $query = ''; - my $nterms; - if ($isbn) { - $term=$isbn; - $query .= " \@attr 1=7 \@attr 5=1 \"$term\" "; - $nterms++; - } - if ($issn) { - $term=$issn; - $query .= " \@attr 1=8 \@attr 5=1 \"$term\" "; - $nterms++; - } - if ($title) { - utf8::decode($title); - $query .= " \@attr 1=4 \"$title\" "; - $nterms++; - } - if ($author) { - utf8::decode($author); - $query .= " \@attr 1=1003 \"$author\" "; - $nterms++; - } - if ($dewey) { - $query .= " \@attr 1=16 \"$dewey\" "; - $nterms++; - } - if ($subject) { - utf8::decode($subject); - $query .= " \@attr 1=21 \"$subject\" "; - $nterms++; - } - if ($lccn) { - $query .= " \@attr 1=9 $lccn "; - $nterms++; - } - if ($lccall) { - $query .= " \@attr 1=16 \@attr 2=3 \@attr 3=1 \@attr 4=1 \@attr 5=1 \@attr 6=1 \"$lccall\" "; - $nterms++; - } - if ($controlnumber) { - $query .= " \@attr 1=12 \"$controlnumber\" "; - $nterms++; - } - if ($stdid) { - $query .= " \@attr 1=1007 \"$stdid\" "; - $nterms++; - } - if ($srchany) { - $query .= " \@attr 1=1016 \"$srchany\" "; - $nterms++; - } -for my $i (1..$nterms-1) { - $query = "\@and " . $query; } -warn "query ".$query if $DEBUG; - - foreach my $servid (@id) { - my $sth = $dbh->prepare("SELECT * FROM z3950servers WHERE id=? ORDER BY rank, name"); - $sth->execute($servid); - while ( $server = $sth->fetchrow_hashref ) { - warn "serverinfo ".join(':',%$server) if $DEBUG; - my $option1 = new ZOOM::Options(); - $option1->option('async' => 1); - $option1->option('elementSetName', 'F'); - $option1->option('databaseName', $server->{db}); - $option1->option('user', $server->{userid} ) if $server->{userid}; - $option1->option('password', $server->{password}) if $server->{password}; - $option1->option('preferredRecordSyntax', $server->{syntax}); - $option1->option( 'timeout', $server->{timeout} ) if ($server->{timeout}); - $oConnection[$s] = create ZOOM::Connection($option1) - || $DEBUG - && warn( "" . $oConnection[$s]->errmsg() ); - warn( "server data", $server->{name}, $server->{port} ) if $DEBUG; - $oConnection[$s]->connect( $server->{host}, $server->{port} ) - || $DEBUG - && warn( "" . $oConnection[$s]->errmsg() ); - $serverhost[$s] = $server->{host}; - $servername[$s] = $server->{name}; - $encoding[$s] = ($server->{encoding}?$server->{encoding}:"iso-5426"); - $s++; - } ## while fetch - } # foreach - my $nremaining = $s; - my $firstresult = 1; - - for ( my $z = 0 ; $z < $s ; $z++ ) { - warn "doing the search" if $DEBUG; - $oResult[$z] = $oConnection[$z]->search_pqf($query) - || $DEBUG - && warn( "somthing went wrong: " . $oConnection[$s]->errmsg() ); - - # $oResult[$z] = $oConnection[$z]->search_pqf($query); - } - - AGAIN: - my $k; - my $event; - while ( ( $k = ZOOM::event( \@oConnection ) ) != 0 ) { - $event = $oConnection[ $k - 1 ]->last_event(); - warn( "connection ", $k - 1, ": event $event (", - ZOOM::event_str($event), ")\n" ) - if $DEBUG; - last if $event == ZOOM::Event::ZEND; - } - - if ( $k != 0 ) { - $k--; - warn $serverhost[$k] if $DEBUG; - my ( $error, $errmsg, $addinfo, $diagset ) = - $oConnection[$k]->error_x(); - if ($error) { - if ($error =~ m/^(10000|10007)$/ ) { - push(@errconn, {'server' => $serverhost[$k], 'error' => $error}); - } - $DEBUG and warn "$k $serverhost[$k] error $query: $errmsg ($error) $addinfo\n"; - } - else { - my $numresults = $oResult[$k]->size(); - my $i; - my $result = ''; - if ( $numresults > 0 and $numresults >= (($page-1)*20)) { - $show_next = 1 if $numresults >= ($page*20); - $total_pages = int($numresults/20)+1 if $total_pages < ($numresults/20); - for ($i = ($page-1)*20; $i < (($numresults < ($page*20)) ? $numresults : ($page*20)); $i++) { - my $rec = $oResult[$k]->record($i); - if ($rec) { - my $marcrecord; - $marcdata = $rec->raw(); - - my ($charset_result, $charset_errors); - ($marcrecord, $charset_result, $charset_errors) = - MarcToUTF8Record($marcdata, C4::Context->preference('marcflavour'), $encoding[$k]); -####WARNING records coming from Z3950 clients are in various character sets MARC8,UTF8,UNIMARC etc -## In HEAD i change everything to UTF-8 -# In rel2_2 i am not sure what encoding is so no character conversion is done here -##Add necessary encoding changes to here -TG - - # Normalize the record so it doesn't have separated diacritics - SetUTF8Flag($marcrecord); - - my $oldbiblio = TransformMarcToKoha( $dbh, $marcrecord, "" ); - $oldbiblio->{isbn} =~ s/ |-|\.//g if $oldbiblio->{isbn}; - # pad | and ( with spaces to allow line breaks in the HTML - $oldbiblio->{isbn} =~ s/\|/ \| /g if $oldbiblio->{isbn}; - $oldbiblio->{isbn} =~ s/\(/ \(/g if $oldbiblio->{isbn}; - - $oldbiblio->{issn} =~ s/ |-|\.//g if $oldbiblio->{issn}; - # pad | and ( with spaces to allow line breaks in the HTML - $oldbiblio->{issn} =~ s/\|/ \| /g if $oldbiblio->{issn}; - $oldbiblio->{issn} =~ s/\(/ \(/g if $oldbiblio->{issn}; - my ( - $notmarcrecord, $alreadyindb, $alreadyinfarm, - $imported, $breedingid - ) - = ImportBreeding( $marcdata, 2, $serverhost[$k], $encoding[$k], $random, 'z3950' ); - my %row_data; - $row_data{server} = $servername[$k]; - $row_data{isbn} = $oldbiblio->{isbn}; - $row_data{lccn} = $oldbiblio->{lccn}; - $row_data{title} = $oldbiblio->{title}; - $row_data{author} = $oldbiblio->{author}; - $row_data{date} = $oldbiblio->{copyrightdate}; - $row_data{edition} = $oldbiblio->{editionstatement}; - $row_data{breedingid} = $breedingid; - $row_data{biblionumber} = $biblionumber; - push( @breeding_loop, \%row_data ); - - } else { - push(@breeding_loop,{'server'=>$servername[$k],'title'=>join(': ',$oConnection[$k]->error_x()),'breedingid'=>-1,'biblionumber'=>-1}); - } # $rec - } - } #$numresults - } - } # if $k !=0 - $numberpending = $nremaining - 1; - - my @servers = (); - foreach my $id (@id) { - push(@servers,{id => $id}); - } - - $template->param( - breeding_loop => \@breeding_loop, - server => $servername[$k], - numberpending => $numberpending, - biblionumber => $biblionumber, - errconn => \@errconn, - current_page => $page, - servers => \@servers, - total_pages => $total_pages, - ); - $template->param(show_nextbutton=>1) if $show_next; - $template->param(show_prevbutton=>1) if $page != 1; - - output_html_with_http_headers $input, $cookie, $template->output if $numberpending == 0; - - # print $template->output if $firstresult !=1; - $firstresult++; - MAYBE_AGAIN: - if ( --$nremaining > 0 ) { - goto AGAIN; - } -} ## if op=search +my $pars= { + random => $input->param('random') || rand(1000000000), + biblionumber => $biblionumber, + page => $page, + id => \@id, + isbn => $isbn, + title => $title, + author => $author, + dewey => $dewey, + subject => $subject, + lccall => $lccall, + controlnumber => $controlnumber, + stdid => 0, + srchany => 0, +}; +Z3950Search($pars, $template); +output_html_with_http_headers $input, $cookie, $template->output; -- 1.7.10.4