- # 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, $ENV{IRSPY_SAVE_XML});
+
+ # 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"));
+
+ _really_rewrite_record($this->{conn}, $rec);
+ $conn->log("irspy", "rewrote XML record");
+}
+
+
+sub _really_rewrite_record {
+ my($conn, $rec, $oldid) = @_;
+
+ 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 $xc = irspy_xpath_context($rec);
+ my $id = irspy_record2identifier($xc);
+ if (defined $oldid && $id ne $oldid) {
+ warn "IDs differ (old='$oldid' new='$id')";
+ _delete_record($conn, $oldid);