r11519@llin: dpavlin | 2005-12-05 00:20:06 +0100
[webpac2] / lib / WebPAC / Output / Estraier.pm
index 871237f..83eae34 100644 (file)
@@ -8,6 +8,8 @@ use base qw/WebPAC::Common/;
 use HyperEstraier;
 use Text::Iconv;
 use Data::Dumper;
+use LWP::Simple;
+use URI::Escape;
 
 =head1 NAME
 
@@ -15,11 +17,11 @@ WebPAC::Output::Estraier - Create Hyper Estraier full text index
 
 =head1 VERSION
 
-Version 0.01
+Version 0.02
 
 =cut
 
-our $VERSION = '0.01';
+our $VERSION = '0.02';
 
 =head1 SYNOPSIS
 
@@ -33,7 +35,7 @@ type C<search>.
 Connect to Hyper Estraier index using HTTP
 
  my $est = new WebPAC::Output::Estraier(
-       url => 'http://localhost:1978/node/webpac2',
+       masterurl => 'http://localhost:1978/',
        user => 'admin',
        passwd => 'admin',
        database => 'demo',
@@ -44,7 +46,7 @@ Options are:
 
 =over 4
 
-=item url
+=item masterurl
 
 URI to C<estmaster> node
 
@@ -79,14 +81,31 @@ sub new {
 
        my $log = $self->_get_logger;
 
-       foreach my $p (qw/url user passwd/) {
+       $log->debug("self: ", sub { Dumper($self) });
+
+       foreach my $p (qw/masterurl user passwd database/) {
                $log->logdie("need $p") unless ($self->{$p});
        }
 
-       $log->info("opening Hyper Estraier index $self->{'url'}");
+       my $url = $self->{masterurl} . '/node/' . $self->{database};
+       $url =~ s#//#/#g;
+       $self->{url} = $url;
+
+       $log->info("opening Hyper Estraier index $self->{url}");
 
-       $self->{'db'} = HyperEstraier::Node->new($self->{'url'});
-       $self->{'db'}->set_auth($self->{'user'}, $self->{'passwd'});
+       my @nodes = $self->est_master( action => 'nodelist' );
+
+       if (! grep(/$self->{database}/, @nodes)) {
+               $log->info("creating index $url");
+               $self->est_master(
+                       action => 'nodeadd',
+                       name => $self->{database},
+                       label => "WebPAC $self->{database}",
+               ) || $log->logdie("can't create Hyper Estraier node $self->{database}");
+       }
+
+       $self->{'db'} = HyperEstraier::Node->new($self->{url});
+       $self->{'db'}->set_auth($self->{'user'}, $self->{passwd});
 
        my $encoding = $self->{'encoding'} || 'ISO-8859-2';
        $log->info("using encoding $encoding");
@@ -179,6 +198,52 @@ sub add {
        return 1;
 }
 
+=head2 est_master
+
+Issue administrative commands to C<estmaster> process and receive response
+as array of lines
+
+  my $nodelist = $self->est_master( action => nodelist );
+
+=cut
+
+my $estmaster_actions = {
+       userdel => [ qw/name/ ],
+       nodelist => [],
+       nodeadd => [ qw/name label/ ],
+       nodedel => [ qw/name/ ],
+};
+
+sub est_master {
+       my $self = shift;
+       my $args = {@_};
+       my $log = $self->_get_logger;
+
+       $log->debug(Dumper($args));
+
+       my $action = $args->{action} || $log->logconfess("no action specified");
+
+       $log->logdie("action '$action' isn't supported") unless ($estmaster_actions->{$action});
+
+       my $url = $self->{masterurl} . '/master?action=' . $action;
+
+       foreach my $arg (@{ $estmaster_actions->{$action} }) {
+               $log->logdie("missing parametar $arg for action $action") unless ($args->{$arg});
+               $url .= '&' . $arg . '=' . uri_escape( $args->{$arg} );
+       }
+
+       $log->debug("calling $url");
+
+       my $tsv = get($url);
+
+       if (! $tsv) {
+               $log->warn("unable to call $url");
+               return;
+       }
+
+       return split(/\n/, $tsv);
+}
+
 =head1 AUTHOR
 
 Dobrica Pavlinusic, C<< <dpavlin@rot13.org> >>