/[webpac2]/trunk/lib/WebPAC/Input/ISIS.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/lib/WebPAC/Input/ISIS.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 6 by dpavlin, Sat Jul 16 14:44:38 2005 UTC revision 615 by dpavlin, Wed Aug 23 14:28:48 2006 UTC
# Line 3  package WebPAC::Input::ISIS; Line 3  package WebPAC::Input::ISIS;
3  use warnings;  use warnings;
4  use strict;  use strict;
5    
6  use WebPAC::Common;  use WebPAC::Input;
 use base qw/WebPAC::Input WebPAC::Common/;  
7    
8  =head1 NAME  =head1 NAME
9    
10  WebPAC::Input::ISIS - support for CDS/ISIS source files  WebPAC::Input::ISIS - support for CDS/ISIS database files
11    
12  =head1 VERSION  =head1 VERSION
13    
14  Version 0.01  Version 0.04
15    
16  =cut  =cut
17    
18  our $VERSION = '0.01';  our $VERSION = '0.04';
19    
20    
 # auto-configure  
   
 my ($have_biblio_isis, $have_openisis) = (0,0);  
   
 eval "use Biblio::Isis 0.13;";  
 unless ($@) {  
         $have_biblio_isis = 1  
 } else {  
         eval "use OpenIsis;";  
         $have_openisis = 1 unless ($@);  
 }  
   
21  =head1 SYNOPSIS  =head1 SYNOPSIS
22    
23  Open CDS/ISIS, WinISIS or IsisMarc database using Biblio::Isis or OpenIsis  Open CDS/ISIS, WinISIS or IsisMarc database using C<Biblio::Isis> or
24  module and read all records to memory.  C<OpenIsis> module and read all records to memory.
25    
26   my $isis = new WebPAC::Input::ISIS();   my $isis = new WebPAC::Input::ISIS();
27   $isis->open( filename => '/path/to/ISIS/ISIS' );   $isis->open( path => '/path/to/ISIS/ISIS' );
28    
29  =head1 FUNCTIONS  =head1 FUNCTIONS
30    
31  =head2 open  =head2 init
32    
33  This function will read whole database in memory and produce lookups.  Autoconfigure this module to use C<Biblio::Isis> or C<OpenIsis>.
34    
35    =cut
36    
37    sub init {
38            my $self = shift;
39    
40   $isis->open(          eval "use Biblio::Isis;";
41          filename => '/data/ISIS/ISIS',          unless ($@) {
42          code_page => '852',                  $self->{have_biblio_isis} = 1
43          limit_mfn => 500,          } else {
44          start_mfn => 6000,                  eval "use OpenIsis;";
45          lookup => $lookup_obj,                  $self->{have_openisis} = 1 unless ($@);
46   );          }
47    }
48    
49  By default, ISIS code page is assumed to be C<852>.  =head2 open_db
50    
51  If optional parametar C<start_mfn> is set, this will be first MFN to read  Returns handle to database and size in records
 from database (so you can skip beginning of your database if you need to).  
52    
53  If optional parametar C<limit_mfn> is set, it will read just 500 records    my ($db,$size) = $isis->open_db(
54  from database in example above.          path => '/path/to/LIBRI'
55            filter => sub {
56                    my ($l,$field_nr) = @_;
57                    # do something with $l which is line of input file
58                    return $l;
59            },
60      }
61    
62  Returns number of last record read into memory (size of database, really).  Options:
63    
64  =cut  =over 4
65    
66  sub open {  =item path
         my $self = shift;  
         my $arg = {@_};  
67    
68          my $log = $self->_get_logger();  path to CDS/ISIS database
69    
70          $log->logcroak("need filename") if (! $arg->{'filename'});  =back
         my $code_page = $arg->{'code_page'} || '852';  
71    
72          $log->logdie("can't find database ",$arg->{'filename'}) unless (glob($arg->{'filename'}.'.*'));  =cut
73    
74          # store data in object  sub open_db {
75          $self->{'isis_filename'} = $arg->{'filename'};          my $self = shift;
         $self->{'isis_code_page'} = $code_page;  
76    
77          #$self->{'isis_code_page'} = $code_page;          my $arg = {@_};
78    
79          # create Text::Iconv object          my $log = $self->_get_logger();
         my $cp = Text::Iconv->new($code_page,$self->{'code_page'});  
80    
81          $log->info("reading ISIS database '",$arg->{'filename'},"'");          $log->info("opening ISIS database '$arg->{path}'");
         $log->debug("isis code page: $code_page");  
82    
83          my ($isis_db,$maxmfn);          my ($isis_db,$db_size);
84    
85          if ($have_openisis) {          if ($self->{have_openisis}) {
86                  $log->debug("using OpenIsis perl bindings");                  $log->debug("using OpenIsis perl bindings");
87                  $isis_db = OpenIsis::open($arg->{'filename'});                  $isis_db = OpenIsis::open($arg->{path});
88                  $maxmfn = OpenIsis::maxRowid( $isis_db ) || 1;                  $db_size = OpenIsis::maxRowid( $isis_db ) || 1;
89          } elsif ($have_biblio_isis) {          } elsif ($self->{have_biblio_isis}) {
90                  $log->debug("using Biblio::Isis");                  $log->debug("using Biblio::Isis");
91                  use Biblio::Isis;                  use Biblio::Isis;
92                  $isis_db = new Biblio::Isis(                  $isis_db = new Biblio::Isis(
93                          isisdb => $arg->{'filename'},                          isisdb => $arg->{path},
94                          include_deleted => 1,                          include_deleted => 1,
95                          hash_filter => sub {                          hash_filter => $arg->{filter} ? sub { return $arg->{filter}->(@_); } : undef,
96                                  my $l = shift || return;                  ) or $log->logdie("can't find database $arg->{path}");
                                 $l = $cp->convert($l);  
                                 return $l;  
                         },  
                 );  
                 $maxmfn = $isis_db->count;  
   
                 unless ($maxmfn) {  
                         $log->logwarn("no records in database ", $arg->{'filename'}, ", skipping...");  
                         return;  
                 }  
   
         } else {  
                 $log->logdie("Can't find supported ISIS library for perl. I suggent that you install Bilbio::Isis from CPAN.");  
         }  
97    
98                    $db_size = $isis_db->count;
99    
         my $startmfn = 1;  
   
         if (my $s = $self->{'start_mfn'}) {  
                 $log->info("skipping to MFN $s");  
                 $startmfn = $s;  
100          } else {          } else {
101                  $self->{'start_mfn'} = $startmfn;                  $log->logdie("Can't find supported ISIS library for perl. I suggent that you install Bilbio::Isis from CPAN.");
         }  
   
         $maxmfn = $startmfn + $self->{limit_mfn} if ($self->{limit_mfn});  
   
         $log->info("processing ",($maxmfn-$startmfn)." records using ",( $have_openisis ? 'OpenIsis' : 'Biblio::Isis'));  
   
   
         # read database  
         for (my $mfn = $startmfn; $mfn <= $maxmfn; $mfn++) {  
   
                 $log->debug("mfn: $mfn\n");  
   
                 my $rec;  
   
                 if ($have_openisis) {  
   
                         # read record using OpenIsis  
                         my $row = OpenIsis::read( $isis_db, $mfn );  
                         foreach my $k (keys %{$row}) {  
                                 if ($k ne "mfn") {  
                                         foreach my $l (@{$row->{$k}}) {  
                                                 $l = $cp->convert($l);  
                                                 # has subfields?  
                                                 my $val;  
                                                 if ($l =~ m/\^/) {  
                                                         foreach my $t (split(/\^/,$l)) {  
                                                                 next if (! $t);  
                                                                 $val->{substr($t,0,1)} = substr($t,1);  
                                                         }  
                                                 } else {  
                                                         $val = $l;  
                                                 }  
   
                                                 push @{$rec->{$k}}, $val;  
                                         }  
                                 } else {  
                                         push @{$rec->{'000'}}, $mfn;  
                                 }  
                         }  
   
                 } elsif ($have_biblio_isis) {  
                         $rec = $isis_db->to_hash($mfn);  
                 } else {  
                         $log->logdie("hum? implementation missing?");  
                 }  
   
                 $log->confess("record $mfn empty?") unless ($rec);  
   
                 # store  
                 if ($self->{'low_mem'}) {  
                         $self->{'db'}->put($mfn, $rec);  
                 } else {  
                         $self->{'data'}->{$mfn} = $rec;  
                 }  
   
                 # create lookup  
                 $self->{'lookup'}->add( $rec ) if ($self->{'lookup'} && can($self->{'lookup'}->add));  
   
                 $self->progress_bar($mfn,$maxmfn);  
   
102          }          }
103    
104          $self->{'current_mfn'} = -1;          return ($isis_db, $db_size);
         $self->{'last_pcnt'} = 0;  
   
         $log->debug("max mfn: $maxmfn");  
   
         # store max mfn and return it.  
         return $self->{'max_mfn'} = $maxmfn;  
105  }  }
106    
107  =head2 fetch_rec  =head2 fetch_rec
108    
109  Fetch next record from database. It will also displays progress bar.  Return record with ID C<$mfn> from database
110    
111   my $rec = $webpac->fetch_rec;    my $rec = $self->fetch_rec( $db, $mfn );
112    
113  =cut  =cut
114    
115  sub fetch_rec {  sub fetch_rec {
116          my $self = shift;          my $self = shift;
117    
118          my $log = $self->_get_logger();          my ($isis_db, $mfn) = @_;
   
         $log->logconfess("it seems that you didn't load database!") unless ($self->{'current_mfn'});  
119    
120          if ($self->{'current_mfn'} == -1) {          my $rec;
                 $self->{'current_mfn'} = $self->{'start_mfn'};  
         } else {  
                 $self->{'current_mfn'}++;  
         }  
121    
122          my $mfn = $self->{'current_mfn'};          if ($self->{have_openisis}) {
123    
124          if ($mfn > $self->{'max_mfn'}) {                  # read record using OpenIsis
125                  $self->{'current_mfn'} = $self->{'max_mfn'};                  my $row = OpenIsis::read( $isis_db, $mfn );
                 $log->debug("at EOF");  
                 return;  
         }  
126    
127          $self->progress_bar($mfn,$self->{'max_mfn'});                  # convert record to hash
128                    foreach my $k (keys %{$row}) {
129                            if ($k ne "mfn") {
130                                    foreach my $l (@{$row->{$k}}) {
131                                            $l = $self->{iconv}->convert($l) if ($self->{iconv});
132                                            # has subfields?
133                                            my $val;
134                                            if ($l =~ m/\^/) {
135                                                    foreach my $t (split(/\^/,$l)) {
136                                                            next if (! $t);
137                                                            $val->{substr($t,0,1)} = substr($t,1);
138                                                    }
139                                            } else {
140                                                    $val = $l;
141                                            }
142                                            push @{$rec->{"$k"}}, $val;
143                                    }
144                            } else {
145                                    push @{$rec->{'000'}}, $mfn;
146                            }
147                    }
148    
149          if ($self->{'low_mem'}) {          } elsif ($self->{have_biblio_isis}) {
150                  return $self->{'db'}->get($mfn);                  $rec = $isis_db->to_hash({
151                            mfn => $mfn,
152                            include_subfields => 1
153                    });
154          } else {          } else {
155                  return $self->{'data'}->{$mfn};                  $self->_get_logger()->logdie("hum? implementation missing?");
156          }          }
 }  
   
 =head2 mfn  
   
 Returns current record number (MFN).  
157    
158   print $webpac->mfn;          return $rec;
   
 =cut  
   
 sub mfn {  
         my $self = shift;  
         return $self->{'current_mfn'};  
159  }  }
160    
161  =head1 AUTHOR  =head1 AUTHOR

Legend:
Removed from v.6  
changed lines
  Added in v.615

  ViewVC Help
Powered by ViewVC 1.1.26