From f9062f8281a06d7052bd162c203135bab5ef9728 Mon Sep 17 00:00:00 2001 From: Dobrica Pavlinusic Date: Fri, 31 Dec 2004 05:43:20 +0000 Subject: [PATCH] major improvments and new version: - implement logically deleted records (really!) - re-ordered values tests using cmp_ok so that reporting is correct, - return record in fetch even if it's in memory (bugfix) - removed some obsolete code git-svn-id: file:///home/dpavlin/svn/Biblio-Isis/trunk@25 4670fa4d-42ec-0310-ab5b-a66af6943492 --- IsisDB.pm | 42 ++++++++++++++++++------------------------ data/winisis/BIBL.XRF | Bin 512 -> 512 bytes data/winisis/BIBL.mst | Bin 3072 -> 3584 bytes t/002_isis.t | 28 ++++++++++++++++++++++++---- 4 files changed, 42 insertions(+), 28 deletions(-) diff --git a/IsisDB.pm b/IsisDB.pm index 6f31967..222e122 100644 --- a/IsisDB.pm +++ b/IsisDB.pm @@ -9,7 +9,7 @@ use Data::Dumper; BEGIN { use Exporter (); use vars qw ($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); - $VERSION = 0.07; + $VERSION = 0.08; @ISA = qw (Exporter); #Give a hoot don't pollute, do not export more than needed by default @EXPORT = qw (); @@ -296,7 +296,7 @@ sub fetch { # is mfn allready in memory? my $old_mfn = $self->{'current_mfn'} || -1; - return if ($mfn == $old_mfn); + return $self->{record} if ($mfn == $old_mfn); print STDERR "## fetch: $mfn\n" if ($self->{debug}); @@ -308,14 +308,26 @@ sub fetch { my $buff; + # delete old record + delete $self->{record}; + # read XRFMFB abd XRFMFP read($self->{'fileXRF'}, $buff, 4); my $pointer=unpack("l",$buff) || carp "pointer is null"; + # check for logically deleted record + if ($pointer < 0) { + print STDERR "## record $mfn is logically deleted\n" if ($self->{debug}); + $self->{deleted} = $mfn; + + return unless $self->{include_deleted}; + + $pointer = abs($pointer); + } + my $XRFMFB = int($pointer/2048); my $XRFMFP = $pointer - ($XRFMFB*2048); - # (XRFMFB - 1) * 512 + XRFMFP # why do i have to do XRFMFP % 1024 ? @@ -334,30 +346,16 @@ sub fetch { if ($value!=$mfn) { carp "Error: MFN ".$mfn." not found in MST(".$value.")"; - #return; # XXX deleted record? + #return; } -# $MFRL=$self->Read16($fileMST); -# $MFBWB=$self->Read32($fileMST); -# $MFBWP=$self->Read16($fileMST); -# $BASE=$self->Read16($fileMST); -# $NVF=$self->Read16($fileMST); -# $STATUS=$self->Read16($fileMST); - read($self->{'fileMST'}, $buff, 14); my ($MFRL,$MFBWB,$MFBWP,$BASE,$NVF,$STATUS) = unpack("slssss", $buff); print STDERR "## MFRL: $MFRL MFBWB: $MFBWB MFBWP: $MFBWP BASE: $BASE NVF: $NVF STATUS: $STATUS\n" if ($self->{debug}); - # delete old record - 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; - } + warn "MFRL $MFRL is not even number" unless ($MFRL % 2 == 0); warn "BASE is not 18+6*NVF" unless ($BASE == 18 + 6 * $NVF); @@ -373,10 +371,6 @@ sub fetch { for (my $i = 0 ; $i < $NVF ; $i++) { -# $TAG=$self->Read16($fileMST); -# $POS=$self->Read16($fileMST); -# $LEN=$self->Read16($fileMST); - my ($TAG,$POS,$LEN) = unpack("sss", substr($buff,$i * 6, 6)); print STDERR "## TAG: $TAG POS: $POS LEN: $LEN\n" if ($self->{debug}); @@ -413,7 +407,7 @@ sub fetch { $self->{'current_mfn'} = $mfn; - print Dumper($self),"\n" if ($self->{debug}); + print STDERR Dumper($self),"\n" if ($self->{debug}); return $self->{'record'}; } diff --git a/data/winisis/BIBL.XRF b/data/winisis/BIBL.XRF index 9c118e01002540df3155ccda47937eff09f295a9..ff6c13ac9a7869fe50fdf190db964a1e8d6c0ec0 100644 GIT binary patch delta 25 fcmZo*XRQJn0w$$^cg4aR9~I BL9PG* delta 39 mcmZpWX^`M!00K5Bc4nOXk;iDG!wP1mHpb1bm?PMM{Cxn7ED6T| diff --git a/t/002_isis.t b/t/002_isis.t index 078f5b0..fa8a709 100755 --- a/t/002_isis.t +++ b/t/002_isis.t @@ -5,7 +5,7 @@ use blib; use Data::Dumper; -use Test::More tests => 104; +use Test::More tests => 108; BEGIN { use_ok( 'IsisDB' ); } @@ -98,7 +98,7 @@ sub test_data { my $i = 0; foreach my $v (@{$data->[$mfn-1]->{$f}}) { $v =~ s/^[01# ][01# ]// if ($args->{no_ident}); - cmp_ok($rec->{$f}->[$i], '==', $v, "MFN $mfn $f:$i $v"); + cmp_ok($v, '==', $rec->{$f}->[$i], "MFN $mfn $f:$i $v"); $i++; } } @@ -113,7 +113,7 @@ sub test_data { foreach my $mfn (1 .. $isis->{'maxmfn'}) { my $md5 = md5_hex($isis->to_ascii($mfn)); - cmp_ok($args->{md5_ascii}[$mfn - 1], 'eq', $md5, "md5 $mfn"); + cmp_ok($md5, 'eq', $args->{md5_ascii}[$mfn - 1], "md5 $mfn"); } } @@ -121,6 +121,7 @@ sub test_data { $isis = IsisDB->new ( isisdb => './data/winisis/BIBL', + include_deleted => 1, ); print Dumper($isis); @@ -130,7 +131,7 @@ test_data( md5_ascii => [ qw( a369eff702307ba12eb81656ee0587fe 4fb38537a94f3f5954e40d9536b942b0 - 498cc16c9e7ab0fdc29182533cc35d11 + 579a7c6901c654bdeac10547a98e5b71 7d2adf1675c83283aa9b82bf343e3d85 daf2cf86ca7e188e8360a185f3b43423 ) ], @@ -138,6 +139,7 @@ test_data( $isis = IsisDB->new ( isisdb => './data/isismarc/BIBL', + include_deleted => 1, ); test_data( @@ -149,3 +151,21 @@ test_data( 843b9ebccf16a498fba623c78f21b6c0 ) ], ); + +# check logically deleted + +$isis = IsisDB->new ( + isisdb => './data/winisis/BIBL', + include_deleted => 1, +); + +ok($isis->fetch(3), "deleted found"); +cmp_ok($isis->{deleted}, '==', 3, "MFN 3 is deleted"); + +$isis = IsisDB->new ( + isisdb => './data/winisis/BIBL', +); + +ok(! $isis->fetch(3), "deleted not found"); +cmp_ok($isis->{deleted}, '==', 3, "MFN 3 is deleted"); + -- 2.20.1