X-Git-Url: http://git.indexdata.com/?p=irspy-moved-to-github.git;a=blobdiff_plain;f=lib%2FZOOM%2FIRSpy%2FTask%2FSearch.pm;h=68397c089ddbd5a4b4fb97c96b1ac055c63e9fa2;hp=e3db6321de41276caf77a57c3f7da1f7a172205f;hb=7b1ce08d86449fb47f358ef2169e54fe78772f23;hpb=ae94c0308147f8c8db1cd9aafc7ba6c24de2e42d diff --git a/lib/ZOOM/IRSpy/Task/Search.pm b/lib/ZOOM/IRSpy/Task/Search.pm index e3db632..68397c0 100644 --- a/lib/ZOOM/IRSpy/Task/Search.pm +++ b/lib/ZOOM/IRSpy/Task/Search.pm @@ -1,4 +1,4 @@ -# $Id: Search.pm,v 1.4 2006-10-25 10:54:43 mike Exp $ +# $Id: Search.pm,v 1.16 2007-12-18 11:59:42 mike Exp $ package ZOOM::IRSpy::Task::Search; @@ -25,10 +25,14 @@ ZOOM::IRSpy::Task::Search - a searching task for IRSpy sub new { my $class = shift(); - my($query) = shift(); + my $qtype = shift(); + my $qstr = shift(); + die "$class: unrecognised query type '$qtype'" + if !grep { $qtype eq $_ } qw(pqf cql); my $this = $class->SUPER::new(@_); - $this->{query} = $query; + $this->{qtype} = $qtype; + $this->{qstr} = $qstr; $this->{rs} = undef; return $this; } @@ -39,24 +43,50 @@ sub run { $this->set_options(); my $conn = $this->conn(); - my $query = $this->{query}; + $conn->connect($conn->option("host")); + + my $qtype = $this->{qtype}; + my $qstr = $this->{qstr}; $this->irspy()->log("irspy_task", $conn->option("host"), - " searching for '$query'"); - $this->{rs} = $conn->search_pqf($query); - - # I want to catch the situation where a search is attempted on a - # not-yet opened connection (e.g. the Search::Title test is run - # before Ping) but since this situation doesn't involve the - # generation of a ZOOM event, the main loop won't see an error. - # So I check for it immediately: - $conn->_check(); - # ### Unfortunately, this also fails to detect the condition I'm - # concerned with, so I think I am out of luck. + " searching for '$qtype:$qstr'"); + die "task $this has resultset?!" if defined $this->{rs}; + + my $query; + if ($qtype eq "pqf") { + $query = new ZOOM::Query::PQF($qstr); + } elsif ($qtype eq "cql") { + $query = new ZOOM::Query::CQL($qstr); + } else { + die "Huh?!"; + } + + ### Note well that when this task runs, it creates a result-set + # object which MUST BE DESTROYED in order to prevent large-scale + # memory leakage. So when creating a Task::Search, it is the + # APPLICATION'S RESPONSIBILITY to ensure that the callback + # invoked on success OR FAILURE makes arrangements for the set + # to be destroyed. + eval { + $this->{rs} = $conn->search($query); + }; if ($@) { + die "remote search '$query' had error: '$@'"; + } + + warn "no ZOOM-C level events queued by $this" + if $conn->is_idle(); + + $this->set_options(); +} + +# Unique to Task::Search, used only for logging +sub render_query { + my $this = shift(); + return $this->{qtype} . ":" . $this->{qstr} } sub render { my $this = shift(); - return ref($this) . "(" . $this->{query}. ")"; + return ref($this) . "(" . $this->render_query() . ")"; } use overload '""' => \&render;