X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=Aleph.pm;h=8fdb1deb4061e87c3c4591000ed6fcee2cfadab4;hb=e3ce1e2363cba4e007d3159d969b2e319032eaf2;hp=d478aaee056f60d3237abd3795153a525aee4337;hpb=82f472fae030c4cc5e30c371c82918ad28fd9cd1;p=Biblio-Z3950.git diff --git a/Aleph.pm b/Aleph.pm index d478aae..8fdb1de 100644 --- 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,23 @@ diag "advanced search"; $mech->follow_link( url_regex => qr/find-c/ ); -diag "submit search $query"; + my $database = $self->{database}; + + if ( $mech->content =~ m{Requested library is unavailable at the moment} ) { + warn "ERROR: default database not available, try to swith to $database\n"; + $self->save_content; + $mech->follow_link( url_regex => qr/local_base=$database/i ); + diag "re-try advanced search"; + $mech->follow_link( url_regex => qr/find-c/ ); + } + +diag "submit search [$query] on ", $self->{database}; + $mech->submit_form( fields => { 'ccl_term' => $query, + 'local_base' => $self->{database}, }, ); @@ -102,7 +117,7 @@ diag "in MARC format"; $mech->follow_link( url_regex => qr/format=001/ ); - return $hits; + return $self->{hits} = $hits; } @@ -131,27 +146,48 @@ warn "parse $nr"; sub field { my ( $f, $v ) = @_; $v =~ s/\Q \E/ /gs; -#warn "## $f\t$v\n"; + $v =~ s/\s+$//gs; +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|\s*]*>(.+?)\s*(.+?)|field($1,$2)|ges; -# diag "# hash ",dump($hash); + diag "# hash ",dump($hash); + diag "# marc ", $marc->as_formatted; my $id = $hash->{SYS} || die "no SYS"; $self->save_marc( $id, $marc->as_usmarc ); - $nr++; - - $mech->follow_link( url_regex => qr/set_entry=0*$nr/ ); + if ( $nr < $self->{hits} ) { + $nr++; + diag "follow link to next record $nr"; + $mech->follow_link( url_regex => qr/set_entry=0*$nr/ ); + } return $marc->as_usmarc; } else {