Deduce file names and extensions using glob case insesitive. This fixes
authorDobrica Pavlinusic <dpavlin@rot13.org>
Thu, 30 Dec 2004 22:40:53 +0000 (22:40 +0000)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Thu, 30 Dec 2004 22:40:53 +0000 (22:40 +0000)
potential problem with extension names.
Extracted code to read .CNT file into read_cnt function.

git-svn-id: file:///home/dpavlin/svn/Biblio-Isis/trunk@18 4670fa4d-42ec-0310-ab5b-a66af6943492

IsisDB.pm
Makefile.PL

index dd38c82..c30e0ad 100644 (file)
--- a/IsisDB.pm
+++ b/IsisDB.pm
@@ -2,12 +2,14 @@ package IsisDB;
 use strict;
 
 use Carp;
 use strict;
 
 use Carp;
+use File::Glob qw(:globally :nocase);
+
 use Data::Dumper;
 
 BEGIN {
        use Exporter ();
        use vars qw ($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
 use Data::Dumper;
 
 BEGIN {
        use Exporter ();
        use vars qw ($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
-       $VERSION     = 0.06;
+       $VERSION     = 0.07;
        @ISA         = qw (Exporter);
        #Give a hoot don't pollute, do not export more than needed by default
        @EXPORT      = qw ();
        @ISA         = qw (Exporter);
        #Give a hoot don't pollute, do not export more than needed by default
        @EXPORT      = qw ();
@@ -96,7 +98,8 @@ Options are described below:
 =item isisdb
 
 This is full or relative path to ISIS database files which include
 =item isisdb
 
 This is full or relative path to ISIS database files which include
-common prefix of C<.FDT>, C<.MST>, C<.CNT>, C<.XRF> and C<.MST> files.
+common prefix of C<.MST>, and C<.XRF> and optionally C<.FDT> (if using
+C<read_fdt> option) files.
 
 In this example it uses C<./cds/cds.MST> and related files.
 
 
 In this example it uses C<./cds/cds.MST> and related files.
 
@@ -134,13 +137,29 @@ sub new {
                $self->{$v} = {@_}->{$v};
        }
 
                $self->{$v} = {@_}->{$v};
        }
 
+       my @isis_files = grep(/\.(FDT|MST|XRF|CNT)$/i,glob($self->{isisdb}."*"));
+
+       foreach my $f (@isis_files) {
+               my $ext = $1 if ($f =~ m/\.(\w\w\w)$/);
+               $self->{lc($ext)."_file"} = $f;
+       }
+
+       my @must_exist = qw(mst xrf);
+       push @must_exist, "fdt" if ($self->{read_fdt});
+
+       foreach my $ext (@must_exist) {
+               confess "missing ",uc($ext)," file in ",$self->{isisdb} unless ($self->{$ext."_file"});
+       }
+
+       print STDERR "## using files: ",join(" ",@isis_files),"\n" if ($self->{debug});
+
        # if you want to read .FDT file use read_fdt argument when creating class!
        # if you want to read .FDT file use read_fdt argument when creating class!
-       if ({@_}->{read_fdt} && -e $self->{isisdb}.".FDT") {
+       if ($self->{read_fdt} && -e $self->{fdt_file}) {
 
                # read the $db.FDT file for tags
                my $fieldzone=0;
 
 
                # read the $db.FDT file for tags
                my $fieldzone=0;
 
-               open(fileFDT, $self->{isisdb}.".FDT") || croak "can't read '$self->{isisdb}.FDT': $!";
+               open(fileFDT, $self->{fdt_file}) || croak "can't read '$self->{fdt_file}': $!";
 
                while (<fileFDT>) {
                        chomp;
 
                while (<fileFDT>) {
                        chomp;
@@ -164,7 +183,7 @@ sub new {
 
        # Get the Maximum MFN from $db.MST
 
 
        # Get the Maximum MFN from $db.MST
 
-       open(fileMST,$self->{isisdb}.".MST") || croak "can't read '$self->{isisdb}.MST': $!";
+       open($self->{'fileMST'}, $self->{mst_file}) || croak "can't open '$self->{mst_file}': $!";
 
        # MST format:   (* = 32 bit signed)
        # CTLMFN*       always 0
 
        # MST format:   (* = 32 bit signed)
        # CTLMFN*       always 0
@@ -172,21 +191,44 @@ sub new {
        # NXTMFB*       last block allocated to master file
        # NXTMFP        offset to next available position in last block
        # MFTYPE        always 0 for user db file (1 for system)
        # NXTMFB*       last block allocated to master file
        # NXTMFP        offset to next available position in last block
        # MFTYPE        always 0 for user db file (1 for system)
-       seek(fileMST,4,0);
+       seek($self->{'fileMST'},4,0);
 
        my $buff;
 
 
        my $buff;
 
-       read(fileMST, $buff, 4);
+       read($self->{'fileMST'}, $buff, 4);
        $self->{'NXTMFN'}=unpack("l",$buff) || carp "NXTNFN is zero";
 
        # save maximum MFN
        $self->{'maxmfn'} = $self->{'NXTMFN'} - 1;
 
        $self->{'NXTMFN'}=unpack("l",$buff) || carp "NXTNFN is zero";
 
        # save maximum MFN
        $self->{'maxmfn'} = $self->{'NXTMFN'} - 1;
 
-       close(fileMST);
+
+
+
+       print STDERR Dumper($self),"\n" if ($self->{debug});
+
+       # open files for later
+       open($self->{'fileXRF'}, $self->{xrf_file}) || croak "can't open '$self->{xrf_file}': $!";
+
+       $self ? return $self : return undef;
+}
+
+=head2 read_cnt
+
+This function is not really used by module, but can be useful to find info
+about your index (if debugging it for example).
+
+  print Dumper($isis->read_cnt);
+
+=cut
+
+sub read_cnt  {
+       my $self = shift;
+
+       confess "missing CNT file in ",$self->{isisdb} unless ($self->{cnt_file});
 
        # Get the index information from $db.CNT
    
 
        # Get the index information from $db.CNT
    
-       open(fileCNT, $self->{isisdb}.".CNT") || croak "can't read '$self->{isisdb}.CNT': $!";
+       open(fileCNT, $self->{cnt_file}) || croak "can't read '$self->{cnt_file}': $!";
 
        # There is two 26 Bytes fixed lenght records
 
 
        # There is two 26 Bytes fixed lenght records
 
@@ -214,27 +256,21 @@ sub new {
 
                my $IDTYPE = shift @arr;
                foreach (@flds) {
 
                my $IDTYPE = shift @arr;
                foreach (@flds) {
-                       $self->{$IDTYPE}->{$_} = abs(shift @arr);
+                       $self->{cnt}->{$IDTYPE}->{$_} = abs(shift @arr);
                }
        }
 
                }
        }
 
+       my $buff;
+
        read(fileCNT, $buff, 26);
        $self->unpack_cnt($buff);
 
        read(fileCNT, $buff, 26);
        $self->unpack_cnt($buff);
 
        read(fileCNT, $buff, 26);
        $self->unpack_cnt($buff);
 
        read(fileCNT, $buff, 26);
        $self->unpack_cnt($buff);
 
-
        close(fileCNT);
 
        close(fileCNT);
 
-       print STDERR Dumper($self),"\n" if ($self->{debug});
-
-       # open files for later
-       open($self->{'fileXRF'}, $self->{isisdb}.".XRF") || croak "can't open '$self->{isisdb}.XRF': $!";
-
-       open($self->{'fileMST'}, $self->{isisdb}.".MST") || croak "can't open '$self->{isisdb}.MST': $!";
-
-       $self ? return $self : return undef;
+       return $self->{cnt};
 }
 
 =head2 fetch
 }
 
 =head2 fetch
@@ -267,7 +303,7 @@ sub fetch {
        # XXX check this?
        my $mfnpos=($mfn+int(($mfn-1)/127))*4;
 
        # XXX check this?
        my $mfnpos=($mfn+int(($mfn-1)/127))*4;
 
-       print STDERR "## seeking to $mfnpos in file '$self->{isisdb}.XRF'\n" if ($self->{debug});
+       print STDERR "## seeking to $mfnpos in file '$self->{xrf_file}'\n" if ($self->{debug});
        seek($self->{'fileXRF'},$mfnpos,0);
 
        my $buff;
        seek($self->{'fileXRF'},$mfnpos,0);
 
        my $buff;
@@ -374,7 +410,6 @@ sub fetch {
 
                push @{$self->{record}->{$FieldTAG[$i]}}, substr($buff,$FieldPOS[$i],$FieldLEN[$i]);
        }
 
                push @{$self->{record}->{$FieldTAG[$i]}}, substr($buff,$FieldPOS[$i],$FieldLEN[$i]);
        }
-       close(fileMST);
 
        $self->{'current_mfn'} = $mfn;
 
 
        $self->{'current_mfn'} = $mfn;
 
index b1f2135..98b2f60 100644 (file)
@@ -9,6 +9,7 @@ WriteMakefile(
        PREREQ_PM => {
                'Test::Simple' => 0.44,
                'Carp' => 0,
        PREREQ_PM => {
                'Test::Simple' => 0.44,
                'Carp' => 0,
+               'File::Glob' => 0,
        },
        depend => {
                dist => 'changelog',
        },
        depend => {
                dist => 'changelog',