mostly documentation improvements, but also nicer output and field names
authorDobrica Pavlinusic <dpavlin@rot13.org>
Wed, 29 Dec 2004 22:46:40 +0000 (22:46 +0000)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Wed, 29 Dec 2004 22:46:40 +0000 (22:46 +0000)
output (using .FDT file) in to_ascii if read_fdt is specified

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

IsisDB.pm
MANIFEST
scripts/dump_isis.pl
scripts/dump_openisis.pl

index c5c6220..87709db 100644 (file)
--- a/IsisDB.pm
+++ b/IsisDB.pm
@@ -7,7 +7,7 @@ use Data::Dumper;
 BEGIN {
        use Exporter ();
        use vars qw ($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
-       $VERSION     = 0.04;
+       $VERSION     = 0.05;
        @ISA         = qw (Exporter);
        #Give a hoot don't pollute, do not export more than needed by default
        @EXPORT      = qw ();
@@ -18,7 +18,7 @@ BEGIN {
 
 =head1 NAME
 
-IsisDB - Read CDS/ISIS database
+IsisDB - Read CDS/ISIS, WinISIS and IsisMarc database
 
 =head1 SYNOPSIS
 
@@ -34,17 +34,28 @@ IsisDB - Read CDS/ISIS database
 
 =head1 DESCRIPTION
 
-This module will read CDS/ISIS databases and create hash values out of it.
-It can be used as perl-only alternative to OpenIsis module.
+This module will read ISIS databases created by DOS CDS/ISIS, WinIsis or
+IsisMarc. It can be used as perl-only alternative to OpenIsis module.
 
-This will module will always be slower that OpenIsis module which use C
-library. However, since it's written in perl, it's platform independent (so
-you don't need C compiler), and can be easily modified.
+It can create hash values from data in ISIS database (using C<to_hash>),
+ASCII dump (using C<to_ascii>) or just hash with field names and packed
+values (like C<^asomething^belse>).
 
 Unique feature of this module is ability to C<include_deleted> records.
 It will also skip zero sized fields (OpenIsis has a bug in XS bindings, so
 fields which are zero sized will be filled with random junk from memory).
 
+It also has support for identifiers (only if ISIS database is created by
+IsisMarc), see C<to_hash>.
+
+This will module will always be slower than OpenIsis module which use C
+library. However, since it's written in perl, it's platform independent (so
+you don't need C compiler), and can be easily modified. I hope that it
+creates data structures which are easier to use than ones created by
+OpenIsis, so reduced time in other parts of the code should compensate for
+slower performance of this module (speed of reading ISIS database is
+rarely an issue).
+
 =head1 METHODS
 
 =cut
@@ -65,7 +76,7 @@ fields which are zero sized will be filled with random junk from memory).
 
 =head2 new
 
-Open CDS/ISIS database
+Open ISIS database
 
  my $isis = new IsisDB(
        isisdb => './cds/cds',
@@ -84,8 +95,10 @@ Options are described below:
 
 =item isisdb
 
-Prefix path to CDS/ISIS. It should contain full or relative path to database
-and common prefix of C<.FDT>, C<.MST>, C<.CNT>, C<.XRF> and C<.MST> files.
+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.
+
+In this example it uses C<./cds/cds.MST> and related files.
 
 =item read_fdt
 
@@ -214,7 +227,7 @@ sub new {
 
        close(fileCNT);
 
-       print Dumper($self) if ($self->{debug});
+       print Dumper($self),"\n" if ($self->{debug});
 
        # open files for later
        open($self->{'fileXRF'}, $self->{isisdb}.".XRF") || croak "can't open '$self->{isisdb}.XRF': $!";
@@ -231,7 +244,12 @@ Read record with selected MFN
   my $rec = $isis->fetch(55);
 
 Returns hash with keys which are field names and values are unpacked values
-for that field (like C<^asometing^bsomething else>)
+for that field like this:
+
+  $rec = {
+    '210' => [ '^aNew York^cNew York University press^dcop. 1988' ],
+    '990' => [ '2140', '88', 'HAY' ],
+  };
 
 =cut
 
@@ -355,16 +373,26 @@ print ("Error: The MFN:".$mfn." is not found in MST(".$value.")");
        }
        close(fileMST);
 
-       print Dumper($self) if ($self->{debug});
+       print Dumper($self),"\n" if ($self->{debug});
 
        return $self->{'record'};
 }
 
 =head2 to_ascii
 
-Dump ascii output of selected MFN
+Dump ASCII output of record with specified MFN
 
-  print $isis->to_ascii(55);
+  print $isis->to_ascii(42);
+
+It outputs something like this:
+
+  210  ^aNew York^cNew York University press^dcop. 1988
+  990  2140
+  990   88
+  990  HAY
+
+If C<read_fdt> is specified when calling C<new> it will display field names
+from C<.FDT> file instead of numeric tags.
 
 =cut
 
@@ -378,7 +406,8 @@ sub to_ascii {
        my $out = "0\t$mfn";
 
        foreach my $f (sort keys %{$rec}) {
-               $out .= "\n$f\t".join("\n$f\t",@{$self->{record}->{$f}});
+               my $fn = $self->tag_name($f);
+               $out .= "\n$fn\t".join("\n$fn\t",@{$self->{record}->{$f}});
        }
 
        $out .= "\n";
@@ -388,13 +417,13 @@ sub to_ascii {
 
 =head2 to_hash
 
-Read mfn and convert it to hash
+Read record with specified MFN and convert it to hash
 
   my $hash = $isis->to_hash($mfn);
 
 It has ability to convert characters (using C<hash_filter> from ISIS
-database before creating structures enabling character remapping or quick
-fixup of data.
+database before creating structures enabling character re-mapping or quick
+fix-up of data.
 
 This function returns hash which is like this:
 
@@ -413,7 +442,22 @@ This function returns hash which is like this:
              ],
   };
 
-You can later use that has to produce any output from ISIS data.
+You can later use that hash to produce any output from ISIS data.
+
+If database is created using IsisMarc, it will also have to special fields
+which will be used for identifiers, C<i1> and C<i2> like this:
+
+  '200' => [
+             {
+               'i1' => '1',
+               'i2' => ' '
+               'a' => 'Goa',
+               'f' => 'Valdo D\'Arienzo',
+               'e' => 'tipografie e tipografi nel XVI secolo',
+             }
+           ],
+
+This method will also create additional field C<000> with MFN.
 
 =cut
 
@@ -422,7 +466,9 @@ sub to_hash {
 
        my $mfn = shift || confess "need mfn!";
 
-       my $rec;
+       # init record to include MFN as field 000
+       my $rec = { '000' => $mfn };
+
        my $row = $self->fetch($mfn);
 
        foreach my $k (keys %{$row}) {
@@ -431,8 +477,12 @@ sub to_hash {
                        # filter output
                        $l = $self->{'hash_filter'}->($l) if ($self->{'hash_filter'});
 
-                       # has subfields?
                        my $val;
+
+                       # has identifiers?
+                       ($val->{'i1'},$val->{'i2'}) = ($1,$2) if ($l =~ s/^([01 #])([01 #])//);
+
+                       # has subfields?
                        if ($l =~ m/\^/) {
                                foreach my $t (split(/\^/,$l)) {
                                        next if (! $t);
@@ -449,23 +499,18 @@ sub to_hash {
        return $rec;
 }
 
-#
-# XXX porting from php left-over:
-#
-# do I *REALLY* need those methods, or should I use
-# $self->{something} directly?
-#
-# Probably direct usage is better!
-#
+=head2 tag_name
 
-sub TagName {
-       my $self = shift;
-       return $self->{TagName};
-}
+Return name of selected tag
+
+ print $isis->tag_name('200');
 
-sub NextMFN {
+=cut
+
+sub tag_name {
        my $self = shift;
-       return $self->{NXTMFN};
+       my $tag = shift || return;
+       return $self->{'TagName'}->{$tag} || $tag;
 }
 
 1;
@@ -481,8 +526,8 @@ This module has been very lightly tested. Use with caution and report bugs.
        dpavlin@rot13.org
        http://www.rot13.org/~dpavlin/
 
-This module is based heavily on code from LIBISIS.PHP - Library to read ISIS files V0.1.1
-written in php and (c) 2000 Franck Martin - <franck@sopac.org> released under LGPL.
+This module is based heavily on code from C<LIBISIS.PHP> library to read ISIS files V0.1.1
+written in php and (c) 2000 Franck Martin <franck@sopac.org> and released under LGPL.
 
 =head1 COPYRIGHT
 
@@ -495,5 +540,7 @@ LICENSE file included with this module.
 
 =head1 SEE ALSO
 
-L<http://www.openisis.org|OpenIsis>, perl(1).
+OpenIsis web site L<http://www.openisis.org>
+
+perl4lib site L<http://perl4lib.perl.org>
 
index 57708fa..2512cb5 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -7,3 +7,5 @@ t/001_load.t
 Makefile.PL
 scripts/dump_isis.pl
 scripts/dump_openisis.pl
+scripts/bench.pl
+t/999_pod.t
index ea59d0f..adbc250 100755 (executable)
@@ -13,12 +13,13 @@ my $isis = IsisDB->new (
        isisdb => $isisdb,
        debug => $debug,
        include_deleted => 1,
+#      read_fdt => 1,
 );
 
 print "rows: ",$isis->{'maxmfn'},"\n\n";
 
 for(my $mfn = 1; $mfn <= $isis->{'maxmfn'}; $mfn++) {
-       print STDERR Dumper($isis->to_hash($mfn)) if ($debug);
+       print STDERR Dumper($isis->to_hash($mfn)),"\n" if ($debug);
        print $isis->to_ascii($mfn),"\n";
 
 }
index 25e1d54..097d781 100755 (executable)
@@ -24,7 +24,7 @@ for (my $mfn = 1; $mfn <= $maxmfn; $mfn++) {
                                push @{$rec->{$f}}, OpenIsis::subfields($v);
                        }
                }
-               print STDERR Dumper($rec);
+               print STDERR Dumper($rec),"\n";
        }
        foreach my $k (sort keys %{$row}) {
                next if ($k eq 'mfn');