X-Git-Url: http://git.indexdata.com/?p=irspy-moved-to-github.git;a=blobdiff_plain;f=lib%2FZOOM%2FPod.pm;h=5faee4d7cb74098b02ea26b4385b406e22d87bea;hp=23c714d754d38de88b62c876f76eef6906d1e99a;hb=d3725cdc5d765df0eff9c525c6e3de015c8ca47c;hpb=5ce523818c5e18519e9526889024290481bca89c diff --git a/lib/ZOOM/Pod.pm b/lib/ZOOM/Pod.pm index 23c714d..5faee4d 100644 --- a/lib/ZOOM/Pod.pm +++ b/lib/ZOOM/Pod.pm @@ -1,4 +1,4 @@ -# $Id: Pod.pm,v 1.13 2006-06-21 14:31:24 mike Exp $ +# $Id: Pod.pm,v 1.22 2006-10-06 11:33:07 mike Exp $ package ZOOM::Pod; @@ -8,7 +8,7 @@ use warnings; use ZOOM; BEGIN { - # Just register the name + # Just register the names: this doesn't turn the levels on ZOOM::Log::mask_str("pod"); ZOOM::Log::mask_str("pod_unhandled"); } @@ -111,6 +111,21 @@ sub new { }, $class; } + +=head2 connections() + + @c = $pod->connections(); + +Returns a list of the connection objects in the pod. + +=cut + +sub connections { + my $this = shift(); + return @{ $this->{conn} } +} + + =head2 option() $oldElemSet = $pod->option("elementSetName"); @@ -205,12 +220,25 @@ sub callback { my($event, $sub) = @_; my $old = $this->{callback}->{$event}; - $this->{callback}->{$event} = $sub - if defined $sub; + $this->{callback}->{$event} = $sub; return $old; } +=head2 remove_callbacks() + + $pod->remove_callbacks(); + +Removes all registed callbacks from the pod. This is useful when the +pod has completed one operation and is about to start the next. + +=cut + +sub remove_callbacks { + my $this = shift(); + $this->{callback} = {}; +} + =head2 search_pqf() $pod->search_pqf("@attr 1=1003 wedel"); @@ -228,8 +256,8 @@ have one search active on it at a time: this allows the pod to maintain the one-to-one mapping between connections and result-sets. Submitting a new search on a connection before the old one has completed will result in a total failure in the nature of causality, -and the spontaneous existence-failure of the universe. Do not do -this. +and the spontaneous existence-failure of the universe. Try to avoid +doing this too often. =cut @@ -238,7 +266,9 @@ sub search_pqf { my($pqf) = @_; foreach my $i (0..@{ $this->{conn} }-1) { - $this->{rs}->[$i] = $this->{conn}->[$i]->search_pqf($pqf); + my $conn = $this->{conn}->[$i]; + $this->{rs}->[$i] = $conn->search_pqf($pqf) + if !$conn->option("pod_omit"); } } @@ -265,6 +295,10 @@ indicates whether C should continue (return-value 0) or return immediately (any other value). Exception-handling callbacks may of course re-throw the exception. +Connections that have the C option set are omitted from +consideration. This is useful if, for example, a connection that is +part of a pod is known to have encountered an unrecoverable error. + =cut sub wait { @@ -272,8 +306,30 @@ sub wait { my($arg) = @_; my $res = 0; - while ((my $i = ZOOM::event($this->{conn})) != 0) { + + while (1) { + my @conn; + my @idxmap; # maps indexes into conn to global indexes + foreach my $i (0 .. @{ $this->{conn} }-1) { + my $conn = $this->{conn}->[$i]; + if ($conn->option("pod_omit")) { + #ZOOM::Log::log("pod", "connection $i omitted (", + #$conn->option("host"), ")"); + } else { + push @conn, $conn; + push @idxmap, $i; + #ZOOM::Log::log("pod", "connection $i included (", + #$conn->option("host"), ")"); + } + } + + last if @conn == 0; + my $i0 = ZOOM::event(\@conn); + last if $i0 == 0; + my $i = 1+$idxmap[$i0-1]; my $conn = $this->{conn}->[$i-1]; + die "connection-mapping screwup" if $conn ne $conn[$i0-1]; + my $ev = $conn->last_event(); my $evstr = ZOOM::event_str($ev); ZOOM::Log::log("pod", "connection ", $i-1, ": event $ev ($evstr)");