line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Biblio::ILL::GS; |
2
|
|
|
|
|
|
|
|
3
|
|
|
|
|
|
|
=head1 NAME |
4
|
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
Biblio::ILL::GS - Interlibrary Loan Generic Script (GS) |
6
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
=cut |
8
|
|
|
|
|
|
|
|
9
|
3
|
|
|
3
|
|
110171
|
use strict; |
|
3
|
|
|
|
|
8
|
|
|
3
|
|
|
|
|
108
|
|
10
|
3
|
|
|
3
|
|
16
|
use warnings; |
|
3
|
|
|
|
|
5
|
|
|
3
|
|
|
|
|
99
|
|
11
|
3
|
|
|
3
|
|
15
|
use Carp qw( carp croak ); |
|
3
|
|
|
|
|
12
|
|
|
3
|
|
|
|
|
2774
|
|
12
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
=head1 VERSION |
14
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
Version 0.05 |
16
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
=cut |
18
|
|
|
|
|
|
|
our $VERSION = '0.05'; |
19
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
my @validFields = ( |
21
|
|
|
|
|
|
|
'LSB', # Library Symbol, Borrower |
22
|
|
|
|
|
|
|
'LSP', # Lending library symbol |
23
|
|
|
|
|
|
|
'A#C', # Account number |
24
|
|
|
|
|
|
|
'P/U', # Patron name |
25
|
|
|
|
|
|
|
'N/R', # Need-before date |
26
|
|
|
|
|
|
|
'ADR', # Address or delivery service (multiple lines) |
27
|
|
|
|
|
|
|
'SER', # Service |
28
|
|
|
|
|
|
|
'AUT', # Author |
29
|
|
|
|
|
|
|
'TIT', # Title |
30
|
|
|
|
|
|
|
'P/L', # Place of publication |
31
|
|
|
|
|
|
|
'P/M', # Publisher |
32
|
|
|
|
|
|
|
'EDN', # Edition |
33
|
|
|
|
|
|
|
'DAT', # Publication date |
34
|
|
|
|
|
|
|
'LCN', # Local contron number |
35
|
|
|
|
|
|
|
'SBN', # ISBN |
36
|
|
|
|
|
|
|
'NUM', # Other numbers/letters (multiple lines) |
37
|
|
|
|
|
|
|
'#AD', # Other |
38
|
|
|
|
|
|
|
'SRC', # Source of your information |
39
|
|
|
|
|
|
|
'REM', # Remarks |
40
|
|
|
|
|
|
|
); |
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
=head1 SYNOPSIS |
43
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
use Biblio::ILL::GS; |
45
|
|
|
|
|
|
|
my $gs = new Biblio::ILL::GS; |
46
|
|
|
|
|
|
|
|
47
|
|
|
|
|
|
|
$gs->set("LSB", "MWPL" ); |
48
|
|
|
|
|
|
|
$gs->set("LSP", "BVAS" ); |
49
|
|
|
|
|
|
|
$gs->set("P/U", "Christensen, David" ); |
50
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
$gs->set( "ADR", |
52
|
|
|
|
|
|
|
"Public Library Services", |
53
|
|
|
|
|
|
|
"Interlibrary Loan Department", |
54
|
|
|
|
|
|
|
"1525 First Street South", |
55
|
|
|
|
|
|
|
"Brandon, MB R7A 7A1" |
56
|
|
|
|
|
|
|
); |
57
|
|
|
|
|
|
|
|
58
|
|
|
|
|
|
|
$gs->set("SER", "LOAN" ); |
59
|
|
|
|
|
|
|
$gs->set("AUT", "Wall, Larry" ); |
60
|
|
|
|
|
|
|
$gs->set("TIT", "Programming Perl" ); |
61
|
|
|
|
|
|
|
$gs->set("P/L", "Cambridge, Mass." ); |
62
|
|
|
|
|
|
|
$gs->set("P/M", "O'Reilly" ); |
63
|
|
|
|
|
|
|
$gs->set("EDN", "2nd Ed." ); |
64
|
|
|
|
|
|
|
$gs->set("DAT", "2000" ); |
65
|
|
|
|
|
|
|
$gs->set("SBN", "0596000278" ); |
66
|
|
|
|
|
|
|
$gs->set("SRC", "TEST SCRIPT" ); |
67
|
|
|
|
|
|
|
$gs->set("REM", "This is a comment.", "And another comment." ); |
68
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
# ouptut our string |
70
|
|
|
|
|
|
|
print $gs->as_string(); |
71
|
|
|
|
|
|
|
|
72
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
=head1 DESCRIPTION |
74
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
Biblio::ILL::GS is a little bit of glue.... |
76
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
Our library web site (http://maplin.gov.mb.ca) uses Perl (of course) |
78
|
|
|
|
|
|
|
and Z39.50 to enable our libraries to search for and request items |
79
|
|
|
|
|
|
|
amongst themselves (and, for that matter, to/from the world at large). |
80
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
The basic procedue is: find the item, parse the resulting record, |
82
|
|
|
|
|
|
|
build a human-readable email out of it, and send it - all automagically. |
83
|
|
|
|
|
|
|
|
84
|
|
|
|
|
|
|
One of our libraries has moved to an interlibrary-loan management system, |
85
|
|
|
|
|
|
|
and would rather not have to re-key this data as it arrives. Their |
86
|
|
|
|
|
|
|
system, however, does have the ability to process requests in the |
87
|
|
|
|
|
|
|
Interlibrary Loan Generic Script (GS) format. |
88
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
Biblio::ILL::GS simply lets you build a GS format message. |
90
|
|
|
|
|
|
|
|
91
|
|
|
|
|
|
|
=head1 METHODS |
92
|
|
|
|
|
|
|
|
93
|
|
|
|
|
|
|
=head2 new() |
94
|
|
|
|
|
|
|
|
95
|
|
|
|
|
|
|
Create the Biblio::ILL::GS object. |
96
|
|
|
|
|
|
|
|
97
|
|
|
|
|
|
|
my $gs = new Biblio::ILL::GS; |
98
|
|
|
|
|
|
|
|
99
|
|
|
|
|
|
|
=cut |
100
|
|
|
|
|
|
|
|
101
|
|
|
|
|
|
|
sub new { |
102
|
2
|
|
|
2
|
1
|
26
|
my $class = shift; |
103
|
2
|
|
33
|
|
|
20
|
return( bless { }, ref($class) || $class ); |
104
|
|
|
|
|
|
|
} |
105
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
=head2 set() |
108
|
|
|
|
|
|
|
|
109
|
|
|
|
|
|
|
Set a field in the object. Fields can accept multiple values, which you pass in |
110
|
|
|
|
|
|
|
a list context. If you do not pass in a valid field name you will |
111
|
|
|
|
|
|
|
get a fatal error. Valid fields names include: |
112
|
|
|
|
|
|
|
LSB, LSP A#C P/U N/R ADR SER AUT TIT P/L P/M EDN DAT LCN SBN NUM #AD SRC REM |
113
|
|
|
|
|
|
|
|
114
|
|
|
|
|
|
|
my $gs = new Biblio::ILL::GS; |
115
|
|
|
|
|
|
|
$gs->set( 'TIT', 'Huckleberry Finn' ); |
116
|
|
|
|
|
|
|
$gs->set( 'REM', 'This is a comment.', 'This is another comment' ); |
117
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
=cut |
119
|
|
|
|
|
|
|
|
120
|
|
|
|
|
|
|
sub set { |
121
|
28
|
|
|
28
|
1
|
4470
|
my ($self,$fieldname,@ary) = @_; |
122
|
28
|
50
|
|
|
|
509
|
if ( ! grep /$fieldname/, @validFields ) { |
123
|
0
|
|
|
|
|
0
|
croak( "invalid field $fieldname" ); |
124
|
|
|
|
|
|
|
} |
125
|
28
|
|
|
|
|
125
|
$self->{$fieldname} = [ @ary ]; |
126
|
|
|
|
|
|
|
} |
127
|
|
|
|
|
|
|
|
128
|
|
|
|
|
|
|
|
129
|
|
|
|
|
|
|
=head2 as_string() |
130
|
|
|
|
|
|
|
|
131
|
|
|
|
|
|
|
Returns the GS message as a string, or undef if the minimum data is not |
132
|
|
|
|
|
|
|
present (LSB, LSP, ADR, SER, AUT, and TIT). |
133
|
|
|
|
|
|
|
|
134
|
|
|
|
|
|
|
=cut |
135
|
|
|
|
|
|
|
|
136
|
|
|
|
|
|
|
sub as_string { |
137
|
|
|
|
|
|
|
|
138
|
8
|
|
|
8
|
1
|
6980
|
my $self = shift; |
139
|
8
|
|
|
|
|
12
|
my $GS; |
140
|
|
|
|
|
|
|
|
141
|
|
|
|
|
|
|
# verify that we have the (minimum) data we need |
142
|
|
|
|
|
|
|
|
143
|
8
|
|
|
|
|
20
|
foreach ( qw( LSB LSP ADR SER AUT TIT ) ) { |
144
|
33
|
100
|
|
|
|
115
|
if ( ! defined( $self->{ $_ } ) ) { |
145
|
6
|
|
|
|
|
1039
|
croak( "missing mandatory field: $_" ); |
146
|
|
|
|
|
|
|
} |
147
|
|
|
|
|
|
|
} |
148
|
|
|
|
|
|
|
|
149
|
|
|
|
|
|
|
# I think this is the real start of the GS msg.... |
150
|
2
|
|
|
|
|
8
|
$GS .= "\t\t\tILL REQUEST/DEMANDE DE PEB\n\n"; |
151
|
|
|
|
|
|
|
|
152
|
|
|
|
|
|
|
# why do only some of these check for existence |
153
|
|
|
|
|
|
|
# - some are mandatory, some optional (but handy) |
154
|
2
|
|
|
|
|
6
|
$GS .= "LSB:" . _stringify( @{ $self->{"LSB"} }); |
|
2
|
|
|
|
|
12
|
|
155
|
2
|
|
|
|
|
6
|
$GS .= "LSP:" . _stringify( @{ $self->{"LSP"} }); |
|
2
|
|
|
|
|
12
|
|
156
|
2
|
50
|
|
|
|
13
|
$GS .= "A#C:" . _stringify( @{ $self->{"A#C"} }) if ($self->{"A#C"}); |
|
0
|
|
|
|
|
0
|
|
157
|
2
|
50
|
|
|
|
9
|
$GS .= "P/U:" . _stringify( @{ $self->{"P/U"} }) if ($self->{"P/U"}); |
|
2
|
|
|
|
|
9
|
|
158
|
2
|
50
|
|
|
|
10
|
$GS .= "N/R:" . _stringify( @{ $self->{"N/R"} }) if ($self->{"N/R"}); |
|
0
|
|
|
|
|
0
|
|
159
|
2
|
|
|
|
|
4
|
$GS .= "ADR:" . _stringify( @{ $self->{"ADR"} }); |
|
2
|
|
|
|
|
8
|
|
160
|
2
|
|
|
|
|
6
|
$GS .= "SER:" . _stringify( @{ $self->{"SER"} }); |
|
2
|
|
|
|
|
8
|
|
161
|
2
|
|
|
|
|
17
|
$GS .= "AUT:" . _stringify( @{ $self->{"AUT"} }); |
|
2
|
|
|
|
|
76
|
|
162
|
2
|
|
|
|
|
5
|
$GS .= "TIT:" . _stringify( @{ $self->{"TIT"} }); |
|
2
|
|
|
|
|
8
|
|
163
|
2
|
50
|
|
|
|
10
|
$GS .= "P/L:" . _stringify( @{ $self->{"P/L"} }) if ($self->{"P/L"}); |
|
2
|
|
|
|
|
7
|
|
164
|
2
|
50
|
|
|
|
11
|
$GS .= "P/M:" . _stringify( @{ $self->{"P/M"} }) if ($self->{"P/M"}); |
|
2
|
|
|
|
|
6
|
|
165
|
2
|
50
|
|
|
|
18
|
$GS .= "EDN:" . _stringify( @{ $self->{"EDN"} }) if ($self->{"N/R"}); |
|
0
|
|
|
|
|
0
|
|
166
|
2
|
50
|
|
|
|
10
|
$GS .= "DAT:" . _stringify( @{ $self->{"DAT"} }) if ($self->{"DAT"}); |
|
2
|
|
|
|
|
7
|
|
167
|
2
|
50
|
|
|
|
10
|
$GS .= "LCN:" . _stringify( @{ $self->{"LCN"} }) if ($self->{"LCN"}); |
|
0
|
|
|
|
|
0
|
|
168
|
2
|
50
|
|
|
|
9
|
$GS .= "SBN:" . _stringify( @{ $self->{"SBN"} }) if ($self->{"SBN"}); |
|
2
|
|
|
|
|
7
|
|
169
|
2
|
50
|
|
|
|
10
|
$GS .= "SRC:" . _stringify( @{ $self->{"SRC"} }) if ($self->{"SRC"}); |
|
2
|
|
|
|
|
6
|
|
170
|
2
|
50
|
|
|
|
13
|
$GS .= "REM:" . _stringify( @{ $self->{"REM"} }) if ($self->{"REM"}); |
|
2
|
|
|
|
|
8
|
|
171
|
|
|
|
|
|
|
|
172
|
2
|
|
|
|
|
47
|
return( $GS ); |
173
|
|
|
|
|
|
|
|
174
|
|
|
|
|
|
|
} |
175
|
|
|
|
|
|
|
|
176
|
|
|
|
|
|
|
sub _stringify { |
177
|
26
|
|
|
26
|
|
70
|
my (@v) = @_; |
178
|
26
|
|
|
|
|
30
|
my $s; |
179
|
26
|
|
|
|
|
40
|
foreach my $elem (@v) { |
180
|
34
|
|
|
|
|
88
|
$s .= "\t" . $elem . "\n"; |
181
|
|
|
|
|
|
|
} |
182
|
26
|
|
|
|
|
109
|
return( $s ); |
183
|
|
|
|
|
|
|
} |
184
|
|
|
|
|
|
|
|
185
|
|
|
|
|
|
|
1; |
186
|
|
|
|
|
|
|
|
187
|
|
|
|
|
|
|
|
188
|
|
|
|
|
|
|
__END__ |