/[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 597 - (hide annotations)
Thu Jul 13 11:54:33 2006 UTC (17 years, 10 months ago) by dpavlin
File size: 3135 byte(s)
 r831@llin:  dpavlin | 2006-07-13 13:56:19 +0200
 first cut in implementing modify_records using automatically generated regexpes

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 497 Returns handle to database and size in records
52 dpavlin 6
53 dpavlin 597 my ($db,$size) = $isis->open_db(
54 dpavlin 285 path => '/path/to/LIBRI'
55 dpavlin 597 filter => sub {
56     my ($l,$field_nr) = @_;
57     # do something with $l which is line of input file
58     return $l;
59     },
60 dpavlin 285 }
61    
62 dpavlin 597 Options:
63    
64     =over 4
65    
66     =item path
67    
68     path to CDS/ISIS database
69    
70     =back
71    
72 dpavlin 6 =cut
73    
74 dpavlin 285 sub open_db {
75 dpavlin 6 my $self = shift;
76 dpavlin 285
77 dpavlin 6 my $arg = {@_};
78    
79     my $log = $self->_get_logger();
80    
81 dpavlin 285 $log->info("opening ISIS database '$arg->{path}'");
82 dpavlin 6
83 dpavlin 21 my ($isis_db,$db_size);
84 dpavlin 6
85 dpavlin 285 if ($self->{have_openisis}) {
86 dpavlin 6 $log->debug("using OpenIsis perl bindings");
87 dpavlin 285 $isis_db = OpenIsis::open($arg->{path});
88 dpavlin 21 $db_size = OpenIsis::maxRowid( $isis_db ) || 1;
89 dpavlin 285 } elsif ($self->{have_biblio_isis}) {
90 dpavlin 6 $log->debug("using Biblio::Isis");
91     use Biblio::Isis;
92     $isis_db = new Biblio::Isis(
93 dpavlin 285 isisdb => $arg->{path},
94 dpavlin 6 include_deleted => 1,
95 dpavlin 597 hash_filter => $arg->{filter} ? sub { return $arg->{filter}->(@_); } : undef,
96 dpavlin 285 ) or $log->logdie("can't find database $arg->{path}");
97 dpavlin 265
98 dpavlin 21 $db_size = $isis_db->count;
99 dpavlin 6
100     } else {
101     $log->logdie("Can't find supported ISIS library for perl. I suggent that you install Bilbio::Isis from CPAN.");
102     }
103    
104 dpavlin 285 return ($isis_db, $db_size);
105     }
106 dpavlin 6
107 dpavlin 285 =head2 fetch_rec
108 dpavlin 6
109 dpavlin 285 Return record with ID C<$mfn> from database
110 dpavlin 6
111 dpavlin 285 my $rec = $self->fetch_rec( $db, $mfn );
112 dpavlin 6
113 dpavlin 285 =cut
114 dpavlin 6
115 dpavlin 285 sub fetch_rec {
116     my $self = shift;
117 dpavlin 6
118 dpavlin 285 my ($isis_db, $mfn) = @_;
119 dpavlin 6
120 dpavlin 285 my $rec;
121 dpavlin 6
122 dpavlin 285 if ($self->{have_openisis}) {
123 dpavlin 6
124 dpavlin 285 # read record using OpenIsis
125     my $row = OpenIsis::read( $isis_db, $mfn );
126 dpavlin 6
127 dpavlin 285 # 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 dpavlin 6 }
139 dpavlin 285 } else {
140     $val = $l;
141 dpavlin 6 }
142 dpavlin 336 push @{$rec->{"$k"}}, $val;
143 dpavlin 6 }
144 dpavlin 285 } else {
145     push @{$rec->{'000'}}, $mfn;
146 dpavlin 6 }
147     }
148    
149 dpavlin 285 } elsif ($self->{have_biblio_isis}) {
150     $rec = $isis_db->to_hash($mfn);
151 dpavlin 6 } else {
152 dpavlin 285 $self->_get_logger()->logdie("hum? implementation missing?");
153 dpavlin 6 }
154    
155 dpavlin 285 return $rec;
156 dpavlin 6 }
157    
158     =head1 AUTHOR
159    
160     Dobrica Pavlinusic, C<< <dpavlin@rot13.org> >>
161    
162     =head1 COPYRIGHT & LICENSE
163    
164     Copyright 2005 Dobrica Pavlinusic, All Rights Reserved.
165    
166     This program is free software; you can redistribute it and/or modify it
167     under the same terms as Perl itself.
168    
169     =cut
170    
171     1; # End of WebPAC::Input::ISIS

  ViewVC Help
Powered by ViewVC 1.1.26