X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=lib%2FWebPAC%2FInput.pm;h=462a303dede5dab5a21197b90559a2635fdd08ef;hb=3d8c0587feb95d81a4fa205aeb6305a67f182867;hp=94afb8ba78c0c565e436161a65055e6009d0d518;hpb=41189f41c13b9066afd55b2bff6b14aeb7538aa1;p=webpac2 diff --git a/lib/WebPAC/Input.pm b/lib/WebPAC/Input.pm index 94afb8b..462a303 100644 --- a/lib/WebPAC/Input.pm +++ b/lib/WebPAC/Input.pm @@ -137,7 +137,7 @@ This function will read whole database in memory and produce lookups. By default, C is assumed to be C. -C is optional parametar to position at some offset before reading from database. +C is optional parametar to skip records at beginning. C is optional parametar to read just C records from database @@ -182,9 +182,7 @@ sub open { my $input_encoding = $arg->{'input_encoding'} || $self->{'input_encoding'} || 'cp852'; # store data in object - foreach my $v (qw/path offset limit/) { - $self->{$v} = $arg->{$v} if defined $arg->{$v}; - } + $self->{$_} = $arg->{$_} foreach grep { defined $arg->{$_} } qw(path offset limit); if ($arg->{load_row} || $arg->{save_row}) { $log->logconfess("save_row and load_row must be defined in pair and be CODE") unless ( @@ -208,6 +206,7 @@ sub open { while (@r) { my $from = shift @r; my $to = shift @r; + $from =~ s/^\\x([0-9a-f]{2})/chr(hex($1))/eig; $recode_map->{$from} = $to; } @@ -264,10 +263,10 @@ sub open { my $to_rec = $size; if (my $s = $self->{offset}) { - $log->debug("skipping to MFN $s"); - $from_rec = $s; + $log->debug("offset $s records"); + $from_rec = $s + 1; } else { - $self->{offset} = $from_rec; + $self->{offset} = $from_rec - 1; } if ($self->{limit}) { @@ -276,21 +275,22 @@ sub open { $to_rec = $size if ($to_rec > $size); } - # store size for later - $self->{size} = ($to_rec - $from_rec) ? ($to_rec - $from_rec + 1) : 0; - my $strict_encoding = $arg->{strict_encoding} || $self->{strict_encoding}; ## FIXME should be 1 really - $log->info("processing $self->{size}/$size records [$from_rec-$to_rec]", + $log->info("processing ", $self->{size} || 'all', "/$size records [$from_rec-$to_rec]", " encoding $input_encoding ", $strict_encoding ? ' [strict]' : '', $self->{stats} ? ' [stats]' : '', ); + $self->{size} = 0; + # read database for (my $pos = $from_rec; $pos <= $to_rec; $pos++) { $log->debug("position: $pos\n"); + $self->{size}++; # XXX I could move this more down if I didn't want empty records... + my $rec = $ll_db->fetch_rec($pos, sub { my ($l,$f_nr,$debug) = @_; # return unless defined($l); @@ -298,6 +298,8 @@ sub open { return unless ( defined($l) && defined($f_nr) ); + my $marc_subfields = $l =~ s/\x1F(\w)/\^$1/g; # fix MARC subfiled delimiters to ^ + warn "-=> $f_nr ## |$l|\n" if ($debug); $log->debug("-=> $f_nr ## $l"); @@ -325,6 +327,8 @@ sub open { } } + $l =~ s/\^(\w)/\x1F$1/g if $marc_subfields; + $log->debug("<=- $f_nr ## |$l|"); warn "<=- $f_nr ## $l\n" if ($debug); return $l; @@ -415,7 +419,7 @@ sub fetch { $log->logconfess("it seems that you didn't load database!") unless ($self->{pos}); if ($self->{pos} == -1) { - $self->{pos} = $self->{offset}; + $self->{pos} = $self->{offset} + 1; } else { $self->{pos}++; } @@ -473,7 +477,7 @@ because it takes into account C and C. sub size { my $self = shift; - return $self->{size}; + return $self->{size}; # FIXME this is buggy if open is called multiple times! } =head2 seek