Typo: s/cql/pqf
[irspy-moved-to-github.git] / lib / ZOOM / IRSpy / Connection.pm
index 74c24a8..f5aa569 100644 (file)
@@ -1,4 +1,4 @@
-# $Id: Connection.pm,v 1.1 2006-10-06 11:33:07 mike Exp $
+# $Id: Connection.pm,v 1.15 2007-05-01 15:33:30 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,41 @@ 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 new {
+sub create {
     my $class = shift();
     my $irspy = shift();
+    my $id = shift();
 
-    my $this = $class->SUPER::new(@_);
+    my $this = $class->SUPER::create(@_);
+    my $target = irspy_identifier2target($id);
+    $this->option(host => $target);
     $this->{irspy} = $irspy;
-    $this->{record} = undef;
-    $this->{tasks} = undef;
+    $this->{tasks} = [];
+
+    my $query = cql_target($id);
+    my $rs = $irspy->{conn}->search(new ZOOM::Query::CQL($query));
+    my $n = $rs->size();
+    $this->log("irspy", "query '$query' found $n records");
+    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};
@@ -61,11 +82,8 @@ sub record {
 
 sub tasks {
     my $this = shift();
-    my($new) = @_;
 
-    my $old = $this->{tasks};
-    $this->{tasks} = $new if defined $new;
-    return $old;
+    return $this->{tasks};
 }
 
 
@@ -76,7 +94,21 @@ 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;
+}
+
+
+sub next_task {
+    my $this = shift();
+    my($new) = @_;
+
+    my $old = $this->{next_task};
+    if (defined $new) {
+       $this->{next_task} = $new;
+       $this->log("irspy_task", "set next task to $new");
     }
 
     return $old;
@@ -93,48 +125,56 @@ sub log {
 
 sub irspy_connect {
     my $this = shift();
-    my(%cb) = @_;
+    my($udata, $options, %cb) = @_;
 
-    $this->add_task(new ZOOM::IRSpy::Task::Connect($this, %cb));
-    $this->log("irspy", "registered connect()");
+    $this->add_task(new ZOOM::IRSpy::Task::Connect
+                   ($this, $udata, $options, %cb));
 }
 
 
-sub irspy_search_pqf {
+sub irspy_search {
     my $this = shift();
-    my($query, %cb) = @_;
+    my($qtype, $qstr, $udata, $options, %cb) = @_;
 
-    $this->add_task(new ZOOM::IRSpy::Task::Search($query, $this, %cb));
-    $this->log("irspy", "registered search_pqf($query)");
+    $this->add_task(new ZOOM::IRSpy::Task::Search
+                   ($qtype, $qstr, $this, $udata, $options, %cb));
 }
 
 
-sub add_task {
+# Wrapper for backwards compatibility
+sub irspy_search_pqf {
     my $this = shift();
-    my($task) = @_;
+    return $this->irspy_search("pqf", @_);
+}
 
-    my $tasks = $this->tasks();
-    if (!defined $tasks) {
-       $this->tasks([ $task ]);
-    } else {
-       $tasks->[-1]->{next} = $task;
-       push @$tasks, $task;
-    }
 
-    $this->log("irspy", "added task $task");
+sub irspy_rs_record {
+    my $this = shift();
+    my($rs, $index0, $udata, $options, %cb) = @_;
+
+    $this->add_task(new ZOOM::IRSpy::Task::Retrieve
+                   ($rs, $index0, $this, $udata, $options, %cb));
 }
 
 
-sub start_task {
+sub add_task {
     my $this = shift();
     my($task) = @_;
-    die "no task defined for " . $this->option("host")
-       if !defined $task;
 
-    $this->current_task($task);
-    $task->run();
+    my $tasks = $this->{tasks};
+    $tasks->[-1]->{next} = $task if @$tasks > 0;
+    push @$tasks, $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