implement experimental (and probably broken) low-level offset and limit
authorDobrica Pavlinusic <dpavlin@rot13.org>
Sun, 20 Sep 2009 22:26:27 +0000 (22:26 +0000)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Sun, 20 Sep 2009 22:26:27 +0000 (22:26 +0000)
git-svn-id: svn+ssh://mjesec/home/dpavlin/svn/webpac2/trunk@1305 07558da8-63fa-0310-ba24-9fe276d99e06

lib/WebPAC/Input/ISI.pm

index 41d0284..bdd36bb 100644 (file)
@@ -104,12 +104,16 @@ sub new {
        my $tag;
        my $rec;
 
-       my $pos = 0;
        my $offset = $self->{offset} || 0;
-       my $end_pos = 0;
-       $end_pos = $offset + $self->{limit} if $self->{limit};
+       my $limit  = $self->{limit}  || 0;
 
-       warn "# range: $offset - $end_pos";
+       my $file_pos = 0;
+       my $end_pos  = 0;
+       $end_pos = $offset + $limit if $limit;
+
+       $self->{_rec} = [];
+       
+       warn "# offset: $offset limit: $limit end: $end_pos";
 
        while( $line = <$fh> ) {
                chomp($line);
@@ -118,39 +122,40 @@ sub new {
                if ( $line eq 'EF' ) {
                        last;
                } elsif ( $line eq 'ER' ) {
-                       last if $end_pos && $pos >= $end_pos;
-                       $pos++;
-                       next if $offset && $pos < $offset;
+                       $file_pos++;
+                       last if $end_pos && $file_pos > $end_pos;
 
-                       # join tags
-                       foreach ( qw/AB DE ID TI SO RP SC FU FX PA JI/ ) {
-                               $rec->{$_} = join(' ', @{ $rec->{$_} }) if defined $rec->{$_};
-                       }
-                       # split on ;
-                       foreach ( qw/ID SC DE/ ) {
-                               $rec->{$_} = [ split(/;\s/, $rec->{$_}) ] if defined $rec->{$_};
+                       if ( ! $offset || $file_pos > $offset ) {
+
+                               # join tags
+                               foreach ( qw/AB DE ID TI SO RP SC FU FX PA JI/ ) {
+                                       $rec->{$_} = join(' ', @{ $rec->{$_} }) if defined $rec->{$_};
+                               }
+                               # split on ;
+                               foreach ( qw/ID SC DE/ ) {
+                                       $rec->{$_} = [ split(/;\s/, $rec->{$_}) ] if defined $rec->{$_};
+                               }
+                               $rec->{'000'} = [ $file_pos ];
+                               push @{ $self->{_rec} }, $rec;
                        }
-                       $rec->{'000'} = [ $pos ];
-                       push @{ $self->{_rec} }, $rec;
 
                        $rec = {};
                        $line = <$fh>;
                        chomp $line;
                        $log->logdie("expected blank like in ",$arg->{path}, " +$.: $line") unless ( $line eq '' );
-               } elsif ( $offset && $pos < $offset ) {
+               } elsif ( $offset && $file_pos < $offset ) {
                        next;
                } elsif ( $line =~ /^(\S\S)\s(.+)$/ ) {
-                               $tag = $1;
-                               $v = $2;
+                       $tag = $1;
+                       $v = $2;
                } elsif ( $line =~ /^\s{3}(.+)$/ ) {
-                               $v = $1;
-                               if ( $tag eq 'CR' && $v =~ m{DOI$} ) {
-                                       my $doi = <$fh>;
-                                       chomp($doi);
-                                       $doi =~ s{^\s{3}}{ } || die "can't find DOI in: $doi";
-                                       $v .= $doi;
-                               }
-
+                       $v = $1;
+                       if ( $tag eq 'CR' && $v =~ m{DOI$} ) {
+                               my $doi = <$fh>;
+                               chomp($doi);
+                               $doi =~ s{^\s{3}}{ } || die "can't find DOI in: $doi";
+                               $v .= $doi;
+                       }
                } elsif ( $line =~ m{^(\S\S)\s*$} ) {
                        warn "# $arg->{path} +$. empty |$line|\n";
                } else {
@@ -165,9 +170,6 @@ sub new {
                }
 
        }
-
-       $self->{size} = $pos - $offset;
-
        $log->debug("loaded ", $self->size, " records");
 
        $self ? return $self : return undef;
@@ -186,6 +188,7 @@ sub fetch_rec {
 
        my ( $mfn, $filter_coderef ) = @_;
 
+       $mfn -= $self->{offset} if $self->{offset};
        return $self->{_rec}->[$mfn-1];
 }
 
@@ -200,7 +203,7 @@ Return number of records in database
 
 sub size {
        my $self = shift;
-       return $self->{size};
+       $#{ $self->{_rec} } + 1;
 }
 
 =head1 SEE ALSO