More explicit error-reporting on search failure, to find problem reported by overnigh...
[irspy-moved-to-github.git] / lib / ZOOM / IRSpy / Connection.pm
index 656bd3b..61aa856 100644 (file)
@@ -1,4 +1,4 @@
-# $Id: Connection.pm,v 1.3 2006-10-12 14:35:43 mike Exp $
+# $Id: Connection.pm,v 1.19 2007-12-18 11:59:42 mike Exp $
 
 package ZOOM::IRSpy::Connection;
 
@@ -9,8 +9,12 @@ use warnings;
 use ZOOM;
 our @ISA = qw(ZOOM::Connection);
 
+use ZOOM::IRSpy::Record;
+use ZOOM::IRSpy::Utils qw(cql_target render_record irspy_identifier2target);
+
 use ZOOM::IRSpy::Task::Connect;
 use ZOOM::IRSpy::Task::Search;
+use ZOOM::IRSpy::Task::Retrieve;
 
 
 =head1 NAME
@@ -25,24 +29,50 @@ Keeping the private data in these objects removes the need for ugly
 mappings in the IRSpy object itself; adding the methods makes the
 application code cleaner.
 
-The constructor takes an additional first argument, a reference to the
-IRSpy object that it is associated with.
+The constructor takes an two additional leading arguments: a reference
+to the IRSpy object that it is associated with, and the target ID of
+the connection.
 
 =cut
 
 sub create {
     my $class = shift();
     my $irspy = shift();
+    my $id = shift();
 
     my $this = $class->SUPER::create(@_);
+    my $target = irspy_identifier2target($id);
+    $this->option(host => $target);
     $this->{irspy} = $irspy;
-    $this->{record} = undef;
     $this->{tasks} = [];
 
+    my $query = cql_target($id);
+    my $rs;
+    eval {
+       $rs = $irspy->{conn}->search(new ZOOM::Query::CQL($query));
+    }; if ($@) {
+       die "registry search for record '$id' had error: '$@'";
+    }
+    my $n = $rs->size();
+    $this->log("irspy", "query '$query' found $n record", $n==1 ? "" : "s");
+    ### More than 1 hit is always an error and indicates duplicate
+    #   records in the database; no hits is fine for a new target
+    #   being probed for the first time, but not if the connection is
+    #   being created as part of an "all known targets" scan.
+    my $zeerex;
+    $zeerex = render_record($rs, 0, "zeerex") if $n > 0;
+    $this->{record} = new ZOOM::IRSpy::Record($this, $target, $zeerex);
+
     return $this;
 }
 
 
+sub destroy {
+    my $this = shift();
+    $this->SUPER::destroy(@_);
+}
+
+
 sub irspy {
     my $this = shift();
     return $this->{irspy};
@@ -73,7 +103,7 @@ sub current_task {
     my $old = $this->{current_task};
     if (defined $new) {
        $this->{current_task} = $new;
-       $this->log("irspy_debug", "set current task to $new");
+       $this->log("irspy_task", "set current task to $new");
     }
 
     return $old;
@@ -87,7 +117,7 @@ sub next_task {
     my $old = $this->{next_task};
     if (defined $new) {
        $this->{next_task} = $new;
-       $this->log("irspy_debug", "set next task to $new");
+       $this->log("irspy_task", "set next task to $new");
     }
 
     return $old;
@@ -104,21 +134,36 @@ sub log {
 
 sub irspy_connect {
     my $this = shift();
-    my($udata, %cb) = @_;
+    my($udata, $options, %cb) = @_;
 
-    my $task = new ZOOM::IRSpy::Task::Connect($this, $udata, %cb);
-    $this->add_task($task);
-    $this->log("irspy", "registered connect()");
+    $this->add_task(new ZOOM::IRSpy::Task::Connect
+                   ($this, $udata, $options, %cb));
 }
 
 
+sub irspy_search {
+    my $this = shift();
+    my($qtype, $qstr, $udata, $options, %cb) = @_;
+
+    #warn "calling $this->irspy_search(", join(", ", @_), ")\n";
+    $this->add_task(new ZOOM::IRSpy::Task::Search
+                   ($qtype, $qstr, $this, $udata, $options, %cb));
+}
+
+
+# Wrapper for backwards compatibility
 sub irspy_search_pqf {
     my $this = shift();
-    my($query, $udata, %cb) = @_;
+    return $this->irspy_search("pqf", @_);
+}
+
+
+sub irspy_rs_record {
+    my $this = shift();
+    my($rs, $index0, $udata, $options, %cb) = @_;
 
-    my $task = new ZOOM::IRSpy::Task::Search($query, $this, $udata, %cb);
-    $this->add_task($task);
-    $this->log("irspy", "registered search_pqf($query)");
+    $this->add_task(new ZOOM::IRSpy::Task::Retrieve
+                   ($rs, $index0, $this, $udata, $options, %cb));
 }
 
 
@@ -129,10 +174,18 @@ sub add_task {
     my $tasks = $this->{tasks};
     $tasks->[-1]->{next} = $task if @$tasks > 0;
     push @$tasks, $task;
-    $this->log("irspy", "added task $task");
+    $this->log("irspy_task", "added task $task");
 }
 
 
+sub render {
+    my $this = shift();
+    return ref($this) . "(" . $this->option("host") . ")";
+}
+
+use overload '""' => \&render;
+
+
 =head1 SEE ALSO
 
 ZOOM::IRSpy