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);
- $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 ();
=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.
$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 ({@_}->{read_fdt} && -e $self->{isisdb}.".FDT") {
+ if ($self->{read_fdt} && -e $self->{fdt_file}) {
# 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;
# 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
# 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;
- 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;
- 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
- 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
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);
-
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
# 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;
push @{$self->{record}->{$FieldTAG[$i]}}, substr($buff,$FieldPOS[$i],$FieldLEN[$i]);
}
- close(fileMST);
$self->{'current_mfn'} = $mfn;