major improvments and new version:
authorDobrica Pavlinusic <dpavlin@rot13.org>
Fri, 31 Dec 2004 05:43:20 +0000 (05:43 +0000)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Fri, 31 Dec 2004 05:43:20 +0000 (05:43 +0000)
- 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
data/winisis/BIBL.XRF
data/winisis/BIBL.mst
t/002_isis.t

index 6f31967..222e122 100644 (file)
--- 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'};
 }
index 9c118e0..ff6c13a 100644 (file)
Binary files a/data/winisis/BIBL.XRF and b/data/winisis/BIBL.XRF differ
index 27551e3..4279615 100644 (file)
Binary files a/data/winisis/BIBL.mst and b/data/winisis/BIBL.mst differ
index 078f5b0..fa8a709 100755 (executable)
@@ -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");
+