Daemon to process the queue of pending Z39.50 searches. I still need
[koha_gimpoz] / acqui.simple / processz3950queue
1 #!/usr/bin/perl
2 use C4::Database;
3 use DBI;
4 #use strict;
5 use C4::Acquisitions;
6 use C4::Output;
7 my $dbh=C4Connect;
8
9
10
11 while (1) {
12     my $sth=$dbh->prepare("select id,term,type,servers from z3950queue where
13     isnull(done) || done=-1");
14     $sth->execute;
15     while (my ($id, $term, $type, $servers) = $sth->fetchrow) {
16         my $now=time();
17         my $sti=$dbh->prepare("update z3950queue set done=-1,startdate=$now where id=$id");
18         $sti->execute;
19         my $attr='';
20         if ($type eq 'isbn') {
21             $attr='1=7';
22         } elsif ($type eq 'title') {
23             $attr='1=4';
24         } elsif ($type eq 'lccn') {
25             $attr='1=9';
26         }
27         $term='"'.$term.'"';
28         $query="f \@attr $attr $term";
29         my $totalrecords=0;
30         my $serverinfo;
31         foreach $serverinfo (split(/\s+/, $servers)) {
32             my ($name, $server, $database, $auth) = split(/\//, $serverinfo, 4);
33             ($auth eq '/') && ($auth='');
34             print "Processing $type=$term at $name $server $database $auth\n";
35             $now=time();
36             my $q_serverinfo=$dbh->quote($serverinfo);
37             my $sti=$dbh->prepare("insert into z3950results (server, queryid, startdate) values ($q_serverinfo, $id, $now)");
38             $sti->execute;
39             my $resultsid=$dbh->{'mysql_insertid'};
40             getrecord($server, $database, $query, $auth);
41             my $result=`cat yaz.mrc`;
42             unlink ('yaz.mrc');
43             my $splitchar=chr(29);
44             my @records=split(/$splitchar/, $result);
45             my $numrecords=$#records+1;
46             $totalrecords+=$numrecords;
47             my $q_result=$dbh->quote($result);
48             ($q_result) || ($q_result='""');
49             $now=time();
50             $sti=$dbh->prepare("update z3950results set numrecords=$numrecords,results=$q_result,enddate=$now where id=$resultsid");
51             $sti->execute;
52         }
53         $sti=$dbh->prepare("update z3950queue set done=1,numrecords=$totalrecords,enddate=$now where id=$id");
54         $sti->execute;
55     }
56     sleep 15;
57 }
58
59 sub getrecord {
60     my $server=shift;
61     my $base=shift;
62     my $query=shift;
63     my $auth=shift;
64     open  (M, "|yaz-client -m yaz.mrc >>yaz.out 2>>yaz.err");
65     select M;
66     $|=1;
67     select STDOUT;
68     ($auth) && ($auth="authentication $auth\n");
69     print << "EOF";
70 $auth\open $server
71 base $base
72 $query
73 s
74 s
75 s
76 s
77 s
78 s
79 s
80 s
81 s
82 s
83 quit
84 EOF
85     print M << "EOF";
86 $auth\open $server
87 base $base
88 $query
89 s
90 s
91 s
92 s
93 s
94 s
95 s
96 s
97 s
98 s
99 quit
100 EOF
101     close M;
102 }