session should be integer
[Biblio-Z3950.git] / server.pl
index b19f1e4..9fdaa95 100755 (executable)
--- a/server.pl
+++ b/server.pl
@@ -5,7 +5,16 @@ use strict;
 
 use Net::Z3950::SimpleServer;
 use Net::Z3950::OID;
+use Data::Dumper;
 use COBISS;
+use Aleph;
+
+my $databases = {
+       'COBISS' => 'COBISS',
+       'NSK01'  => 'Aleph',
+       'NSK10'  => 'Aleph',
+       'ZAG01'  => 'Aleph',
+};
 
 my $max_records = 3; # XXX configure this
 my $max_result_sets = 10;
@@ -19,13 +28,11 @@ sub InitHandle {
     my $session = {};
 
     $this->{HANDLE}   = $session;
-    $this->{IMP_NAME} = "Z39.50 HTML scraping bot";
-    $this->{IMP_VER}  = "0.1";
+    $this->{IMP_NAME} = "Biblio Z39.50";
+    $this->{IMP_VER}  = "0.2";
     $session->{SETS}  = {};
 }
 
-use Data::Dumper;
-
 sub SearchHandle {
     my $this    = shift;
 
@@ -35,7 +42,19 @@ diag "SearchHandle ",Dumper($this);
     my $rpn     = $this->{RPN};
     my $query;
 
-    eval { $query = $rpn->{query}->render(); };
+       my $database = uc $this->{DATABASES}->[0];
+       my $module = $databases->{$database};
+       if ( ! defined $module ) {
+        $this->{ERR_CODE} = 108;
+               warn $this->{ERR_STR} = "unknown database $database - available: " . keys %$databases;
+               return;
+       }
+
+       my $from = $module->new( $database );
+
+diag "using $module for $database ", Dumper( $from );
+
+       eval { $query = $rpn->{query}->render( $from->usemap ); };
        warn "ERROR: $@" if $@;
     if ( $@ && ref($@) ) {    ## Did someone/something report any errors?
         $this->{ERR_CODE} = $@->{errcode};
@@ -48,17 +67,17 @@ diag "search for $query";
     my $setname  = $this->{SETNAME};
     my $repl_set = $this->{REPL_SET};
 diag "SETNAME $setname REPL_SET $repl_set";
-    my $result;
-    unless ( $result = COBISS->search( $query ) ) {
+    my $hits;
+    unless ( $hits = $from->search( $query ) ) {
         $this->{ERR_CODE} = 108;
         return;
     }
-    my $hits = $COBISS::hits || diag "no results for $query";
 diag "got $hits hits";
     my $rs   = {
         lower => 1,
         upper => $hits < $max_records ? $max_records : $hits,
-        data  => $result->{'resultElements'},  # FIXME
+        hits  => $hits,
+               from => $from,
     };
     my $sets = $session->{SETS};
 
@@ -87,8 +106,6 @@ sub FetchHandle {
     my $rs;
     my $record;
 
-diag Dumper( $this );
-
     if ( !defined( $rs = $sets->{$setname} ) ) {
         $this->{ERR_CODE} = 30;
         return;
@@ -97,6 +114,9 @@ diag Dumper( $this );
         $this->{ERR_CODE} = 13;
         return;
     }
+
+       my $from = $rs->{from} || die "no from?";
+
     $this->{BASENAME} = "HtmlZ3950";
 
 #    if ( !defined($req_form) || ( $req_form eq &Net::Z3950::OID::xml ) )
@@ -107,11 +127,11 @@ diag Dumper( $this );
     }
     elsif ( $req_form eq &Net::Z3950::OID::unimarc ) { # FIXME convert to usmarc
         $this->{REP_FORM} = &Net::Z3950::OID::unimarc;
-        $this->{RECORD} = COBISS->fetch_rec('unimarc');
+        $this->{RECORD} = $from->next_marc('unimarc');
     }
     elsif ( $req_form eq &Net::Z3950::OID::usmarc ) {  # FIXME convert to usmarc
         $this->{REP_FORM} = &Net::Z3950::OID::usmarc;
-        $this->{RECORD} = COBISS->fetch_rec('usmarc');
+        $this->{RECORD} = $from->next_marc('usmarc');
     }
     else {    ## Unsupported record format
         $this->{ERR_CODE} = 239;
@@ -165,15 +185,10 @@ use Data::Dump qw(dump);
 use COBISS;
 
 sub render {
-    my $this       = shift;
-
-print "render ", dump($this);
-
-my $from = 'COBISS';
+       my ($this,$usemap) = @_;
 
-my $usemap = eval "${from}::usemap;";
-die $@ if $@;
-warn "# $from usermap ",dump($usemap);
+warn "# render ", dump($this);
+warn "# usemap ", dump($usemap);
 
     my $attributes = {};
     my $prefix     = "";