X-Git-Url: http://git.indexdata.com/?p=irspy-moved-to-github.git;a=blobdiff_plain;f=lib%2FZOOM%2FIRSpy.pm;h=7464d5acdf2ff68d81a0d854f47a42dc0a5f50cc;hp=bc82ad4ce94fa59d9e4e7127fb86d455c08cbdcc;hb=fdc8eb065935597f12cf0490da62f87d61184d34;hpb=48639a389a684f9e3bf3e41c2e6c7cd7ab465f0a diff --git a/lib/ZOOM/IRSpy.pm b/lib/ZOOM/IRSpy.pm index bc82ad4..7464d5a 100644 --- a/lib/ZOOM/IRSpy.pm +++ b/lib/ZOOM/IRSpy.pm @@ -1,4 +1,4 @@ -# $Id: IRSpy.pm,v 1.84 2007-04-30 11:28:37 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'; @@ -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