/[webpac2]/trunk/lib/WebPAC/Input.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/lib/WebPAC/Input.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 301 by dpavlin, Mon Dec 19 21:26:04 2005 UTC revision 416 by dpavlin, Sun Feb 26 23:21:50 2006 UTC
# Line 3  package WebPAC::Input; Line 3  package WebPAC::Input;
3  use warnings;  use warnings;
4  use strict;  use strict;
5    
 use blib;  
   
6  use WebPAC::Common;  use WebPAC::Common;
7  use base qw/WebPAC::Common/;  use base qw/WebPAC::Common/;
8  use Text::Iconv;  use Text::Iconv;
9    use Data::Dumper;
10    
11  =head1 NAME  =head1 NAME
12    
# Line 15  WebPAC::Input - read different file form Line 14  WebPAC::Input - read different file form
14    
15  =head1 VERSION  =head1 VERSION
16    
17  Version 0.03  Version 0.04
18    
19  =cut  =cut
20    
21  our $VERSION = '0.03';  our $VERSION = '0.04';
22    
23  =head1 SYNOPSIS  =head1 SYNOPSIS
24    
# Line 48  Perhaps a little code snippet. Line 47  Perhaps a little code snippet.
47      );      );
48    
49      $db->open('/path/to/database');      $db->open('/path/to/database');
50      print "database size: ",$db->size,"\n";          print "database size: ",$db->size,"\n";
51      while (my $rec = $db->fetch) {          while (my $rec = $db->fetch) {
52      }                  # do something with $rec
53            }
54    
55    
56    
# Line 64  Create new input database object. Line 64  Create new input database object.
64          module => 'WebPAC::Input::MARC',          module => 'WebPAC::Input::MARC',
65          code_page => 'ISO-8859-2',          code_page => 'ISO-8859-2',
66          low_mem => 1,          low_mem => 1,
67            recode => 'char pairs',
68    );    );
69    
70  C<module> is low-level file format module. See L<WebPAC::Input::Isis> and  C<module> is low-level file format module. See L<WebPAC::Input::Isis> and
# Line 184  sub open { Line 185  sub open {
185          # create Text::Iconv object          # create Text::Iconv object
186          $self->{iconv} = Text::Iconv->new($code_page,$self->{'code_page'});          $self->{iconv} = Text::Iconv->new($code_page,$self->{'code_page'});
187    
188            my $filter_ref;
189    
190            if ($self->{recode}) {
191                    my @r = split(/\s/, $self->{recode});
192                    if ($#r % 2 != 1) {
193                            $log->logwarn("recode needs even number of elements (some number of valid pairs)");
194                    } else {
195                            my $recode;
196                            while (@r) {
197                                    my $from = shift @r;
198                                    my $to = shift @r;
199                                    $recode->{$from} = $to;
200                            }
201    
202                            my $regex = join '|' => keys %{ $recode };
203    
204                            $log->debug("using recode regex: $regex");
205                            
206                            $filter_ref = sub {
207                                    my $t = shift;
208                                    $t =~ s/($regex)/$recode->{$1}/g;
209                                    return $t;
210                            };
211    
212                    }
213    
214            }
215    
216          my ($db, $size) = $self->{open_db}->( $self,          my ($db, $size) = $self->{open_db}->( $self,
217                  path => $arg->{path},                  path => $arg->{path},
218                    filter => $filter_ref,
219          );          );
220    
221          unless ($db) {          unless ($db) {
# Line 198  sub open { Line 228  sub open {
228                  return;                  return;
229          }          }
230    
231          my $offset = 1;          my $from_rec = 1;
232          my $limit = $size;          my $to_rec = $size;
233    
234          if (my $s = $self->{offset}) {          if (my $s = $self->{offset}) {
235                  $log->info("skipping to MFN $s");                  $log->info("skipping to MFN $s");
236                  $offset = $s;                  $from_rec = $s;
237          } else {          } else {
238                  $self->{offset} = $offset;                  $self->{offset} = $from_rec;
239          }          }
240    
241          if ($self->{limit}) {          if ($self->{limit}) {
242                  $log->debug("limiting to ",$self->{limit}," records");                  $log->debug("limiting to ",$self->{limit}," records");
243                  $limit = $offset + $self->{limit} - 1;                  $to_rec = $from_rec + $self->{limit} - 1;
244                  $limit = $size if ($limit > $size);                  $to_rec = $size if ($to_rec > $size);
245          }          }
246    
247          # store size for later          # store size for later
248          $self->{size} = ($limit - $offset) ? ($limit - $offset + 1) : 0;          $self->{size} = ($to_rec - $from_rec) ? ($to_rec - $from_rec + 1) : 0;
249    
250          $log->info("processing $self->{size} records in $code_page, convert to $self->{code_page}");          $log->info("processing $self->{size}/$size records [$from_rec-$to_rec] convert $code_page -> $self->{code_page}");
251    
252          # read database          # read database
253          for (my $pos = $offset; $pos <= $limit; $pos++) {          for (my $pos = $from_rec; $pos <= $to_rec; $pos++) {
254    
255                  $log->debug("position: $pos\n");                  $log->debug("position: $pos\n");
256    
257                  my $rec = $self->{fetch_rec}->($self, $db, $pos );                  my $rec = $self->{fetch_rec}->($self, $db, $pos );
258    
259                    $log->debug(sub { Dumper($rec) });
260    
261                  if (! $rec) {                  if (! $rec) {
262                          $log->warn("record $pos empty? skipping...");                          $log->warn("record $pos empty? skipping...");
263                          next;                          next;
# Line 241  sub open { Line 273  sub open {
273                  # create lookup                  # create lookup
274                  $self->{'lookup'}->add( $rec ) if ($rec && $self->{'lookup'});                  $self->{'lookup'}->add( $rec ) if ($rec && $self->{'lookup'});
275    
276                  $self->progress_bar($pos,$limit);                  $self->progress_bar($pos,$to_rec);
277    
278          }          }
279    
# Line 249  sub open { Line 281  sub open {
281          $self->{last_pcnt} = 0;          $self->{last_pcnt} = 0;
282    
283          # store max mfn and return it.          # store max mfn and return it.
284          $self->{max_pos} = $limit;          $self->{max_pos} = $to_rec;
285          $log->debug("max_pos: $limit");          $log->debug("max_pos: $to_rec");
286    
287          return $size;          return $size;
288  }  }

Legend:
Removed from v.301  
changed lines
  Added in v.416

  ViewVC Help
Powered by ViewVC 1.1.26