line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
#================================== Dbh.pm =================================== |
2
|
|
|
|
|
|
|
# Filename: Dbh.pm |
3
|
|
|
|
|
|
|
# Description: Objectifies Database handles so we only need one |
4
|
|
|
|
|
|
|
# Original Author: Dale M. Amon |
5
|
|
|
|
|
|
|
# Revised by: $Author: amon $ |
6
|
|
|
|
|
|
|
# Date: $Date: 2008-08-28 23:20:19 $ |
7
|
|
|
|
|
|
|
# Version: $Revision: 1.5 $ |
8
|
|
|
|
|
|
|
# License: LGPL 2.1, Perl Artistic or BSD |
9
|
|
|
|
|
|
|
# |
10
|
|
|
|
|
|
|
#============================================================================= |
11
|
1
|
|
|
1
|
|
601
|
use strict; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
29
|
|
12
|
1
|
|
|
1
|
|
2414
|
use DBI; |
|
1
|
|
|
|
|
26260
|
|
|
1
|
|
|
|
|
100
|
|
13
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
package Fault::Dbh; |
15
|
1
|
|
|
1
|
|
13
|
use vars qw{@ISA}; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
440
|
|
16
|
|
|
|
|
|
|
@ISA = qw ( UNIVERSAL ); |
17
|
|
|
|
|
|
|
|
18
|
|
|
|
|
|
|
#============================================================================= |
19
|
|
|
|
|
|
|
# CLASS METHODS |
20
|
|
|
|
|
|
|
#============================================================================= |
21
|
|
|
|
|
|
|
my ($DBH,$DBHCNT) = (undef,0); |
22
|
|
|
|
|
|
|
|
23
|
0
|
|
|
0
|
1
|
|
sub init {my $class=shift; ($DBH,$DBHCNT) = (undef,0); return $class;} |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
|
25
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
#----------------------------------------------------------------------------- |
27
|
|
|
|
|
|
|
# Open a database server connection if one is not already open. |
28
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
sub open { |
30
|
0
|
|
|
0
|
1
|
|
my ($class,$dbname,$user,$pass) = @_; |
31
|
0
|
0
|
|
|
|
|
defined $dbname or return undef; |
32
|
0
|
0
|
|
|
|
|
defined $user or return undef; |
33
|
0
|
0
|
|
|
|
|
defined $pass or return undef; |
34
|
|
|
|
|
|
|
|
35
|
0
|
0
|
|
|
|
|
if (defined $DBH) {$DBHCNT++;} |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
else {$DBH = DBI->connect("DBI:mysql:$dbname",$user,$pass); |
37
|
0
|
0
|
|
|
|
|
$DBHCNT = (defined $DBH) ? 1 : 0; |
38
|
|
|
|
|
|
|
} |
39
|
0
|
|
|
|
|
|
my $self = bless (\$DBH, "Fault::Dbh"); |
40
|
0
|
|
|
|
|
|
return $self; |
41
|
|
|
|
|
|
|
} |
42
|
|
|
|
|
|
|
|
43
|
|
|
|
|
|
|
#============================================================================= |
44
|
|
|
|
|
|
|
# INSTANCE METHODS |
45
|
|
|
|
|
|
|
#============================================================================= |
46
|
|
|
|
|
|
|
# Return the database handle. (I could have done $$self, but why bother?) |
47
|
|
|
|
|
|
|
|
48
|
0
|
|
|
0
|
1
|
|
sub dbh {return $DBH;} |
49
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
#----------------------------------------------------------------------------- |
51
|
|
|
|
|
|
|
# Close the database. Once this is done this object should be considered |
52
|
|
|
|
|
|
|
# *dead*. |
53
|
|
|
|
|
|
|
|
54
|
|
|
|
|
|
|
sub close { |
55
|
0
|
|
|
0
|
1
|
|
my $self = shift; |
56
|
|
|
|
|
|
|
|
57
|
0
|
0
|
|
|
|
|
if ($DBHCNT>1) {$DBHCNT--;} |
|
0
|
0
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
58
|
0
|
|
|
|
|
|
elsif ($DBHCNT == 1) {$DBHCNT=0; $DBH->disconnect; $DBH=undef;} |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
else {warn ("Attempt to close an already closed dbh. Probable cause is " . |
60
|
|
|
|
|
|
|
"a mismatch in the number of Dbh Class opens and closes.");} |
61
|
0
|
|
|
|
|
|
return undef; |
62
|
|
|
|
|
|
|
} |
63
|
|
|
|
|
|
|
|
64
|
|
|
|
|
|
|
#----------------------------------------------------------------------------- |
65
|
|
|
|
|
|
|
# We need our own destructor so we can insure the database handle is |
66
|
|
|
|
|
|
|
# disconnected before garbage collection. |
67
|
|
|
|
|
|
|
|
68
|
|
|
|
|
|
|
sub DESTROY { |
69
|
0
|
|
|
0
|
|
|
my $self = shift; |
70
|
0
|
0
|
|
|
|
|
(defined $DBH) and $self->close; |
71
|
0
|
|
|
|
|
|
printf "\n\n**** WHY DID I CLOSE??? *****\n\n"; |
72
|
0
|
|
|
|
|
|
return $self; |
73
|
|
|
|
|
|
|
} |
74
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
#============================================================================= |
76
|
|
|
|
|
|
|
# Pod Documentation |
77
|
|
|
|
|
|
|
#============================================================================= |
78
|
|
|
|
|
|
|
# You may extract and format the documentation section with the 'perldoc' cmd. |
79
|
|
|
|
|
|
|
|
80
|
|
|
|
|
|
|
=head1 NAME |
81
|
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
Fault::Dbh - Database Handle abstraction. |
83
|
|
|
|
|
|
|
|
84
|
|
|
|
|
|
|
=head1 SYNOPSIS |
85
|
|
|
|
|
|
|
|
86
|
|
|
|
|
|
|
use Fault::Dbh; |
87
|
|
|
|
|
|
|
Fault::Dbh->init; |
88
|
|
|
|
|
|
|
$db = Fault::Dbh->open ($db, $usr, $pass); |
89
|
|
|
|
|
|
|
$dbh = $db->dbh; |
90
|
|
|
|
|
|
|
$db->close; |
91
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
=head1 Description |
93
|
|
|
|
|
|
|
|
94
|
|
|
|
|
|
|
The Fault::Dbh Database handle abstraction centralizes the creation and |
95
|
|
|
|
|
|
|
destruction of a database handle for a connection to the database server. I |
96
|
|
|
|
|
|
|
do this to minimize the number of active socket connections to the database |
97
|
|
|
|
|
|
|
server. I have observed situations in which all available processes have been |
98
|
|
|
|
|
|
|
utilized, causing further access attempts to fail. |
99
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
This is currently only coded to function on a single local MySQL database. If |
101
|
|
|
|
|
|
|
multiple databases are required, I will have to get fancier, perhaps a local |
102
|
|
|
|
|
|
|
hash of database names with handles attached. |
103
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
The init method is supplied for use in forked environments. Since only a |
105
|
|
|
|
|
|
|
single database connection is created by open, no matter how many times |
106
|
|
|
|
|
|
|
you call it, you will get into very deep trouble if you open then fork and |
107
|
|
|
|
|
|
|
access the database from both processes. If you fork, use the init method |
108
|
|
|
|
|
|
|
as one of the first things you do in your child process. If you do not do |
109
|
|
|
|
|
|
|
this, do not come crying to me about the really weird random error messages |
110
|
|
|
|
|
|
|
and connection closures you are getting from your database. |
111
|
|
|
|
|
|
|
|
112
|
|
|
|
|
|
|
If I wanted to, I could subclass the DBI::db handle itself, but I did not |
113
|
|
|
|
|
|
|
study enough of it to make sure I did not step on anything, |
114
|
|
|
|
|
|
|
|
115
|
|
|
|
|
|
|
Error handling is currently minimal; virtually anything that goes wrong will |
116
|
|
|
|
|
|
|
cause the return of a pointer with a value of undef. |
117
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
=head1 Examples |
119
|
|
|
|
|
|
|
|
120
|
|
|
|
|
|
|
use Fault::Dbh; |
121
|
|
|
|
|
|
|
Fault::Dbh->init; |
122
|
|
|
|
|
|
|
$db = Fault::Dbh->open ("mydatabase","me","apassword"); |
123
|
|
|
|
|
|
|
$dbh = $db->dbh; |
124
|
|
|
|
|
|
|
$db->close; |
125
|
|
|
|
|
|
|
|
126
|
|
|
|
|
|
|
=head1 Class Variables (Internal) |
127
|
|
|
|
|
|
|
|
128
|
|
|
|
|
|
|
DBH the database handle or undef |
129
|
|
|
|
|
|
|
DBHCNT number of opens on this handle, zero if closed. |
130
|
|
|
|
|
|
|
|
131
|
|
|
|
|
|
|
=head1 Instance Variables |
132
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
None. |
134
|
|
|
|
|
|
|
|
135
|
|
|
|
|
|
|
=head1 Class Methods |
136
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
=over 4 |
138
|
|
|
|
|
|
|
|
139
|
|
|
|
|
|
|
=item Binit> |
140
|
|
|
|
|
|
|
|
141
|
|
|
|
|
|
|
Initialize the local database handles. This discards any handle which was |
142
|
|
|
|
|
|
|
previously opened. We need this because if we fork a process the old handle |
143
|
|
|
|
|
|
|
gets shared among parent and child processes and if any two attempt to |
144
|
|
|
|
|
|
|
communicate with the db at the same time... |
145
|
|
|
|
|
|
|
|
146
|
|
|
|
|
|
|
If you are only working with a single process, you only need to use open and |
147
|
|
|
|
|
|
|
close. If you fork, you should init as one of the very first things you do |
148
|
|
|
|
|
|
|
in the new process. |
149
|
|
|
|
|
|
|
|
150
|
|
|
|
|
|
|
=item B<$dbh = Fault::Dbh-Eopen ($db, $usr, $pass)> |
151
|
|
|
|
|
|
|
|
152
|
|
|
|
|
|
|
Class method to create a new object to handle a connection to the local |
153
|
|
|
|
|
|
|
database server for $db as user $usr with password $pass. It only supports |
154
|
|
|
|
|
|
|
one localhost database at present. A new connection is opened only if the |
155
|
|
|
|
|
|
|
count of open connections is zero; otherwise it re-uses the currently open |
156
|
|
|
|
|
|
|
one. |
157
|
|
|
|
|
|
|
|
158
|
|
|
|
|
|
|
It returns undef if it fails to make the requested connection. |
159
|
|
|
|
|
|
|
|
160
|
|
|
|
|
|
|
=back 4 |
161
|
|
|
|
|
|
|
|
162
|
|
|
|
|
|
|
=head1 Instance Methods |
163
|
|
|
|
|
|
|
|
164
|
|
|
|
|
|
|
=over 4 |
165
|
|
|
|
|
|
|
|
166
|
|
|
|
|
|
|
=item B<$dbh = $db-Edbh> |
167
|
|
|
|
|
|
|
|
168
|
|
|
|
|
|
|
Return the database handle. |
169
|
|
|
|
|
|
|
|
170
|
|
|
|
|
|
|
=item B<$db-Eclose> |
171
|
|
|
|
|
|
|
|
172
|
|
|
|
|
|
|
Close this connection to the database server. It decrements the count of open |
173
|
|
|
|
|
|
|
connections and does the real disconnect if the count reaches zero. |
174
|
|
|
|
|
|
|
|
175
|
|
|
|
|
|
|
=back 4 |
176
|
|
|
|
|
|
|
|
177
|
|
|
|
|
|
|
=head1 Private Class Methods |
178
|
|
|
|
|
|
|
|
179
|
|
|
|
|
|
|
None. |
180
|
|
|
|
|
|
|
|
181
|
|
|
|
|
|
|
=head1 Private Instance Methods |
182
|
|
|
|
|
|
|
|
183
|
|
|
|
|
|
|
None. |
184
|
|
|
|
|
|
|
|
185
|
|
|
|
|
|
|
=head1 Errors and Warnings |
186
|
|
|
|
|
|
|
|
187
|
|
|
|
|
|
|
None. |
188
|
|
|
|
|
|
|
|
189
|
|
|
|
|
|
|
=head1 KNOWN BUGS |
190
|
|
|
|
|
|
|
|
191
|
|
|
|
|
|
|
See TODO. |
192
|
|
|
|
|
|
|
|
193
|
|
|
|
|
|
|
=head1 SEE ALSO |
194
|
|
|
|
|
|
|
|
195
|
|
|
|
|
|
|
DBI |
196
|
|
|
|
|
|
|
|
197
|
|
|
|
|
|
|
=head1 AUTHOR |
198
|
|
|
|
|
|
|
|
199
|
|
|
|
|
|
|
Dale Amon |
200
|
|
|
|
|
|
|
|
201
|
|
|
|
|
|
|
=cut |
202
|
|
|
|
|
|
|
|
203
|
|
|
|
|
|
|
#============================================================================= |
204
|
|
|
|
|
|
|
# CVS HISTORY |
205
|
|
|
|
|
|
|
#============================================================================= |
206
|
|
|
|
|
|
|
# $Log: Dbh.pm,v $ |
207
|
|
|
|
|
|
|
# Revision 1.5 2008-08-28 23:20:19 amon |
208
|
|
|
|
|
|
|
# perldoc section regularization. |
209
|
|
|
|
|
|
|
# |
210
|
|
|
|
|
|
|
# Revision 1.4 2008-08-17 21:56:37 amon |
211
|
|
|
|
|
|
|
# Make all titles fit CPAN standard. |
212
|
|
|
|
|
|
|
# |
213
|
|
|
|
|
|
|
# Revision 1.3 2008-05-07 17:44:17 amon |
214
|
|
|
|
|
|
|
# Documentation changes; removed use of package DMA:: |
215
|
|
|
|
|
|
|
# |
216
|
|
|
|
|
|
|
# Revision 1.2 2008-05-04 14:34:12 amon |
217
|
|
|
|
|
|
|
# Tidied up code and docs. |
218
|
|
|
|
|
|
|
# |
219
|
|
|
|
|
|
|
# Revision 1.1.1.1 2008-04-18 12:44:03 amon |
220
|
|
|
|
|
|
|
# Fault and Log System. Pared off of DMA base lib. |
221
|
|
|
|
|
|
|
# |
222
|
|
|
|
|
|
|
# Revision 1.6 2008-04-18 12:44:03 amon |
223
|
|
|
|
|
|
|
# Added arg checking and bail out to open method. |
224
|
|
|
|
|
|
|
# |
225
|
|
|
|
|
|
|
# Revision 1.5 2008-04-11 22:25:23 amon |
226
|
|
|
|
|
|
|
# Add blank line after cut. |
227
|
|
|
|
|
|
|
# |
228
|
|
|
|
|
|
|
# Revision 1.4 2008-04-11 18:56:35 amon |
229
|
|
|
|
|
|
|
# Fixed quoting problem with formfeeds. |
230
|
|
|
|
|
|
|
# |
231
|
|
|
|
|
|
|
# Revision 1.3 2008-04-11 18:39:15 amon |
232
|
|
|
|
|
|
|
# Implimented new standard for headers and trailers. |
233
|
|
|
|
|
|
|
# |
234
|
|
|
|
|
|
|
# Revision 1.2 2008-04-10 15:01:08 amon |
235
|
|
|
|
|
|
|
# Added license to headers, removed claim that the documentation section still |
236
|
|
|
|
|
|
|
# relates to the old doc file. |
237
|
|
|
|
|
|
|
# |
238
|
|
|
|
|
|
|
# Revision 1.1.1.1 2004-12-02 14:28:14 amon |
239
|
|
|
|
|
|
|
# Dale's library of primitives in Perl |
240
|
|
|
|
|
|
|
# |
241
|
|
|
|
|
|
|
# 20041128 Dale Amon |
242
|
|
|
|
|
|
|
# Added init method to handle multiprocessing problems. |
243
|
|
|
|
|
|
|
# |
244
|
|
|
|
|
|
|
# Revision 1.1 2001/05/23 17:05:40 amon |
245
|
|
|
|
|
|
|
# Added Dbh |
246
|
|
|
|
|
|
|
# |
247
|
|
|
|
|
|
|
# 20010515 Dale Amon |
248
|
|
|
|
|
|
|
# Created |
249
|
|
|
|
|
|
|
1; |