- # Write modified records back to database
- foreach my $conn (@{ $this->{connections} }) {
- my $rec = $conn->record();
- my $p = $this->{conn}->package();
- $p->option(action => "specialUpdate");
- my $xml = $rec->{zeerex}->toString();
- $p->option(record => $xml);
- $p->send("update");
- $p->destroy();
-
- $p = $this->{conn}->package();
- $p->send("commit");
- $p->destroy();
- if (0) {
- $xml =~ s/&/&/g;
- $xml =~ s/</</g;
- $xml =~ s/>/>/g;
- print "Updated with xml=<br/>\n<pre>$xml</pre>\n";
- }
+ $conn->log("irspy", "rewriting XML record");
+ my $rec = $this->_irspy_to_zeerex($conn);
+
+ # Since IRSpy can run for a long time between writes back to the
+ # database, it's quite possible for the server to have closed the
+ # connection as idle. So re-establish it if necessary.
+ $this->{conn}->connect($conn->option("host"));
+
+ _rewrite_zeerex_record($this->{conn}, $rec);
+ $conn->log("irspy", "rewrote XML record");
+}
+
+
+my $_reliabilityField = {
+ reliability => [ reliability => 0,
+ "Calculated reliability of server",
+ "e:serverInfo/e:reliability" ],
+};
+
+sub _rewrite_zeerex_record {
+ my($conn, $rec, $oldid) = @_;
+
+ # Add reliability score
+ my $xc = irspy_xpath_context($rec);
+ my($nok, $nall, $percent) = calc_reliability_stats($xc);
+ modify_xml_document($xc, $_reliabilityField, { reliability => $percent });
+
+ my $p = $conn->package();
+ $p->option(action => "specialUpdate");
+ my $xml = $rec->toString();
+ $p->option(record => $xml);
+ $p->send("update");
+ $p->destroy();
+
+ # This is the expression in the ID-making stylesheet
+ # ../../zebra/zeerex2id.xsl
+ my $id = irspy_record2identifier($xc);
+ if (defined $oldid && $id ne $oldid) {
+ warn "IDs differ (old='$oldid' new='$id')";
+ _delete_record($conn, $oldid);
+ }
+
+ $p = $conn->package();
+ $p->send("commit");
+ $p->destroy();
+ if (0) {
+ $xml =~ s/&/&/g;
+ $xml =~ s/</</g;
+ $xml =~ s/>/>/g;
+ print "Updated $conn with xml=<br/>\n<pre>$xml</pre>\n";