15 # Running as root, switch privs
17 open PID, ">/var/run/processz3950queue.pid";
21 # Get real apacheuser from koha.conf or reparsing httpd.conf
22 my $apacheuser='paul';
24 unless ($uid = (getpwnam($apacheuser))[2]) {
25 die "Attempt to run daemon as non-existent or superuser\n";
30 my $dbh = C4::Context->dbh;
32 my $sth=$dbh->prepare("update z3950results set active=0");
36 $SIG{HUP}='checkqueue';
41 open PID, ">$logdir/processz3950queue.pid";
51 if ((time-$lastrun)>5) {
52 print "starting loop\n";
53 if ($checkqueue) { # everytime a SIG{HUP} is recieved
55 my $sth=$dbh->prepare("select id,term,type,servers from z3950queue order by id");
57 while (my ($id, $term, $type, $servers) = $sth->fetchrow) {
58 if ($forkcounter<12) {
60 my $stk=$dbh->prepare("select id,server,startdate,enddate,numrecords,active from z3950results where queryid=$id");
61 ($stk->execute) || (next);
64 my $sti=$dbh->prepare("update z3950queue set done=-1,startdate=$now where id=$id");
67 while (my ($r_id, $r_server,$r_startdate,$r_enddate,$r_numrecords,$active) = $stk->fetchrow) {
69 $serverdone{$r_server}=1;
71 $serverdone{$r_server}=1;
73 $serverdone{$r_server}=-1;
79 if ($type eq 'isbn') {
81 } elsif ($type eq 'title') {
83 } elsif ($type eq 'author') {
85 } elsif ($type eq 'lccn') {
87 } elsif ($type eq 'keyword') {
91 my $query="\@attr $attr $term";
94 my $stillprocessing=0;
96 foreach $serverinfo (split(/\s+/, $servers)) {
97 (next) if ($serverdone{$serverinfo} == 1);
98 my $stillprocessing=1;
102 my $dbi = C4::Context->dbh;
103 my ($name, $server, $database, $user, $password) = split(/\//, $serverinfo, 5);
105 $server=~/(.*)\:(\d+)/;
108 print "Processing $type=$term at $name $server $database (".($forkcounter+1)." forks)\n";
110 my $q_serverinfo=$dbi->quote($serverinfo);
112 if ($serverdone{$serverinfo}==-1) {
113 my $stj=$dbi->prepare("select id from z3950results where server=$q_serverinfo and queryid=$id");
115 ($resultsid) = $stj->fetchrow;
118 my $stj=$dbi->prepare("select id from z3950results where server=$q_serverinfo and queryid=$id");
120 ($resultsid) = $stj->fetchrow;
122 unless ($resultsid) {
123 $stj=$dbi->prepare("insert into z3950results (server, queryid, startdate) values ($q_serverinfo, $id, $now)");
125 $resultsid=$dbi->{'mysql_insertid'};
129 my $stj=$dbh->prepare("update z3950results set active=1 where id=$resultsid");
135 eval { $conn= new Net::Z3950::Connection($servername, $port, databaseName => $database, user => $user, password => $password); };
142 eval { $conn= new Net::Z3950::Connection($servername, $port, databaseName => $database); };
149 if ($noconnection || $error) {
150 warn "no connection at $globalname ";
152 eval { $conn->option(preferredRecordSyntax => Net::Z3950::RecordSyntax::USMARC);};
154 print "$globalname ERROR: $@\n";
157 my $rs=$conn->search($query);
159 my $numresults=$rs->size();
163 my $scantimerstart=time();
164 for ($i=1; $i<=(($numresults<80) ? ($numresults) : (80)); $i++) {
165 my $rec=$rs->record($i);
166 my $marcdata=$rec->render();
167 my $marcrecord = MARC::File::USMARC::decode($rec->render());
168 warn "$globalname ==> ".$marcrecord->as_formatted();
170 my ($notmarcrecord,$alreadyindb,$alreadyinfarm,$imported) = ImportBreeding($marcdata,1,"Z3950-$globalname");
172 my $scantimerend=time();
174 ($numresults<80) ? ($numrecords=$numresults) : ($numrecords=80);
175 my $elapsed=$scantimerend-$scantimerstart;
177 my $speed=int($numresults/$elapsed*100)/100;
178 print "$globalname SPEED: $speed $server done $numrecords\n";
180 my $q_result=$dbi->quote($result);
181 ($q_result) || ($q_result='""');
183 if ($numresults >0) {
184 my $task="update z3950results set numrecords=$numresults,numdownloaded=$numrecords,highestseen=0,results=$q_result,enddate=$now where id=$resultsid";
185 my $stj=$dbi->prepare($task);
187 } else { # no results...
188 my $task="update z3950results set numrecords=$numresults,numdownloaded=$numrecords,highestseen=0,results='',enddate=$now where id=$resultsid";
189 my $stj=$dbi->prepare($task);
193 while ($counter<60 && $numrecords<$numresults) {
195 my $stj=$dbi->prepare("select highestseen from z3950results where id=$resultsid");
197 my ($highestseen) = $stj->fetchrow;
198 if ($highestseen>($numrecords-30)) {
200 print " $server rescanning\n";
201 my $scantimerstart=time();
202 for ($i=$numrecords+1; $i<=(($numresults<($numrecords+40)) ? ($numresults) : ($numrecords+40)); $i++) {
203 my $rec=$rs->record($i);
204 my $marcdata=$rec->rawdata();
207 my $scantimerend=time();
208 ($numresults<$numrecords+40) ? ($numrecords=$numresults) : ($numrecords += 40);
209 my $elapsed=$scantimerend-$scantimerstart;
211 my $speed=int($numresults/$elapsed*100)/100;
212 print " SPEED: $speed $server done $numrecords\n";
215 my $q_result=$dbi->quote($result);
216 ($q_result) || ($q_result='""');
218 my $task="update z3950results set numdownloaded=$numrecords,results=$q_result where id=$resultsid";
219 my $stj=$dbi->prepare($task);
226 # FIXME - There's already a $stj in this scope
227 my $stj=$dbi->prepare("update z3950results set active=0 where id=$resultsid");
230 print " $server done.\n";
234 my $code=$conn->errcode();
235 my $msg=$conn->errmsg();
236 my $ai=$conn->addinfo();
246 unless ($stillprocessing) {
247 #my $sti=$dbh->prepare("select enddate from z3950queue where id=$id");
249 #my ($enddate) = $sti->fetchrow;