137 |
|
|
138 |
By default, C<input_encoding> is assumed to be C<cp852>. |
By default, C<input_encoding> is assumed to be C<cp852>. |
139 |
|
|
140 |
C<offset> is optional parametar to position at some offset before reading from database. |
C<offset> is optional parametar to skip records at beginning. |
141 |
|
|
142 |
C<limit> is optional parametar to read just C<limit> records from database |
C<limit> is optional parametar to read just C<limit> records from database |
143 |
|
|
182 |
my $input_encoding = $arg->{'input_encoding'} || $self->{'input_encoding'} || 'cp852'; |
my $input_encoding = $arg->{'input_encoding'} || $self->{'input_encoding'} || 'cp852'; |
183 |
|
|
184 |
# store data in object |
# store data in object |
185 |
foreach my $v (qw/path offset limit/) { |
$self->{$_} = $arg->{$_} foreach grep { defined $arg->{$_} } qw(path offset limit); |
|
$self->{$v} = $arg->{$v} if ($arg->{$v}); |
|
|
} |
|
186 |
|
|
187 |
if ($arg->{load_row} || $arg->{save_row}) { |
if ($arg->{load_row} || $arg->{save_row}) { |
188 |
$log->logconfess("save_row and load_row must be defined in pair and be CODE") unless ( |
$log->logconfess("save_row and load_row must be defined in pair and be CODE") unless ( |
228 |
|
|
229 |
my $class = $self->{module} || $log->logconfess("can't get low-level module name!"); |
my $class = $self->{module} || $log->logconfess("can't get low-level module name!"); |
230 |
|
|
231 |
|
$arg->{$_} = $self->{$_} foreach qw(offset limit); |
232 |
|
|
233 |
my $ll_db = $class->new( |
my $ll_db = $class->new( |
234 |
path => $arg->{path}, |
path => $arg->{path}, |
235 |
input_config => $arg->{input_config} || $self->{input_config}, |
input_config => $arg->{input_config} || $self->{input_config}, |
262 |
my $to_rec = $size; |
my $to_rec = $size; |
263 |
|
|
264 |
if (my $s = $self->{offset}) { |
if (my $s = $self->{offset}) { |
265 |
$log->debug("skipping to MFN $s"); |
$log->debug("offset $s records"); |
266 |
$from_rec = $s; |
$from_rec = $s + 1; |
267 |
} else { |
} else { |
268 |
$self->{offset} = $from_rec; |
$self->{offset} = $from_rec - 1; |
269 |
} |
} |
270 |
|
|
271 |
if ($self->{limit}) { |
if ($self->{limit}) { |
274 |
$to_rec = $size if ($to_rec > $size); |
$to_rec = $size if ($to_rec > $size); |
275 |
} |
} |
276 |
|
|
|
# store size for later |
|
|
$self->{size} = ($to_rec - $from_rec) ? ($to_rec - $from_rec + 1) : 0; |
|
|
|
|
277 |
my $strict_encoding = $arg->{strict_encoding} || $self->{strict_encoding}; ## FIXME should be 1 really |
my $strict_encoding = $arg->{strict_encoding} || $self->{strict_encoding}; ## FIXME should be 1 really |
278 |
|
|
279 |
$log->info("processing $self->{size}/$size records [$from_rec-$to_rec]", |
$log->info("processing $self->{size}/$size records [$from_rec-$to_rec]", |
281 |
$self->{stats} ? ' [stats]' : '', |
$self->{stats} ? ' [stats]' : '', |
282 |
); |
); |
283 |
|
|
284 |
|
$self->{size} = 0; |
285 |
|
|
286 |
# read database |
# read database |
287 |
for (my $pos = $from_rec; $pos <= $to_rec; $pos++) { |
for (my $pos = $from_rec; $pos <= $to_rec; $pos++) { |
288 |
|
|
289 |
$log->debug("position: $pos\n"); |
$log->debug("position: $pos\n"); |
290 |
|
|
291 |
|
$self->{size}++; # XXX I could move this more down if I didn't want empty records... |
292 |
|
|
293 |
my $rec = $ll_db->fetch_rec($pos, sub { |
my $rec = $ll_db->fetch_rec($pos, sub { |
294 |
my ($l,$f_nr,$debug) = @_; |
my ($l,$f_nr,$debug) = @_; |
295 |
# return unless defined($l); |
# return unless defined($l); |
414 |
$log->logconfess("it seems that you didn't load database!") unless ($self->{pos}); |
$log->logconfess("it seems that you didn't load database!") unless ($self->{pos}); |
415 |
|
|
416 |
if ($self->{pos} == -1) { |
if ($self->{pos} == -1) { |
417 |
$self->{pos} = $self->{offset}; |
$self->{pos} = $self->{offset} + 1; |
418 |
} else { |
} else { |
419 |
$self->{pos}++; |
$self->{pos}++; |
420 |
} |
} |
472 |
|
|
473 |
sub size { |
sub size { |
474 |
my $self = shift; |
my $self = shift; |
475 |
return $self->{size}; |
return $self->{size}; # FIXME this is buggy if open is called multiple times! |
476 |
} |
} |
477 |
|
|
478 |
=head2 seek |
=head2 seek |