[Koha-cvs] koha/z3950 search.pl [dev_week]

Tumer Garip tgarip at neu.edu.tr
Fri Nov 3 01:29:49 CET 2006


CVSROOT:	/sources/koha
Module name:	koha
Branch:		dev_week
Changes by:	Tumer Garip <tgarip1957>	06/11/03 00:29:49

Modified files:
	z3950          : search.pl 

Log message:
	A new Z3950 client search using asynchronous ZOOM. It eliminates the necessity to run any z3950 deamons.
	The servers to search can be changed at search time by the cataloguer.
	This module makes KOHA fully Windows platform compatible.
	The results template needs improvement

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/koha/z3950/search.pl?cvsroot=koha&only_with_tag=dev_week&r1=1.3.2.6&r2=1.3.2.6.2.1

Patches:
Index: search.pl
===================================================================
RCS file: /sources/koha/koha/z3950/search.pl,v
retrieving revision 1.3.2.6
retrieving revision 1.3.2.6.2.1
diff -u -b -r1.3.2.6 -r1.3.2.6.2.1
--- search.pl	18 Feb 2006 10:06:42 -0000	1.3.2.6
+++ search.pl	3 Nov 2006 00:29:49 -0000	1.3.2.6.2.1
@@ -1,5 +1,5 @@
 #!/usr/bin/perl
-
+# This is a completely new Z3950 clients search using async ZOOM -TG 02/11/06
 # Copyright 2000-2002 Katipo Communications
 #
 # This file is part of Koha.
@@ -19,69 +19,172 @@
 
 use strict;
 use CGI;
+
 use C4::Auth;
 use C4::Output;
 use C4::Interface::CGI::Output;
 use C4::Biblio;
 use C4::Context;
-use C4::Koha; # XXX subfield_is_koha_internal_p
-use C4::Z3950;
-use C4::Search;
 use C4::Breeding;
-use HTML::Template;
 use MARC::File::USMARC;
-
-use vars qw( $tagslib );
-use vars qw( $is_a_modif );
-
+use ZOOM;
 
 my $input = new CGI;
 my $dbh = C4::Context->dbh;
 my $error = $input->param('error');
-my $bibid=$input->param('bibid');
+my $oldbiblionumber=$input->param('oldbiblionumber');
+$oldbiblionumber=0 unless $oldbiblionumber;
 my $title = $input->param('title');
 my $author = $input->param('author');
 my $isbn = $input->param('isbn');
 my $issn = $input->param('issn');
 my $random = $input->param('random');
+my $op=$input->param('op');
+my $noconnection;
+my $numberpending;
+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 $biblionumber;
-if ($bibid > 0) {
-	$record = MARCgetbiblio($dbh,$bibid);
-	$biblionumber=MARCfind_oldbiblionumber_from_MARCbibid($dbh,$bibid);
-}
-
+my $oldbiblio;
+my $dbh = C4::Context->dbh;
 my $errmsg;
-unless ($random) { # if random is a parameter => we're just waiting for the search to end, it's a refresh.
-	if ($isbn) {
-		$random =rand(1000000000);
-		$errmsg = addz3950queue($isbn, "isbn", $random, 'CHECKED');
-	} elsif ($author) {
-		$random =rand(1000000000);
-		$errmsg = addz3950queue($author, "author", $random, 'CHECKED');
-	} elsif ($title) {
-		$random =rand(1000000000);
-		$errmsg = addz3950queue($title, "title", $random, 'CHECKED');
-	}
+my @serverloop=();
+my @serverhost;
+my @breeding_loop = ();
+
+unless ($random) { # this var is not useful anymore just kept to keep rel2_2 compatibility
+$random =rand(1000000000);
 }
-my ($template, $loggedinuser, $cookie)
-= get_template_and_user({template_name => "z3950/searchresult.tmpl",
+
+
+my ($template, $loggedinuser, $cookie)= get_template_and_user({template_name => "z3950/searchresult.tmpl",
 				query => $input,
 				type => "intranet",
-				authnotrequired => 0,
+				authnotrequired => 1,
 				flagsrequired => {catalogue => 1},
 				debug => 1,
 				});
 
-# fill with books in breeding farm
-($count, @results) = BreedingSearch($title,$isbn,$random);
-my $numberpending= &checkz3950searchdone($random);
-my @breeding_loop = ();
-for (my $i=0; $i <= $#results; $i++) {
+		$template->param(	intranetcolorstylesheet => C4::Context->preference("intranetcolorstylesheet"),
+		intranetstylesheet => C4::Context->preference("intranetstylesheet"),
+		IntranetNav => C4::Context->preference("IntranetNav"));
+
+if ($op ne "do_search"){
+
+my $sth=$dbh->prepare("select id,host,checked from z3950servers  order by host");
+$sth->execute();
+while ($server=$sth->fetchrow_hashref) {
+my %temploop;
+$temploop{server}=$server->{host};
+$temploop{id}=$server->{id};
+$temploop{checked}=$server->{checked};
+push (@serverloop, \%temploop);
+}
+
+$template->param(isbn=>$isbn, issn=>$issn,title=>$title,author=>$author,
+						serverloop => \@serverloop,
+						opsearch => "search",
+						oldbiblionumber => $oldbiblionumber,
+						);
+output_html_with_http_headers $input, $cookie, $template->output;
+
+}else{
+
+my @id=$input->param('id');
+my @oConnection;
+my @oResult;
+my $s=0;
+							if ($isbn ne "/" || $issn ne "/") {
+								$attr='1=7';
+							$term=$isbn if ($isbn ne"/");
+							$term=$issn if ($issn ne"/");
+							} elsif ($title ne"/") {
+								$attr='1=4 @attr 4=1  ';
+							$term=$title;
+							} elsif ($author ne "/") {
+								$attr='1=1003';
+							$term=$author;
+							} 
+
+							
+my $query="\@attr $attr \"$term\"";	
+			
+  foreach my $servid ( @id){
+  my $sth=$dbh->prepare("select * from z3950servers where id=?");
+  $sth->execute($servid);
+
+    while ($server=$sth->fetchrow_hashref) {
+	my $noconnection=0;							
+	my $option1=new ZOOM::Options();
+	$option1->option(async=>1);
+	$option1->option('elementSetName', 'F');
+	$option1->option('databaseName',$server->{db})  ;
+	$option1->option('user',$server->{userid})  ;
+	$option1->option('password',$server->{password})  ;
+	$option1->option('preferredRecordSyntax', $server->{syntax});
+	 $oConnection[$s]=create ZOOM::Connection($option1);
+	$oConnection[$s]->connect($server->{name}, $server->{port});
+	$serverhost[$s]=$server->{host};
+	$encoding[$s]=$server->{syntax};
+	$s++;
+    }## while fetch
+
+  }# foreach
+my $nremaining = $s;
+my $firstresult=1;
+ for (my $z=0 ;$z<$s;$z++){
+$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");
+	last if $event == ZOOM::Event::ZEND;
+   }
+if ($k != 0) {
+	$k--;
+#warn $serverhost[$k];
+	 my($error, $errmsg, $addinfo, $diagset) = $oConnection[$k]->error_x();
+   	if ($error) {
+
+#	warn "$k $serverhost[$k] error $query: $errmsg ($error) $addinfo\n";
+	goto MAYBE_AGAIN;
+  	}
+	
+	my $numresults=$oResult[$k]->size() ;								
+ 									
+	my $i;
+	my $result='';
+ @breeding_loop = ();
+
+   if ($numresults>0){
+       for ($i=0; $i<(($numresults<5) ? ($numresults) : (5)) ; $i++) {
+			my $rec=$oResult[$k]->record($i); 										
+			my $marcrecord;
+			$marcdata = $rec->raw();											
+			$marcrecord = MARC::File::USMARC::decode($marcdata);
+####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
+								
+		my $oldbiblio = MARCmarc2koha($dbh,$marcrecord,"");
+				$oldbiblio->{isbn} =~ s/ |-|\.//g,
+			$oldbiblio->{issn} =~ s/ |-|\.//g,
+			
+my ($notmarcrecord,$alreadyindb,$alreadyinfarm,$imported,$bid)=ImportBreeding($marcdata,1,$serverhost[$k],$encoding[$k],$random);
 	my %row_data;
 	if ($i % 2) {
 		$toggle="#ffffcc";
@@ -89,26 +192,32 @@
 		$toggle="white";
 	}
 	$row_data{toggle} = $toggle;
-	$row_data{id} = $results[$i]->{'id'};
-	$row_data{isbn} = $results[$i]->{'isbn'};
-	$row_data{file} = $results[$i]->{'file'};
-	$row_data{title} = $results[$i]->{'title'};
-	$row_data{author} = $results[$i]->{'author'};
+	$row_data{server} = $serverhost[$k];
+	$row_data{isbn} = $oldbiblio->{isbn};
+
+	$row_data{title} =$oldbiblio->{title};
+	$row_data{author} = $oldbiblio->{author};
+	$row_data{id} = $bid;
+	$row_data{oldbiblionumber}=$oldbiblionumber;
 	push (@breeding_loop, \%row_data);
-}
 
-$template->param(isbn => $isbn,
-		title => $title,
-		author => $author,
-		breeding_loop => \@breeding_loop,
-		refresh => ($numberpending eq 0 ? "" : "search.pl?bibid=$bibid&random=$random"),
+
+         }# upto 5 results
+     }#$numresults
+}# if $k !=0
+
+
+$numberpending=$nremaining-1;
+				$template->param(breeding_loop => \@breeding_loop,server=>$serverhost[$k],
 		numberpending => $numberpending,
-		oldbiblionumber => $biblionumber,
-		intranetcolorstylesheet => C4::Context->preference("intranetcolorstylesheet"),
-		intranetstylesheet => C4::Context->preference("intranetstylesheet"),
-		IntranetNav => C4::Context->preference("IntranetNav"),
 		);
-print $input->header(
--type => guesstype($template->output),
--cookie => $cookie
-),$template->output;
+output_html_with_http_headers $input, "", $template->output if $firstresult==1;
+
+print  $template->output  if $firstresult !=1;
+$firstresult++;
+
+MAYBE_AGAIN:
+if (--$nremaining > 0) {
+    goto AGAIN;
+}
+} ## if op=search





More information about the Koha-cvs mailing list