line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package MyLibrary::Librarian; |
2
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
1642
|
use MyLibrary::DB; |
|
1
|
|
|
|
|
4
|
|
|
1
|
|
|
|
|
31
|
|
4
|
1
|
|
|
1
|
|
6
|
use Carp; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
65
|
|
5
|
1
|
|
|
1
|
|
6
|
use strict; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
1917
|
|
6
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
=head1 NAME |
8
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
MyLibrary::Librarian |
10
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
=head1 SYNOPSIS |
13
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
# use the module |
15
|
|
|
|
|
|
|
use MyLibrary::Librarian; |
16
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
# create a new librarian |
18
|
|
|
|
|
|
|
my $librarian = MyLibrary::Librarian->new(); |
19
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
# give the librarian characteristics |
21
|
|
|
|
|
|
|
$librarian->name('Fred Kilgour'); |
22
|
|
|
|
|
|
|
$librarian->email('kilgour@oclc.org'); |
23
|
|
|
|
|
|
|
$librarian->telephone('1 (800) 555-1212'); |
24
|
|
|
|
|
|
|
$librarian->url('http://oclc.org/~kilgour/'); |
25
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
# associate (classify) the librarian with term ids |
27
|
|
|
|
|
|
|
$librarian->term_ids(new => [3, 614, 601]); |
28
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
# disassociate certain term ids from this librarian |
30
|
|
|
|
|
|
|
$librarian->term_ids(del => [@del_term_ids]); |
31
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
# retrieve list of term ids with sort parameter |
33
|
|
|
|
|
|
|
my @term_ids = $librarian->term_ids(sort => 'name'); |
34
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
# save the librarian to the database; create a new record |
36
|
|
|
|
|
|
|
$librarian->commit(); |
37
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
# get the id of the current librarian object |
39
|
|
|
|
|
|
|
$id = $librarian->id(); |
40
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
# get a librarian based on an id |
42
|
|
|
|
|
|
|
my $librarian = MyLibrary::Librarian->new(id => $id); |
43
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
# display information about the librarian |
45
|
|
|
|
|
|
|
print ' ID: ', $librarian->id(), "\n"; |
46
|
|
|
|
|
|
|
print ' Name: ', $librarian->name(), "\n"; |
47
|
|
|
|
|
|
|
print ' Email: ', $librarian->email(), "\n"; |
48
|
|
|
|
|
|
|
print 'Telephone: ', $librarian->telephone(), "\n"; |
49
|
|
|
|
|
|
|
print ' URL: ', $librarian->url(), "\n"; |
50
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
# retrieve complete, sorted list of librarian objects |
52
|
|
|
|
|
|
|
my @librarians = MyLibrary::Librarian->get_librarians(); |
53
|
|
|
|
|
|
|
|
54
|
|
|
|
|
|
|
# process each librarian |
55
|
|
|
|
|
|
|
foreach my $l (@librarians) { |
56
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
# print each librarian's name and email address |
58
|
|
|
|
|
|
|
print $l->name(), ' <', $l->email(), "> \n"; |
59
|
|
|
|
|
|
|
|
60
|
|
|
|
|
|
|
} |
61
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
|
63
|
|
|
|
|
|
|
=head1 DESCRIPTION |
64
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
Use this module to get and set the characteristics of librarians to a MyLibrary database. Characteristics currently include: ID (primary database key), name, email address, telephone number, home page URL, and a set of integers (primary database keys) denoting what terms the librarian has been classified under. |
66
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
|
68
|
|
|
|
|
|
|
=head1 METHODS |
69
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
This section describes the methods available in the package. |
71
|
|
|
|
|
|
|
|
72
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
=head2 new() |
74
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
Use this method to create a librarian object. Called with no options, this method creates an empty object. Called with an id option, this method uses the id as a database key and fills the librarian object with data from the underlying database. |
76
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
# create a new librarian object |
78
|
|
|
|
|
|
|
my $librarian = MyLibrary::Librarian->new(); |
79
|
|
|
|
|
|
|
|
80
|
|
|
|
|
|
|
# create a librarian object based on a previously existing ID |
81
|
|
|
|
|
|
|
my $librarian = MyLibrary::Librarian->new(id => 3); |
82
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
|
84
|
|
|
|
|
|
|
=head2 id() |
85
|
|
|
|
|
|
|
|
86
|
|
|
|
|
|
|
This method returns an integer representing the database key of the currently created librarian object. |
87
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
# get id of current librarian object |
89
|
|
|
|
|
|
|
my $id = $librarian->id(); |
90
|
|
|
|
|
|
|
|
91
|
|
|
|
|
|
|
You cannot set the id attribute. |
92
|
|
|
|
|
|
|
|
93
|
|
|
|
|
|
|
|
94
|
|
|
|
|
|
|
=head2 name() |
95
|
|
|
|
|
|
|
|
96
|
|
|
|
|
|
|
This method gets and sets the name from the librarian from the current librarian object: |
97
|
|
|
|
|
|
|
|
98
|
|
|
|
|
|
|
# get the name of the current librarian object |
99
|
|
|
|
|
|
|
my $name = $librarian->name(); |
100
|
|
|
|
|
|
|
|
101
|
|
|
|
|
|
|
# set the current librarian object's name |
102
|
|
|
|
|
|
|
$librarian->name('Melvile Dewey'); |
103
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
|
105
|
|
|
|
|
|
|
=head2 telephone() |
106
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
Use this method to get and set the telephone number of the current librarian object: |
108
|
|
|
|
|
|
|
|
109
|
|
|
|
|
|
|
# get the telephone number |
110
|
|
|
|
|
|
|
my $phone = $librarian->telephone(); |
111
|
|
|
|
|
|
|
|
112
|
|
|
|
|
|
|
# set the current librarian object's telephone number |
113
|
|
|
|
|
|
|
$librarian->telephone('1 (800) 555-1212'); |
114
|
|
|
|
|
|
|
|
115
|
|
|
|
|
|
|
|
116
|
|
|
|
|
|
|
=head2 email() |
117
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
Like the telephone and name methods, use this method to get and set the librarian object's email attribute: |
119
|
|
|
|
|
|
|
|
120
|
|
|
|
|
|
|
# get the email address |
121
|
|
|
|
|
|
|
my $email_address = $librarian->email(); |
122
|
|
|
|
|
|
|
|
123
|
|
|
|
|
|
|
# set the current librarian object's email address |
124
|
|
|
|
|
|
|
$librarian->email('info@library.org'); |
125
|
|
|
|
|
|
|
|
126
|
|
|
|
|
|
|
|
127
|
|
|
|
|
|
|
=head2 url() |
128
|
|
|
|
|
|
|
|
129
|
|
|
|
|
|
|
Set or get the URL attribute of the librarian object using this method: |
130
|
|
|
|
|
|
|
|
131
|
|
|
|
|
|
|
# get the URL attribute |
132
|
|
|
|
|
|
|
my $home_page = $librarian->url(); |
133
|
|
|
|
|
|
|
|
134
|
|
|
|
|
|
|
# set the URL |
135
|
|
|
|
|
|
|
$librarian->url('http://dewey.library.nd.edu/'); |
136
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
|
138
|
|
|
|
|
|
|
=head2 term_ids() |
139
|
|
|
|
|
|
|
|
140
|
|
|
|
|
|
|
This method gets and sets the term ids with which this libraian object is associated. Given no input, it returns a list of integers or undef if no term associations exist. Any input given is expected to be a list of integers. Related terms can be added or deleted given the correct input parameter. The returned list of term ids can be sorted by name using the sort parameter. |
141
|
|
|
|
|
|
|
|
142
|
|
|
|
|
|
|
# set the term id's |
143
|
|
|
|
|
|
|
$librarian->term_ids(new => [33, 24, 83]); |
144
|
|
|
|
|
|
|
|
145
|
|
|
|
|
|
|
# get the term id's of the current librarian object |
146
|
|
|
|
|
|
|
my @ids = $librarian->term_ids(); |
147
|
|
|
|
|
|
|
|
148
|
|
|
|
|
|
|
# get the term id's of the current librarian object sorted by name |
149
|
|
|
|
|
|
|
my @ids = $librarian->term_ids(sort => 'name'); |
150
|
|
|
|
|
|
|
|
151
|
|
|
|
|
|
|
# require the Term package |
152
|
|
|
|
|
|
|
use MyLibrary::Term; |
153
|
|
|
|
|
|
|
|
154
|
|
|
|
|
|
|
# process each id |
155
|
|
|
|
|
|
|
foreach my $i (@ids) { |
156
|
|
|
|
|
|
|
|
157
|
|
|
|
|
|
|
# create a term object |
158
|
|
|
|
|
|
|
my $term->MyLibrary::Term->new(id => $i); |
159
|
|
|
|
|
|
|
|
160
|
|
|
|
|
|
|
# print the term associated with the librarian object |
161
|
|
|
|
|
|
|
print $librarian->name, ' has been classified with the term: ', $term->name, ".\n"; |
162
|
|
|
|
|
|
|
|
163
|
|
|
|
|
|
|
} |
164
|
|
|
|
|
|
|
|
165
|
|
|
|
|
|
|
# remove term associations |
166
|
|
|
|
|
|
|
$librarian->term_ids(del => [@removed_term_ids]); |
167
|
|
|
|
|
|
|
|
168
|
|
|
|
|
|
|
=head2 commit() |
169
|
|
|
|
|
|
|
|
170
|
|
|
|
|
|
|
Use this method to save the librarian object's attributes to the underlying database. If the object's data has never been saved before, then this method will create a new record in the database. If you used the new and passed it an id option, then this method will update the underlying database. |
171
|
|
|
|
|
|
|
|
172
|
|
|
|
|
|
|
This method will return true upon success. |
173
|
|
|
|
|
|
|
|
174
|
|
|
|
|
|
|
# save the current librarian object to the underlying database |
175
|
|
|
|
|
|
|
$librarian->commit(); |
176
|
|
|
|
|
|
|
|
177
|
|
|
|
|
|
|
|
178
|
|
|
|
|
|
|
=head2 delete() |
179
|
|
|
|
|
|
|
|
180
|
|
|
|
|
|
|
This method simply deletes the current librarian object from the underlying database. |
181
|
|
|
|
|
|
|
|
182
|
|
|
|
|
|
|
# delete (drop) this librarian from the database |
183
|
|
|
|
|
|
|
$librarian->delete(); |
184
|
|
|
|
|
|
|
|
185
|
|
|
|
|
|
|
|
186
|
|
|
|
|
|
|
=head2 get_librarians() |
187
|
|
|
|
|
|
|
|
188
|
|
|
|
|
|
|
Use this method to get all the librarians from the underlying database sorted by their name. This method returns an |
189
|
|
|
|
|
|
|
array of objects enabling you to loop through each object in the array and subsequent characteristics of each object; |
190
|
|
|
|
|
|
|
|
191
|
|
|
|
|
|
|
# get all librarians |
192
|
|
|
|
|
|
|
my @librarians = MyLibrary::Librarian->get_librarians(); |
193
|
|
|
|
|
|
|
|
194
|
|
|
|
|
|
|
# process each librarian |
195
|
|
|
|
|
|
|
foreach my $l (@librarians) { |
196
|
|
|
|
|
|
|
|
197
|
|
|
|
|
|
|
# print the name |
198
|
|
|
|
|
|
|
print $l->name, "\n"; |
199
|
|
|
|
|
|
|
|
200
|
|
|
|
|
|
|
} |
201
|
|
|
|
|
|
|
|
202
|
|
|
|
|
|
|
|
203
|
|
|
|
|
|
|
=head1 ACKNOWLEDGEMENTS |
204
|
|
|
|
|
|
|
|
205
|
|
|
|
|
|
|
I would like to thank the following people for providing input on how this package can be improved: Brian Cassidy and Ben Ostrowsky. |
206
|
|
|
|
|
|
|
|
207
|
|
|
|
|
|
|
|
208
|
|
|
|
|
|
|
=head1 AUTHORS |
209
|
|
|
|
|
|
|
|
210
|
|
|
|
|
|
|
Eric Lease Morgan |
211
|
|
|
|
|
|
|
Robert Fox |
212
|
|
|
|
|
|
|
|
213
|
|
|
|
|
|
|
|
214
|
|
|
|
|
|
|
=head1 HISTORY |
215
|
|
|
|
|
|
|
|
216
|
|
|
|
|
|
|
September 29, 2003 - first public release. |
217
|
|
|
|
|
|
|
April, 2004 - many modifications. |
218
|
|
|
|
|
|
|
|
219
|
|
|
|
|
|
|
=cut |
220
|
|
|
|
|
|
|
|
221
|
|
|
|
|
|
|
|
222
|
|
|
|
|
|
|
sub new { |
223
|
|
|
|
|
|
|
|
224
|
|
|
|
|
|
|
# declare local variables |
225
|
1
|
|
|
1
|
1
|
855
|
my ($class, %opts) = @_; |
226
|
1
|
|
|
|
|
3
|
my $self = {}; |
227
|
1
|
|
|
|
|
2
|
my @term_ids = (); |
228
|
|
|
|
|
|
|
|
229
|
|
|
|
|
|
|
# check for an id |
230
|
1
|
50
|
|
|
|
6
|
if ($opts{id}) { |
231
|
|
|
|
|
|
|
|
232
|
|
|
|
|
|
|
# check for valid input, an integer |
233
|
0
|
0
|
|
|
|
0
|
if ($opts{id} =~ /\D/) { |
234
|
|
|
|
|
|
|
|
235
|
|
|
|
|
|
|
# output an error and return nothing |
236
|
0
|
|
|
|
|
0
|
croak "The id passed as input to the new method must be an integer: id = $opts{id} "; |
237
|
|
|
|
|
|
|
|
238
|
|
|
|
|
|
|
} |
239
|
|
|
|
|
|
|
|
240
|
|
|
|
|
|
|
# get a handle |
241
|
0
|
|
|
|
|
0
|
my $dbh = MyLibrary::DB->dbh(); |
242
|
|
|
|
|
|
|
|
243
|
|
|
|
|
|
|
# find this record |
244
|
0
|
|
|
|
|
0
|
my $rv = $dbh->selectrow_hashref('SELECT * FROM librarians WHERE librarian_id = ?', undef, $opts{id}); |
245
|
|
|
|
|
|
|
|
246
|
0
|
0
|
|
|
|
0
|
if (ref($rv) eq "HASH") { |
247
|
0
|
|
|
|
|
0
|
$self = $rv; |
248
|
0
|
|
|
|
|
0
|
$self->{term_ids} = $dbh->selectcol_arrayref("SELECT term_id FROM terms_librarians WHERE librarian_id = " . $opts{id}); |
249
|
|
|
|
|
|
|
} else { |
250
|
0
|
|
|
|
|
0
|
return; |
251
|
|
|
|
|
|
|
} |
252
|
|
|
|
|
|
|
|
253
|
|
|
|
|
|
|
} |
254
|
|
|
|
|
|
|
|
255
|
|
|
|
|
|
|
# return the object |
256
|
1
|
|
|
|
|
4
|
return bless ($self, $class); |
257
|
|
|
|
|
|
|
|
258
|
|
|
|
|
|
|
} |
259
|
|
|
|
|
|
|
|
260
|
|
|
|
|
|
|
|
261
|
|
|
|
|
|
|
sub id { |
262
|
|
|
|
|
|
|
|
263
|
0
|
|
|
0
|
1
|
0
|
my $self = shift; |
264
|
0
|
|
|
|
|
0
|
return $self->{librarian_id}; |
265
|
|
|
|
|
|
|
|
266
|
|
|
|
|
|
|
} |
267
|
|
|
|
|
|
|
|
268
|
|
|
|
|
|
|
|
269
|
|
|
|
|
|
|
sub telephone { |
270
|
|
|
|
|
|
|
|
271
|
|
|
|
|
|
|
# declare local variables |
272
|
2
|
|
|
2
|
1
|
4
|
my ($self, $telephone) = @_; |
273
|
|
|
|
|
|
|
|
274
|
|
|
|
|
|
|
# check for the existence of a telephone number |
275
|
2
|
100
|
|
|
|
9
|
if ($telephone) { $self->{telephone} = $telephone } |
|
1
|
|
|
|
|
2
|
|
276
|
|
|
|
|
|
|
|
277
|
|
|
|
|
|
|
# return it |
278
|
2
|
|
|
|
|
7
|
return $self->{telephone}; |
279
|
|
|
|
|
|
|
|
280
|
|
|
|
|
|
|
} |
281
|
|
|
|
|
|
|
|
282
|
|
|
|
|
|
|
|
283
|
|
|
|
|
|
|
sub name { |
284
|
|
|
|
|
|
|
|
285
|
|
|
|
|
|
|
# declare local variables |
286
|
2
|
|
|
2
|
1
|
544
|
my ($self, $name) = @_; |
287
|
|
|
|
|
|
|
|
288
|
|
|
|
|
|
|
# check for the existence of a name |
289
|
2
|
100
|
|
|
|
5
|
if ($name) { $self->{name} = $name } |
|
1
|
|
|
|
|
8
|
|
290
|
|
|
|
|
|
|
|
291
|
|
|
|
|
|
|
# return it |
292
|
2
|
|
|
|
|
8
|
return $self->{name}; |
293
|
|
|
|
|
|
|
|
294
|
|
|
|
|
|
|
} |
295
|
|
|
|
|
|
|
|
296
|
|
|
|
|
|
|
|
297
|
|
|
|
|
|
|
sub email { |
298
|
|
|
|
|
|
|
|
299
|
|
|
|
|
|
|
# declare local variables |
300
|
2
|
|
|
2
|
1
|
3
|
my ($self, $email) = @_; |
301
|
|
|
|
|
|
|
|
302
|
|
|
|
|
|
|
# check for the existence of an email address |
303
|
2
|
100
|
|
|
|
6
|
if ($email) { $self->{email} = $email } |
|
1
|
|
|
|
|
2
|
|
304
|
|
|
|
|
|
|
|
305
|
|
|
|
|
|
|
# return it |
306
|
2
|
|
|
|
|
5
|
return $self->{email}; |
307
|
|
|
|
|
|
|
|
308
|
|
|
|
|
|
|
} |
309
|
|
|
|
|
|
|
|
310
|
|
|
|
|
|
|
|
311
|
|
|
|
|
|
|
sub term_ids { |
312
|
|
|
|
|
|
|
|
313
|
|
|
|
|
|
|
# get myself and then the ids |
314
|
1
|
|
|
1
|
1
|
2
|
my $self = shift; |
315
|
1
|
|
|
|
|
3
|
my %opts = @_; |
316
|
1
|
|
|
|
|
2
|
my @new_related_terms; |
317
|
1
|
50
|
|
|
|
4
|
if ($opts{new}) { |
318
|
1
|
|
|
|
|
2
|
@new_related_terms = @{$opts{new}}; |
|
1
|
|
|
|
|
3
|
|
319
|
|
|
|
|
|
|
} |
320
|
1
|
|
|
|
|
2
|
my @del_related_terms; |
321
|
1
|
50
|
|
|
|
4
|
if ($opts{del}) { |
322
|
0
|
|
|
|
|
0
|
@del_related_terms = @{$opts{del}}; |
|
0
|
|
|
|
|
0
|
|
323
|
|
|
|
|
|
|
} |
324
|
1
|
|
|
|
|
4
|
my $sort_type; |
325
|
1
|
50
|
|
|
|
4
|
if ($opts{sort}) { |
326
|
0
|
0
|
|
|
|
0
|
if ($opts{sort} eq 'name') { |
327
|
0
|
|
|
|
|
0
|
$sort_type = 'name'; |
328
|
|
|
|
|
|
|
} |
329
|
|
|
|
|
|
|
} |
330
|
1
|
|
|
|
|
1
|
my @related_terms; |
331
|
|
|
|
|
|
|
my $strict_relations; |
332
|
1
|
50
|
|
|
|
4
|
if ($opts{strict}) { |
333
|
1
|
50
|
0
|
|
|
5
|
if ($opts{strict} eq 'on') { |
|
|
50
|
0
|
|
|
|
|
|
|
0
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
334
|
0
|
|
|
|
|
0
|
$strict_relations = 'on'; |
335
|
|
|
|
|
|
|
} elsif ($opts{strict} eq 'off') { |
336
|
1
|
|
|
|
|
2
|
$strict_relations = 'off'; |
337
|
|
|
|
|
|
|
} elsif (($opts{strict} !~ /^\d$/ && ($opts{strict} == 1 || $opts{strict} == 0)) || $opts{strict} ne 'off' || $opts{strict} ne 'on') { |
338
|
0
|
|
|
|
|
0
|
$strict_relations = 'on'; |
339
|
|
|
|
|
|
|
} else { |
340
|
0
|
|
|
|
|
0
|
$strict_relations = $opts{strict}; |
341
|
|
|
|
|
|
|
} |
342
|
|
|
|
|
|
|
} else { |
343
|
0
|
|
|
|
|
0
|
$strict_relations = 'on'; |
344
|
|
|
|
|
|
|
} |
345
|
|
|
|
|
|
|
|
346
|
1
|
50
|
|
|
|
2
|
if (@new_related_terms) { |
347
|
1
|
|
|
|
|
2
|
TERMS: foreach my $new_related_term (@new_related_terms) { |
348
|
3
|
50
|
|
|
|
14
|
if ($new_related_term !~ /^\d+$/) { |
349
|
0
|
|
|
|
|
0
|
croak "Only numeric digits may be submitted as term ids for librarian relations. $new_related_term submitted."; |
350
|
|
|
|
|
|
|
} |
351
|
3
|
50
|
|
|
|
6
|
if ($strict_relations eq 'on') { |
352
|
0
|
|
|
|
|
0
|
my $dbh = MyLibrary::DB->dbh(); |
353
|
0
|
|
|
|
|
0
|
my $term_list = $dbh->selectcol_arrayref('SELECT term_id FROM terms'); |
354
|
0
|
|
|
|
|
0
|
my $found_term; |
355
|
0
|
|
|
|
|
0
|
TERM_VAL: foreach my $term_list_val (@$term_list) { |
356
|
0
|
0
|
|
|
|
0
|
if ($term_list_val == $new_related_term) { |
357
|
0
|
|
|
|
|
0
|
$found_term = 1; |
358
|
0
|
|
|
|
|
0
|
last TERM_VAL; |
359
|
|
|
|
|
|
|
} else { |
360
|
0
|
|
|
|
|
0
|
$found_term = 0; |
361
|
|
|
|
|
|
|
} |
362
|
|
|
|
|
|
|
} |
363
|
0
|
0
|
|
|
|
0
|
if ($found_term == 0) { |
364
|
0
|
|
|
|
|
0
|
next TERMS; |
365
|
|
|
|
|
|
|
} |
366
|
|
|
|
|
|
|
} |
367
|
3
|
|
|
|
|
3
|
my $found; |
368
|
3
|
100
|
|
|
|
7
|
if ($self->{term_ids}) { |
369
|
2
|
|
|
|
|
2
|
TERMS_PRESENT: foreach my $related_term (@{$self->{term_ids}}) { |
|
2
|
|
|
|
|
5
|
|
370
|
3
|
50
|
|
|
|
6
|
if ($new_related_term == $related_term) { |
371
|
0
|
|
|
|
|
0
|
$found = 1; |
372
|
0
|
|
|
|
|
0
|
last TERMS_PRESENT; |
373
|
|
|
|
|
|
|
} else { |
374
|
3
|
|
|
|
|
5
|
$found = 0; |
375
|
|
|
|
|
|
|
} |
376
|
|
|
|
|
|
|
} |
377
|
|
|
|
|
|
|
} else { |
378
|
1
|
|
|
|
|
2
|
$found = 0; |
379
|
|
|
|
|
|
|
} |
380
|
3
|
50
|
|
|
|
7
|
if ($found) { |
381
|
0
|
|
|
|
|
0
|
next TERMS; |
382
|
|
|
|
|
|
|
} else { |
383
|
3
|
|
|
|
|
3
|
push(@{$self->{term_ids}}, $new_related_term); |
|
3
|
|
|
|
|
8
|
|
384
|
|
|
|
|
|
|
} |
385
|
|
|
|
|
|
|
} |
386
|
|
|
|
|
|
|
} |
387
|
1
|
50
|
|
|
|
3
|
if (@del_related_terms) { |
388
|
0
|
|
|
|
|
0
|
foreach my $del_related_term (@del_related_terms) { |
389
|
0
|
|
|
|
|
0
|
my @terms = @{$self->{term_ids}}; |
|
0
|
|
|
|
|
0
|
|
390
|
0
|
|
|
|
|
0
|
my $j = scalar(@{$self->{term_ids}}); |
|
0
|
|
|
|
|
0
|
|
391
|
0
|
|
|
|
|
0
|
for (my $i = 0; $i < scalar(@{$self->{term_ids}}); $i++) { |
|
0
|
|
|
|
|
0
|
|
392
|
0
|
0
|
|
|
|
0
|
if ($self->{term_ids}[$i] == $del_related_term) { |
393
|
0
|
|
|
|
|
0
|
splice(@{$self->{term_ids}}, $i, 1); |
|
0
|
|
|
|
|
0
|
|
394
|
0
|
|
|
|
|
0
|
$i = $j; |
395
|
|
|
|
|
|
|
} |
396
|
|
|
|
|
|
|
} |
397
|
|
|
|
|
|
|
} |
398
|
|
|
|
|
|
|
} |
399
|
|
|
|
|
|
|
|
400
|
|
|
|
|
|
|
# return a dereferenced array |
401
|
1
|
50
|
33
|
|
|
15
|
if (ref($self->{term_ids}) eq "ARRAY" && scalar(@{$self->{term_ids}}) >= 1) { |
|
1
|
|
|
|
|
8
|
|
402
|
1
|
50
|
|
|
|
3
|
if ($sort_type) { |
403
|
0
|
0
|
|
|
|
0
|
if ($sort_type eq 'name') { |
404
|
0
|
|
|
|
|
0
|
my $dbh = MyLibrary::DB->dbh(); |
405
|
0
|
|
|
|
|
0
|
my $term_id_string; |
406
|
0
|
|
|
|
|
0
|
foreach my $term_id (@{$self->{term_ids}}) { |
|
0
|
|
|
|
|
0
|
|
407
|
0
|
|
|
|
|
0
|
$term_id_string .= "$term_id, "; |
408
|
|
|
|
|
|
|
} |
409
|
0
|
|
|
|
|
0
|
chop($term_id_string); |
410
|
0
|
|
|
|
|
0
|
chop($term_id_string); |
411
|
0
|
|
|
|
|
0
|
$self->{term_ids} = $dbh->selectcol_arrayref("SELECT term_id from terms WHERE term_id IN ($term_id_string) ORDER BY term_name"); |
412
|
|
|
|
|
|
|
} |
413
|
|
|
|
|
|
|
} |
414
|
1
|
|
|
|
|
1
|
return @{$self->{term_ids}}; |
|
1
|
|
|
|
|
6
|
|
415
|
|
|
|
|
|
|
} else { |
416
|
0
|
|
|
|
|
0
|
return; |
417
|
|
|
|
|
|
|
} |
418
|
|
|
|
|
|
|
} |
419
|
|
|
|
|
|
|
|
420
|
|
|
|
|
|
|
|
421
|
|
|
|
|
|
|
sub url { |
422
|
|
|
|
|
|
|
|
423
|
|
|
|
|
|
|
# declare local variables |
424
|
2
|
|
|
2
|
1
|
3
|
my ($self, $url) = @_; |
425
|
|
|
|
|
|
|
|
426
|
|
|
|
|
|
|
# check for the existence of librarian's url |
427
|
2
|
100
|
|
|
|
6
|
if ($url) { $self->{url} = $url } |
|
1
|
|
|
|
|
2
|
|
428
|
|
|
|
|
|
|
|
429
|
|
|
|
|
|
|
# return it |
430
|
2
|
|
|
|
|
4
|
return $self->{url}; |
431
|
|
|
|
|
|
|
|
432
|
|
|
|
|
|
|
} |
433
|
|
|
|
|
|
|
|
434
|
|
|
|
|
|
|
|
435
|
|
|
|
|
|
|
sub commit { |
436
|
|
|
|
|
|
|
|
437
|
|
|
|
|
|
|
# get object |
438
|
1
|
|
|
1
|
1
|
559
|
my $self = shift; |
439
|
|
|
|
|
|
|
|
440
|
|
|
|
|
|
|
# get a database handle |
441
|
1
|
|
|
|
|
10
|
my $dbh = MyLibrary::DB->dbh(); |
442
|
|
|
|
|
|
|
|
443
|
|
|
|
|
|
|
# see if the object has an id |
444
|
0
|
0
|
|
|
|
|
if ($self->id()) { |
445
|
|
|
|
|
|
|
|
446
|
|
|
|
|
|
|
# update the librarians table with this id |
447
|
0
|
|
|
|
|
|
my $return = $dbh->do('UPDATE librarians SET name = ?, telephone = ?, email = ?, url = ? WHERE librarian_id = ?', undef, $self->name(), $self->telephone(), $self->email(), $self->url(), $self->id()); |
448
|
0
|
0
|
0
|
|
|
|
if ($return > 1 || ! $return) { croak "Librarian update in commit() failed. $return records were updated." } |
|
0
|
|
|
|
|
|
|
449
|
|
|
|
|
|
|
|
450
|
|
|
|
|
|
|
# update librarian=>term relational integrity |
451
|
0
|
|
|
|
|
|
my @term_ids = @{$self->{term_ids}}; |
|
0
|
|
|
|
|
|
|
452
|
0
|
0
|
0
|
|
|
|
if (scalar(@term_ids) > 0 && @term_ids) { |
|
|
0
|
0
|
|
|
|
|
453
|
0
|
|
|
|
|
|
my $arr_ref = $dbh->selectall_arrayref('SELECT term_id FROM terms_librarians WHERE librarian_id =?', undef, $self->id()); |
454
|
|
|
|
|
|
|
# determine which term ids stay put |
455
|
0
|
0
|
|
|
|
|
if (scalar(@{$arr_ref}) > 0) { |
|
0
|
|
|
|
|
|
|
456
|
0
|
|
|
|
|
|
foreach my $arr_val (@{$arr_ref}) { |
|
0
|
|
|
|
|
|
|
457
|
0
|
|
|
|
|
|
my $j = scalar(@term_ids); |
458
|
0
|
|
|
|
|
|
for (my $i = 0; $i < $j; $i++) { |
459
|
0
|
0
|
|
|
|
|
if ($arr_val->[0] == $term_ids[$i]) { |
460
|
0
|
|
|
|
|
|
splice(@term_ids, $i, 1); |
461
|
0
|
|
|
|
|
|
$i = $j; |
462
|
|
|
|
|
|
|
} |
463
|
|
|
|
|
|
|
} |
464
|
|
|
|
|
|
|
} |
465
|
|
|
|
|
|
|
} |
466
|
|
|
|
|
|
|
# add the new associations |
467
|
0
|
|
|
|
|
|
foreach my $term_id (@term_ids) { |
468
|
0
|
|
|
|
|
|
my $return = $dbh->do('INSERT INTO terms_librarians (term_id, librarian_id) VALUES (?,?)', undef, $term_id, $self->id()); |
469
|
0
|
0
|
0
|
|
|
|
if ($return > 1 || ! $return) { croak "Unable to update librarian=>term relational integrity. $return row |
|
0
|
|
|
|
|
|
|
470
|
|
|
|
|
|
|
s were inserted." } |
471
|
|
|
|
|
|
|
} |
472
|
|
|
|
|
|
|
# determine which term associations to delete |
473
|
0
|
|
|
|
|
|
my @del_related_terms; |
474
|
0
|
|
|
|
|
|
my @term_ids = @{$self->{term_ids}}; |
|
0
|
|
|
|
|
|
|
475
|
0
|
0
|
|
|
|
|
if (scalar(@{$arr_ref}) > 0) { |
|
0
|
|
|
|
|
|
|
476
|
0
|
|
|
|
|
|
foreach my $arr_val (@{$arr_ref}) { |
|
0
|
|
|
|
|
|
|
477
|
0
|
|
|
|
|
|
my $found; |
478
|
0
|
|
|
|
|
|
for (my $i = 0; $i < scalar(@term_ids); $i++) { |
479
|
0
|
0
|
|
|
|
|
if ($arr_val->[0] == $term_ids[$i]) { |
480
|
0
|
|
|
|
|
|
$found = 1; |
481
|
0
|
|
|
|
|
|
last; |
482
|
|
|
|
|
|
|
} else { |
483
|
0
|
|
|
|
|
|
$found = 0; |
484
|
|
|
|
|
|
|
} |
485
|
|
|
|
|
|
|
} |
486
|
0
|
0
|
|
|
|
|
if (!$found) { |
487
|
0
|
|
|
|
|
|
push (@del_related_terms, $arr_val->[0]); |
488
|
|
|
|
|
|
|
} |
489
|
|
|
|
|
|
|
} |
490
|
|
|
|
|
|
|
} |
491
|
|
|
|
|
|
|
# delete removed associations |
492
|
0
|
|
|
|
|
|
foreach my $del_rel_term (@del_related_terms) { |
493
|
0
|
|
|
|
|
|
my $return = $dbh->do('DELETE FROM terms_librarians WHERE term_id = ? AND librarian_id = ?', undef, $del_rel_term, $self->id()); |
494
|
0
|
0
|
0
|
|
|
|
if ($return > 1 || ! $return) { croak "Unable to delete librarian=>term association. $return rows were deleted." } |
|
0
|
|
|
|
|
|
|
495
|
|
|
|
|
|
|
} |
496
|
|
|
|
|
|
|
} elsif (scalar(@term_ids) <= 0 || !@term_ids) { |
497
|
0
|
|
|
|
|
|
my $return = $dbh->do('DELETE FROM terms_librarians WHERE librarian_id = ?', undef, $self->id()); |
498
|
|
|
|
|
|
|
} |
499
|
|
|
|
|
|
|
|
500
|
|
|
|
|
|
|
} else { |
501
|
|
|
|
|
|
|
|
502
|
|
|
|
|
|
|
# get a new sequence |
503
|
0
|
|
|
|
|
|
my $id = MyLibrary::DB->nextID(); |
504
|
|
|
|
|
|
|
|
505
|
|
|
|
|
|
|
# create a new record |
506
|
0
|
|
|
|
|
|
my $return = $dbh->do('INSERT INTO librarians (librarian_id, name, telephone, email, url) VALUES (?, ?, ?, ?, ?)', undef, $id, $self->name(), $self->telephone(), $self->email(), $self->url()); |
507
|
0
|
0
|
0
|
|
|
|
if ($return > 1 || ! $return) { croak 'Librarian commit() failed.'; } |
|
0
|
|
|
|
|
|
|
508
|
0
|
|
|
|
|
|
$self->{librarian_id} = $id; |
509
|
|
|
|
|
|
|
|
510
|
|
|
|
|
|
|
# update librarian=>term relational integrity, if list of term ids was supplied via the constructor |
511
|
0
|
0
|
|
|
|
|
unless (!$self->{term_ids}) { |
512
|
0
|
|
|
|
|
|
my @term_ids = @{$self->{term_ids}}; |
|
0
|
|
|
|
|
|
|
513
|
0
|
0
|
0
|
|
|
|
if (scalar(@term_ids) > 0 && @term_ids) { |
514
|
0
|
|
|
|
|
|
foreach my $term_id (@term_ids) { |
515
|
0
|
|
|
|
|
|
my $return = $dbh->do('INSERT INTO terms_librarians (term_id, librarian_id) VALUES (?,?)', undef, $term_id, $self->id()); |
516
|
0
|
0
|
0
|
|
|
|
if ($return > 1 || ! $return) { croak "Unable to update librarian=>term relational integrity. $return rows were inserted." } |
|
0
|
|
|
|
|
|
|
517
|
|
|
|
|
|
|
} |
518
|
|
|
|
|
|
|
} |
519
|
|
|
|
|
|
|
} |
520
|
|
|
|
|
|
|
|
521
|
|
|
|
|
|
|
} |
522
|
|
|
|
|
|
|
|
523
|
|
|
|
|
|
|
# done |
524
|
0
|
|
|
|
|
|
return 1; |
525
|
|
|
|
|
|
|
} |
526
|
|
|
|
|
|
|
|
527
|
|
|
|
|
|
|
|
528
|
|
|
|
|
|
|
sub delete { |
529
|
|
|
|
|
|
|
|
530
|
|
|
|
|
|
|
# get myself |
531
|
0
|
|
|
0
|
1
|
|
my $self = shift; |
532
|
|
|
|
|
|
|
|
533
|
|
|
|
|
|
|
# check for id |
534
|
0
|
0
|
|
|
|
|
return 0 unless $self->{librarian_id}; |
535
|
|
|
|
|
|
|
|
536
|
|
|
|
|
|
|
# delete this record |
537
|
0
|
|
|
|
|
|
my $dbh = MyLibrary::DB->dbh(); |
538
|
0
|
|
|
|
|
|
my $rv = $dbh->do('DELETE FROM librarians WHERE librarian_id = ?', undef, $self->{librarian_id}); |
539
|
0
|
0
|
|
|
|
|
if ($rv != 1) { croak ("Delete failed. Deleted $rv records.") } |
|
0
|
|
|
|
|
|
|
540
|
|
|
|
|
|
|
|
541
|
|
|
|
|
|
|
# delete term associations |
542
|
0
|
|
|
|
|
|
$rv = $dbh->do('DELETE FROM terms_librarians WHERE librarian_id = ?', undef, $self->{librarian_id}); |
543
|
|
|
|
|
|
|
|
544
|
|
|
|
|
|
|
# done |
545
|
0
|
|
|
|
|
|
return 1; |
546
|
|
|
|
|
|
|
|
547
|
|
|
|
|
|
|
} |
548
|
|
|
|
|
|
|
|
549
|
|
|
|
|
|
|
|
550
|
|
|
|
|
|
|
sub get_librarians { |
551
|
|
|
|
|
|
|
|
552
|
|
|
|
|
|
|
# scope varibles |
553
|
0
|
|
|
0
|
1
|
|
my $self = shift; |
554
|
0
|
|
|
|
|
|
my @rv = (); |
555
|
|
|
|
|
|
|
|
556
|
|
|
|
|
|
|
# create and execute a query |
557
|
0
|
|
|
|
|
|
my $dbh = MyLibrary::DB->dbh(); |
558
|
0
|
|
|
|
|
|
my $rows = $dbh->prepare('SELECT librarian_id FROM librarians ORDER BY name'); |
559
|
0
|
|
|
|
|
|
$rows->execute; |
560
|
|
|
|
|
|
|
|
561
|
|
|
|
|
|
|
# process each found row |
562
|
0
|
|
|
|
|
|
while (my $r = $rows->fetchrow_array) { |
563
|
|
|
|
|
|
|
|
564
|
|
|
|
|
|
|
# fill up the return value |
565
|
0
|
|
|
|
|
|
push(@rv, $self->new(id => $r)); |
566
|
|
|
|
|
|
|
|
567
|
|
|
|
|
|
|
} |
568
|
|
|
|
|
|
|
|
569
|
|
|
|
|
|
|
# return the array |
570
|
0
|
|
|
|
|
|
return @rv; |
571
|
|
|
|
|
|
|
|
572
|
|
|
|
|
|
|
} |
573
|
|
|
|
|
|
|
|
574
|
|
|
|
|
|
|
|
575
|
|
|
|
|
|
|
# return true, or else |
576
|
|
|
|
|
|
|
1; |