X-Git-Url: http://git.indexdata.com/?p=irspy-moved-to-github.git;a=blobdiff_plain;f=lib%2FZOOM%2FIRSpy.pm;h=7464d5acdf2ff68d81a0d854f47a42dc0a5f50cc;hp=aa835130f65aa0abaac19376d620939d04ca0e84;hb=245354a09b5fca32e297406079cdf7c352421875;hpb=d8931f76879e7d7b5d0cb8340291b7d2dac65c91 diff --git a/lib/ZOOM/IRSpy.pm b/lib/ZOOM/IRSpy.pm index aa83513..7464d5a 100644 --- a/lib/ZOOM/IRSpy.pm +++ b/lib/ZOOM/IRSpy.pm @@ -1,4 +1,4 @@ -# $Id: IRSpy.pm,v 1.83 2007-04-27 14:04:40 mike Exp $ +# $Id: IRSpy.pm,v 1.86 2007-07-09 09:41:44 mike Exp $ package ZOOM::IRSpy; @@ -21,7 +21,7 @@ use ZOOM::IRSpy::Utils qw(cql_target render_record irspy_record2identifier); our @ISA = qw(); -our $VERSION = '0.02'; +our $VERSION = '1.00'; our $irspy_to_zeerex_xsl = dirname(__FILE__) . '/../../xsl/irspy2zeerex.xsl'; @@ -177,7 +177,7 @@ sub initialise { $this->{tree} = $this->_gather_tests($tname) or die "No tests defined for '$tname'"; $this->{tree}->resolve(); - $this->{tree}->print(0); + #$this->{tree}->print(0); my $timeout = "ZOOM::IRSpy::Test::$tname"->timeout(); @@ -272,14 +272,7 @@ sub _really_rewrite_record { my $id = irspy_record2identifier($xc); if (defined $oldid && $id ne $oldid) { warn "IDs differ (old='$oldid' new='$id')"; - # Delete old record; - ### Should use same mechanism as delete.mc - my $p = $conn->package(); - $p->option(action => "recordDelete"); - $p->option(recordIdOpaque => $oldid); - $p->option(record => ""); # Work around Zebra bug - $p->send("update"); - $p->destroy(); + _delete_record($conn, $oldid); } $p = $conn->package(); @@ -294,6 +287,41 @@ sub _really_rewrite_record { } +sub _delete_record { + my($conn, $id) = @_; + + # We can't delete records using recordIdOpaque, since character + # sets are handled differently here in extended services from how + # they are used in the Alvis filter's record-parsing, and so + # non-ASCII characters come out differently in the two contexts. + # Instead, we must send a record whose contents indicate the ID of + # that which we wish to delete. There are two ways, both + # unsatisfactory: we could either fetch the actual record them + # resubmit it in the deletion request (which wastes a search and a + # fetch) or we could build a record by hand from the parsed-out + # components (which is error-prone and which I am not 100% certain + # will work since the other contents of the record will be + # different). The former evil seems to be the lesser. + + warn "$conn deleting record '$id'"; + + my $rs = $conn->search(new ZOOM::Query::CQL(cql_target($id))); + die "no such ID '$id'" if $rs->size() == 0; + my $rec = $rs->record(0); + my $xml = $rec->render(); + + my $p = $conn->package(); + $p->option(action => "recordDelete"); + $p->option(record => $xml); + $p->send("update"); + $p->destroy(); + + $p = $conn->package(); + $p->send("commit"); + $p->destroy(); +} + + # The approach: gather declarative information about test hierarchy, # then go into a loop. In the loop, we ensure that each connection is # running a test, and within that test a task, until its list of tests @@ -598,7 +626,6 @@ sub _gather_tests { eval { require $fullName; - $this->log("irspy", "successfully required '$fullName'"); }; if ($@) { $this->log("irspy", "couldn't require '$fullName': $@"); $this->log("warn", "can't load test '$tname': skipping",