allocate session just once
[Biblio-Z3950.git] / Aleph.pm
index d478aae..6a3cf3c 100644 (file)
--- a/Aleph.pm
+++ b/Aleph.pm
@@ -59,13 +59,16 @@ sub usemap {{
 #      1016    => '',
 }};
 
+our $session_id;
 
 sub search {
        my ( $self, $query ) = @_;
 
        die "need query" unless defined $query;
 
-       my $url = 'http://161.53.240.197:8991/F?RN=' . rand(1000000000);
+       $session_id ||= int rand(1000000000);
+       # FIXME allocate session just once
+       my $url = 'http://161.53.240.197:8991/F?RN=' . $session_id;
        # fake JavaScript code on page which creates random session
 
 diag "get $url";
@@ -77,11 +80,14 @@ diag "advanced search";
 
        $mech->follow_link( url_regex => qr/find-c/ );
 
-diag "submit search $query";
+diag "submit search [$query] on ", $self->{database};
+
+       $self->save_content;
 
        $mech->submit_form(
                fields => {
                        'ccl_term' => $query,
+                       'local_base' => $self->{database},
                },
        );
 
@@ -131,19 +137,37 @@ warn "parse $nr";
                sub field {
                        my ( $f, $v ) = @_;
                        $v =~ s/\Q \E/ /gs;
-#warn "## $f\t$v\n";
+warn "## $f\t$v\n";
                        $hash->{$f} = $v;
+
+                       if ( $f eq 'LDR' ) {
+                               $marc->leader( $v );
+                               return;
+                       }
+
+                       if ( $f =~ m/\D/ ) {
+                               warn "$f not numeric!";
+                               return;
+                       }
+
+                       if ( $v !~ s/^\|// ) { # no subfields
+                               $marc->add_fields( $f, $v );
+warn "## ++ ", dump( $f, $v );
+                               return;
+                       }
+
                        my ($i1,$i2) = (' ',' ');
                        ($i1,$i2) = ($2,$3) if $f =~ s/^(...)(.)?(.)?/$1/;
                        my @sf = split(/\|/, $v);
-                       shift @sf;
                        @sf = map { s/^(\w)\s+//; { $1 => $_ } } @sf;
 #warn "## sf = ", dump(@sf);
-                       $marc->add_fields( $f, $i1, $i2, @sf ) if $f =~ m/^\d+$/;
+                       $marc->add_fields( $f, $i1, $i2, @sf );
+warn "## ++ ", dump( $f, $i1, $i2, @sf );
                }
 
                $html =~ s|<tr>\s*<td class=td1 id=bold[^>]*>(.+?)</td>\s*<td class=td1>(.+?)</td>|field($1,$2)|ges;
-#              diag "# hash ",dump($hash);
+               diag "# hash ",dump($hash);
+               diag "# marc ", $marc->as_formatted;
 
                my $id = $hash->{SYS} || die "no SYS";