2 # script that starts the zebraquee
3 # Written by TG on 01/08/2006
10 use C4::AuthoritiesMarc;
13 ### ZEBRA SERVER UPDATER
14 ##Uses its own database handle
15 my $dbh=C4::Context->dbh;
16 my $readsth=$dbh->prepare("SELECT id,biblio_auth_number,operation,server FROM zebraqueue WHERE done=0");
17 #my $delsth=$dbh->prepare("delete from zebraqueue where id =?");
22 #my $wait=C4::Context->preference('zebrawait') || 120;
24 print "starting with verbose=$verbose\n" if $verbose;
26 my ($id,$biblionumber,$operation,$server,$marcxml);
29 while (($id,$biblionumber,$operation,$server)=$readsth->fetchrow){
30 print "read in queue : $id : biblio $biblionumber for $operation on $server\n" if $verbose;
33 # if the operation is a deletion, zebra requires that we give it the xml.
34 # as it is no more in the SQL db, retrieve it from zebra itself.
35 # may sound silly, but that's the way zebra works ;-)
36 if ($operation =~ /delete/) {
37 # 1st read the record in zebra
38 my $Zconn=C4::Context->Zconn($server, 0, 1,'','xml');
39 my $query = $Zconn->search_pqf( '@attr 1=Local-Number '.$biblionumber);
40 # then, delete the record
41 $ok=zebrado($query->record(0)->render(),$operation,$server,$biblionumber);
42 # if it's an add or a modif
45 if ($server eq "biblioserver") {
46 my $marc = GetMarcBiblio($biblionumber);
47 $marcxml = $marc->as_xml_record() if $marc;
48 } elsif ($server eq "authorityserver") {
49 $marcxml =C4::AuthoritiesMarc::GetAuthorityXML($biblionumber);
53 print "XML read : $marcxml\n" if $verbose >1;
55 # workaround for zebra bug needing a XML even for deletion
57 print "unable to read MARCxml\n" if $verbose;
60 # check it's XML, just in case
62 my $hashed=XMLin($marcxml);
63 }; ### is it a proper xml? broken xml may crash ZEBRA- slow but safe
64 ## it's Broken XML-- Should not reach here-- but if it does -lets protect ZEBRA
67 my $delsth=$dbh->prepare("UPDATE zebraqueue SET done=1 WHERE id =?");
68 $delsth->execute($id);
71 # ok, we have everything, do the operation in zebra !
72 $ok=zebrado($marcxml,$operation,$server);
75 print "ZEBRAopserver returned : $ok \n" if $verbose;
77 $dbh=C4::Context->dbh;
79 # if it's a deletion, we can delete every request on this biblio : in case the user
80 # did a modif (or item deletion) just before biblio deletion, there are some specialUpdage
81 # that are pending and can't succeed, as we don't have the XML anymore
82 # so, delete everything for this biblionumber
83 if ($operation eq 'delete_record') {
84 print "deleting biblio deletion $biblionumber\n" if $verbose;
85 $delsth =$dbh->prepare("UPDATE zebraqueue SET done=1 WHERE biblio_auth_number =?");
86 $delsth->execute($biblionumber);
87 # if it's not a deletion, delete every pending specialUpdate for this biblionumber
88 # in case the user add biblio, then X items, before this script runs
89 # this avoid indexing X+1 times where just 1 is enough.
91 print "deleting special date for $biblionumber\n" if $verbose;
92 $delsth =$dbh->prepare("UPDATE zebraqueue SET done=1 WHERE biblio_auth_number =? and operation='specialUpdate'");
93 $delsth->execute($biblionumber);
100 ###Accepts a $server variable thus we can use it to update biblios, authorities or other zebra dbs
101 my ($record,$op,$server,$biblionumber)=@_;
108 # $record=Encode::encode("UTF-8",$record);
109 my $shadow=$server."shadow";
110 $op = 'recordDelete' if $op eq 'delete_record';
113 my $Zconn=C4::Context->Zconn($server, 0, 1);
115 print "updating $op on $biblionumber for server $server\n $record\n" if $verbose;
116 my $Zpackage = $Zconn->package();
117 $Zpackage->option(action => $op);
118 $Zpackage->option(record => $record);
119 # $Zpackage->option(recordIdOpaque => $biblionumber) if $biblionumber;
121 $Zpackage->send("update");
122 my($error, $errmsg, $addinfo, $diagset) = $Zconn->error_x();
123 if ($error==10007 && $tried<3) {## timeout --another 30 looonng seconds for this update
124 print "error 10007\n" if $verbose;
125 sleep 1; ## wait a sec!
128 }elsif ($error==2 && $tried<2) {## timeout --temporary zebra error !whatever that means
129 print "error 2\n" if $verbose;
130 sleep 2; ## wait two seconds!
133 }elsif($error==10004 && $recon==0){##Lost connection -reconnect
134 print "error 10004\n" if $verbose;
135 sleep 1; ## wait a sec!
137 $Zpackage->destroy();
141 # warn "Error-$server $op /errcode:, $error, /MSG:,$errmsg,$addinfo \n";
142 print "error $error\n" if $verbose;
143 $Zpackage->destroy();
147 $Zpackage->send('commit');
148 # $Zpackage->destroy();