/[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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 336 - (hide annotations)
Sat Dec 31 16:28:18 2005 UTC (18 years, 4 months ago) by dpavlin
File size: 2977 byte(s)
 r341@llin:  dpavlin | 2005-12-31 17:31:33 +0100
 fix possible corruption of fields < 100

1 dpavlin 6 package WebPAC::Input::ISIS;
2    
3     use warnings;
4     use strict;
5    
6 dpavlin 285 use WebPAC::Input;
7    
8 dpavlin 6 =head1 NAME
9    
10 dpavlin 285 WebPAC::Input::ISIS - support for CDS/ISIS database files
11 dpavlin 6
12     =head1 VERSION
13    
14 dpavlin 286 Version 0.03
15 dpavlin 6
16     =cut
17    
18 dpavlin 286 our $VERSION = '0.03';
19 dpavlin 6
20    
21     =head1 SYNOPSIS
22    
23 dpavlin 285 Open CDS/ISIS, WinISIS or IsisMarc database using C<Biblio::Isis> or
24     C<OpenIsis> module and read all records to memory.
25 dpavlin 6
26     my $isis = new WebPAC::Input::ISIS();
27 dpavlin 285 $isis->open( path => '/path/to/ISIS/ISIS' );
28 dpavlin 6
29     =head1 FUNCTIONS
30    
31 dpavlin 285 =head2 init
32 dpavlin 6
33 dpavlin 285 Autoconfigure this module to use C<Biblio::Isis> or C<OpenIsis>.
34 dpavlin 6
35 dpavlin 285 =cut
36 dpavlin 6
37 dpavlin 285 sub init {
38     my $self = shift;
39 dpavlin 6
40 dpavlin 298 eval "use Biblio::Isis;";
41 dpavlin 285 unless ($@) {
42     $self->{have_biblio_isis} = 1
43     } else {
44     eval "use OpenIsis;";
45     $self->{have_openisis} = 1 unless ($@);
46     }
47     }
48 dpavlin 6
49 dpavlin 285 =head2 open_db
50 dpavlin 6
51 dpavlin 285 Returns handle to database
52 dpavlin 6
53 dpavlin 285 my $db = $open_db(
54     path => '/path/to/LIBRI'
55     }
56    
57 dpavlin 6 =cut
58    
59 dpavlin 285 sub open_db {
60 dpavlin 6 my $self = shift;
61 dpavlin 285
62 dpavlin 6 my $arg = {@_};
63    
64     my $log = $self->_get_logger();
65    
66 dpavlin 285 $log->info("opening ISIS database '$arg->{path}'");
67 dpavlin 6
68 dpavlin 21 my ($isis_db,$db_size);
69 dpavlin 6
70 dpavlin 285 if ($self->{have_openisis}) {
71 dpavlin 6 $log->debug("using OpenIsis perl bindings");
72 dpavlin 285 $isis_db = OpenIsis::open($arg->{path});
73 dpavlin 21 $db_size = OpenIsis::maxRowid( $isis_db ) || 1;
74 dpavlin 285 } elsif ($self->{have_biblio_isis}) {
75 dpavlin 6 $log->debug("using Biblio::Isis");
76     use Biblio::Isis;
77     $isis_db = new Biblio::Isis(
78 dpavlin 285 isisdb => $arg->{path},
79 dpavlin 6 include_deleted => 1,
80     hash_filter => sub {
81     my $l = shift || return;
82 dpavlin 285 $l = $self->{iconv}->convert($l) if ($self->{iconv});
83 dpavlin 6 return $l;
84     },
85 dpavlin 285 ) or $log->logdie("can't find database $arg->{path}");
86 dpavlin 265
87 dpavlin 21 $db_size = $isis_db->count;
88 dpavlin 6
89     } else {
90     $log->logdie("Can't find supported ISIS library for perl. I suggent that you install Bilbio::Isis from CPAN.");
91     }
92    
93 dpavlin 285 return ($isis_db, $db_size);
94     }
95 dpavlin 6
96 dpavlin 285 =head2 fetch_rec
97 dpavlin 6
98 dpavlin 285 Return record with ID C<$mfn> from database
99 dpavlin 6
100 dpavlin 285 my $rec = $self->fetch_rec( $db, $mfn );
101 dpavlin 6
102 dpavlin 285 }
103 dpavlin 21
104 dpavlin 285 =cut
105 dpavlin 6
106 dpavlin 285 sub fetch_rec {
107     my $self = shift;
108 dpavlin 6
109 dpavlin 285 my ($isis_db, $mfn) = @_;
110 dpavlin 6
111 dpavlin 285 my $rec;
112 dpavlin 6
113 dpavlin 285 if ($self->{have_openisis}) {
114 dpavlin 6
115 dpavlin 285 # read record using OpenIsis
116     my $row = OpenIsis::read( $isis_db, $mfn );
117 dpavlin 6
118 dpavlin 285 # convert record to hash
119     foreach my $k (keys %{$row}) {
120     if ($k ne "mfn") {
121     foreach my $l (@{$row->{$k}}) {
122     $l = $self->{iconv}->convert($l) if ($self->{iconv});
123     # has subfields?
124     my $val;
125     if ($l =~ m/\^/) {
126     foreach my $t (split(/\^/,$l)) {
127     next if (! $t);
128     $val->{substr($t,0,1)} = substr($t,1);
129 dpavlin 6 }
130 dpavlin 285 } else {
131     $val = $l;
132 dpavlin 6 }
133 dpavlin 336 push @{$rec->{"$k"}}, $val;
134 dpavlin 6 }
135 dpavlin 285 } else {
136     push @{$rec->{'000'}}, $mfn;
137 dpavlin 6 }
138     }
139    
140 dpavlin 285 } elsif ($self->{have_biblio_isis}) {
141     $rec = $isis_db->to_hash($mfn);
142 dpavlin 6 } else {
143 dpavlin 285 $self->_get_logger()->logdie("hum? implementation missing?");
144 dpavlin 6 }
145    
146 dpavlin 285 return $rec;
147 dpavlin 6 }
148    
149     =head1 AUTHOR
150    
151     Dobrica Pavlinusic, C<< <dpavlin@rot13.org> >>
152    
153     =head1 COPYRIGHT & LICENSE
154    
155     Copyright 2005 Dobrica Pavlinusic, All Rights Reserved.
156    
157     This program is free software; you can redistribute it and/or modify it
158     under the same terms as Perl itself.
159    
160     =cut
161    
162     1; # End of WebPAC::Input::ISIS

  ViewVC Help
Powered by ViewVC 1.1.26