9 |
BEGIN { |
BEGIN { |
10 |
use Exporter (); |
use Exporter (); |
11 |
use vars qw ($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); |
use vars qw ($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); |
12 |
$VERSION = 0.07; |
$VERSION = 0.08; |
13 |
@ISA = qw (Exporter); |
@ISA = qw (Exporter); |
14 |
#Give a hoot don't pollute, do not export more than needed by default |
#Give a hoot don't pollute, do not export more than needed by default |
15 |
@EXPORT = qw (); |
@EXPORT = qw (); |
296 |
|
|
297 |
# is mfn allready in memory? |
# is mfn allready in memory? |
298 |
my $old_mfn = $self->{'current_mfn'} || -1; |
my $old_mfn = $self->{'current_mfn'} || -1; |
299 |
return if ($mfn == $old_mfn); |
return $self->{record} if ($mfn == $old_mfn); |
300 |
|
|
301 |
print STDERR "## fetch: $mfn\n" if ($self->{debug}); |
print STDERR "## fetch: $mfn\n" if ($self->{debug}); |
302 |
|
|
308 |
|
|
309 |
my $buff; |
my $buff; |
310 |
|
|
311 |
|
# delete old record |
312 |
|
delete $self->{record}; |
313 |
|
|
314 |
# read XRFMFB abd XRFMFP |
# read XRFMFB abd XRFMFP |
315 |
read($self->{'fileXRF'}, $buff, 4); |
read($self->{'fileXRF'}, $buff, 4); |
316 |
my $pointer=unpack("l",$buff) || carp "pointer is null"; |
my $pointer=unpack("l",$buff) || carp "pointer is null"; |
317 |
|
|
318 |
|
# check for logically deleted record |
319 |
|
if ($pointer < 0) { |
320 |
|
print STDERR "## record $mfn is logically deleted\n" if ($self->{debug}); |
321 |
|
$self->{deleted} = $mfn; |
322 |
|
|
323 |
|
return unless $self->{include_deleted}; |
324 |
|
|
325 |
|
$pointer = abs($pointer); |
326 |
|
} |
327 |
|
|
328 |
my $XRFMFB = int($pointer/2048); |
my $XRFMFB = int($pointer/2048); |
329 |
my $XRFMFP = $pointer - ($XRFMFB*2048); |
my $XRFMFP = $pointer - ($XRFMFB*2048); |
330 |
|
|
|
|
|
331 |
# (XRFMFB - 1) * 512 + XRFMFP |
# (XRFMFB - 1) * 512 + XRFMFP |
332 |
# why do i have to do XRFMFP % 1024 ? |
# why do i have to do XRFMFP % 1024 ? |
333 |
|
|
334 |
my $blk_off = (($XRFMFB - 1) * 512) + ($XRFMFP % 1024); |
my $blk_off = (($XRFMFB - 1) * 512) + ($XRFMFP % 512); |
335 |
|
|
336 |
print STDERR "## pointer: $pointer XRFMFB: $XRFMFB XRFMFP: $XRFMFP offset: $blk_off\n" if ($self->{'debug'}); |
print STDERR "## pointer: $pointer XRFMFB: $XRFMFB XRFMFP: $XRFMFP offset: $blk_off\n" if ($self->{'debug'}); |
337 |
|
|
345 |
print STDERR "## offset for rowid $value is $blk_off (blk $XRFMFB off $XRFMFP)\n" if ($self->{debug}); |
print STDERR "## offset for rowid $value is $blk_off (blk $XRFMFB off $XRFMFP)\n" if ($self->{debug}); |
346 |
|
|
347 |
if ($value!=$mfn) { |
if ($value!=$mfn) { |
348 |
carp "Error: MFN ".$mfn." not found in MST(".$value.")"; |
if ($value == 0) { |
349 |
#return; # XXX deleted record? |
print STDERR "## record $mfn is physically deleted\n" if ($self->{debug}); |
350 |
} |
$self->{deleted} = $mfn; |
351 |
|
return; |
352 |
|
} |
353 |
|
|
354 |
# $MFRL=$self->Read16($fileMST); |
carp "Error: MFN ".$mfn." not found in MST file, found $value"; |
355 |
# $MFBWB=$self->Read32($fileMST); |
return; |
356 |
# $MFBWP=$self->Read16($fileMST); |
} |
|
# $BASE=$self->Read16($fileMST); |
|
|
# $NVF=$self->Read16($fileMST); |
|
|
# $STATUS=$self->Read16($fileMST); |
|
357 |
|
|
358 |
read($self->{'fileMST'}, $buff, 14); |
read($self->{'fileMST'}, $buff, 14); |
359 |
|
|
361 |
|
|
362 |
print STDERR "## MFRL: $MFRL MFBWB: $MFBWB MFBWP: $MFBWP BASE: $BASE NVF: $NVF STATUS: $STATUS\n" if ($self->{debug}); |
print STDERR "## MFRL: $MFRL MFBWB: $MFBWB MFBWP: $MFBWP BASE: $BASE NVF: $NVF STATUS: $STATUS\n" if ($self->{debug}); |
363 |
|
|
364 |
# delete old record |
warn "MFRL $MFRL is not even number" unless ($MFRL % 2 == 0); |
|
delete $self->{record}; |
|
|
|
|
|
## FIXME this is a bug |
|
|
if (! $self->{'include_deleted'} && $MFRL < 0) { |
|
|
print "## logically deleted record $mfn, skipping...\n" if ($self->{debug}); |
|
|
return; |
|
|
} |
|
365 |
|
|
366 |
warn "BASE is not 18+6*NVF" unless ($BASE == 18 + 6 * $NVF); |
warn "BASE is not 18+6*NVF" unless ($BASE == 18 + 6 * $NVF); |
367 |
|
|
377 |
|
|
378 |
for (my $i = 0 ; $i < $NVF ; $i++) { |
for (my $i = 0 ; $i < $NVF ; $i++) { |
379 |
|
|
|
# $TAG=$self->Read16($fileMST); |
|
|
# $POS=$self->Read16($fileMST); |
|
|
# $LEN=$self->Read16($fileMST); |
|
|
|
|
380 |
my ($TAG,$POS,$LEN) = unpack("sss", substr($buff,$i * 6, 6)); |
my ($TAG,$POS,$LEN) = unpack("sss", substr($buff,$i * 6, 6)); |
381 |
|
|
382 |
print STDERR "## TAG: $TAG POS: $POS LEN: $LEN\n" if ($self->{debug}); |
print STDERR "## TAG: $TAG POS: $POS LEN: $LEN\n" if ($self->{debug}); |
413 |
|
|
414 |
$self->{'current_mfn'} = $mfn; |
$self->{'current_mfn'} = $mfn; |
415 |
|
|
416 |
print Dumper($self),"\n" if ($self->{debug}); |
print STDERR Dumper($self),"\n" if ($self->{debug}); |
417 |
|
|
418 |
return $self->{'record'}; |
return $self->{'record'}; |
419 |
} |
} |