ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/PApp-SQL/SQL.pm
Revision: 1.28
Committed: Sat Nov 2 03:33:49 2002 UTC (21 years, 6 months ago) by root
Branch: MAIN
Changes since 1.27: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 =head1 NAME
2    
3 root 1.19 PApp::SQL - absolutely easy yet fast and powerful sql access.
4 root 1.1
5     =head1 SYNOPSIS
6    
7     use PApp::SQL;
8 root 1.10
9     my $st = sql_exec $DBH, "select ... where a = ?", $a;
10    
11     local $DBH = <database handle>;
12     my $st = sql_exec \my($bind_a, $bind_b), "select a,b ...";
13     my $st = sql_insertid
14     sql_exec "insert into ... values (?, ?)", $v1, $v2;
15     my $a = sql_fetch "select a from ...";
16     sql_fetch \my($a, $b), "select a,b ...";
17    
18 root 1.20 sql_exists "table where name like 'a%'"
19 root 1.10 or die "a* required but not existent";
20    
21     my $db = new PApp::SQL::Database "", "DBI:mysql:test", "user", "pass";
22     local $PApp::SQL::DBH = $db->checked_dbh; # does 'ping'
23    
24     sql_exec $db->dbh, "select ...";
25 root 1.1
26     =head1 DESCRIPTION
27    
28     This module provides you with easy-to-use functions to execute sql
29     commands (using DBI). Despite being easy to use, they are also quite
30 root 1.10 efficient and allow you to write faster programs in less lines of code. It
31     should work with anything from perl-5.004_01 onwards, but I only support
32 root 1.15 5.005+. UTF8 handling (the C<sql_u*> family of functions) will only be
33     effective with perl version 5.006 and beyond.
34 root 1.10
35     If the descriptions here seem terse or if you always wanted to know
36     what PApp is then have a look at the PApp module which uses this module
37     extensively but also provides you with a lot more gimmicks to play around
38     with to help you create cool applications ;)
39 root 1.1
40     =cut
41    
42     package PApp::SQL;
43    
44 root 1.10 use DBI ();
45 root 1.1
46     BEGIN {
47 root 1.10 use base qw(Exporter DynaLoader);
48 root 1.1
49 root 1.28 $VERSION = 0.141;
50 root 1.1 @EXPORT = qw(
51 root 1.16 sql_exec sql_fetch sql_fetchall sql_exists sql_insertid $sql_exec
52     sql_uexec sql_ufetch sql_ufetchall sql_uexists
53 root 1.1 );
54     @EXPORT_OK = qw(
55     connect_cached
56     );
57    
58 root 1.10 bootstrap PApp::SQL $VERSION;
59 root 1.1 }
60    
61     our $sql_exec; # last result of sql_exec's execute call
62     our $DBH; # the default database handle
63 root 1.10 our $Database; # the current SQL::Database object, if applicable
64 root 1.1
65     our %dbcache;
66    
67 root 1.10 =head2 GLOBAL VARIABLES
68    
69     =over 4
70    
71     =item $sql_exec
72    
73     Since the C<sql_exec> family of functions return a statement handle there
74 root 1.22 must be another way to test the return value of the C<execute> call. This
75 root 1.10 global variable contains the result of the most recent call to C<execute>
76     done by this module.
77    
78     =item $PApp::SQL::DBH
79    
80     The default database handle used by this module if no C<$DBH> was
81 root 1.24 specified as argument. See C<sql_exec> for a discussion.
82 root 1.10
83     =item $PApp::SQL::Database
84    
85     The current default C<PApp::SQL::Database>-object. Future versions might
86     automatically fall back on this database and create database handles from
87     it if neccessary. At the moment this is not used by this module but might
88     be nice as a placeholder for the database object that corresponds to
89     $PApp::SQL::DBH.
90    
91     =back
92    
93     =head2 FUNCTIONS
94    
95     =over 4
96    
97 root 1.1 =item $dbh = connect_cached $id, $dsn, $user, $pass, $flags, $connect
98    
99     (not exported by by default)
100    
101     Connect to the database given by C<($dsn,$user,$pass)>, while using the
102     flags from C<$flags>. These are just the same arguments as given to
103     C<DBI->connect>.
104    
105 root 1.6 The database handle will be cached under the unique id
106     C<$id|$dsn|$user|$pass>. If the same id is requested later, the
107     cached handle will be checked (using ping), and the connection will
108     be re-established if necessary (be sure to prefix your application or
109     module name to the id to make it "more" unique. Things like __PACKAGE__ .
110     __LINE__ work fine as well).
111    
112     The reason C<$id> is necessary is that you might specify special connect
113     arguments or special flags, or you might want to configure your $DBH
114     differently than maybe other applications requesting the same database
115 root 1.22 connection. If none of this is necessary for your application you can
116     leave C<$id> empty (i.e. "").
117 root 1.1
118     If specified, C<$connect> is a callback (e.g. a coderef) that will be
119     called each time a new connection is being established, with the new
120     C<$dbh> as first argument.
121    
122     Examples:
123    
124     # try your luck opening the papp database without access info
125     $dbh = connect_cached __FILE__, "DBI:mysql:papp";
126    
127 root 1.19 Mysql-specific behaviour: The default setting of
128     C<mysql_client_found_rows> is TRUE, you can overwrite this, though.
129 root 1.18
130 root 1.1 =cut
131    
132     sub connect_cached {
133     my ($id, $dsn, $user, $pass, $flags, $connect) = @_;
134     # the following line is duplicated in PApp::SQL::Database::new
135     $id = "$id\0$dsn\0$user\0$pass";
136     unless ($dbcache{$id} && $dbcache{$id}->ping) {
137 root 1.5 # first, nuke our statement cache (sooory ;)
138 root 1.1 cachesize cachesize 0;
139 root 1.18
140     # then make mysql behave more standardly by default
141     $dsn =~ /^[Dd][Bb][Ii]:mysql:/
142     and $dsn !~ /;mysql_client_found_rows/
143     and $dsn .= ";mysql_client_found_rows=1";
144    
145 root 1.1 # then connect anew
146     $dbcache{$id} =
147     eval { DBI->connect($dsn, $user, $pass, $flags) }
148     || eval { DBI->connect($dsn, $user, $pass, $flags) }
149 root 1.5 || die "unable to connect to database $dsn: $DBI::errstr\n";
150 root 1.1 $connect->($dbcache{$id}) if $connect;
151     }
152     $dbcache{$id};
153     }
154    
155     =item $sth = sql_exec [dbh,] [bind-vals...,] "sql-statement", [arguments...]
156    
157 root 1.15 =item $sth = sql_uexec <see sql_exec>
158    
159 root 1.1 C<sql_exec> is the most important and most-used function in this module.
160    
161     Runs the given sql command with the given parameters and returns the
162     statement handle. The command and the statement handle will be cached
163     (with the database handle and the sql string as key), so prepare will be
164     called only once for each distinct sql call (please keep in mind that the
165     returned statement will always be the same, so, if you call C<sql_exec>
166     with the same dbh and sql-statement twice (e.g. in a subroutine you
167 root 1.23 called), the statement handle for the first call mustn't not be in use
168     anymore, as the subsequent call will re-use the handle.
169 root 1.1
170     The database handle (the first argument) is optional. If it is missing,
171 root 1.24 it tries to use database handle in C<$PApp::SQL::DBH>, which you can set
172     before calling these functions. NOTICE: future and former versions of
173     PApp::SQL might also look up the global variable C<$DBH> in the callers
174     package.
175    
176     =begin comment
177    
178     If it is missing, C<sql_exec> first tries to use the variable C<$DBH>
179     in the current (= calling) package and, if that fails, it tries to use
180     database handle in C<$PApp::SQL::DBH>, which you can set before calling
181     these functions.
182    
183     =end comment
184 root 1.1
185     The actual return value from the C<$sth->execute> call is stored in the
186     package-global (and exported) variable C<$sql_exec>.
187    
188     If any error occurs C<sql_exec> will throw an exception.
189    
190 root 1.15 C<sql_uexec> is similar to C<sql_exec> but upgrades all input arguments to
191     utf8 before calling the C<execute> method.
192    
193 root 1.1 Examples:
194    
195     # easy one
196     my $st = sql_exec "select name, id from table where id = ?", $id;
197     while (my ($name, $id) = $st->fetchrow_array) { ... };
198    
199     # the fastest way to use dbi, using bind_columns
200     my $st = sql_exec \my($name, $id),
201     "select name, id from table where id = ?",
202     $id;
203     while ($st->fetch) { ...}
204    
205     # now use a different dastabase:
206     sql_exec $dbh, "update file set name = ?", "oops.txt";
207    
208    
209     =item sql_fetch <see sql_exec>
210    
211 root 1.15 =item sql_ufetch <see sql_uexec>
212    
213     Execute an sql-statement and fetch the first row of results. Depending on
214 root 1.1 the caller context the row will be returned as a list (array context), or
215     just the first columns. In table form:
216    
217     CONTEXT RESULT
218     void ()
219     scalar first column
220     list array
221    
222     C<sql_fetch> is quite efficient in conjunction with bind variables:
223    
224     sql_fetch \my($name, $amount),
225     "select name, amount from table where id name = ?",
226     "Toytest";
227    
228     But of course the normal way to call it is simply:
229    
230     my($name, $amount) = sql_fetch "select ...", args...
231    
232     ... and it's still quite fast unless you fetch large amounts of data.
233    
234 root 1.15 C<sql_ufetch> is similar to C<sql_fetch> but upgrades all input values to
235 root 1.21 utf8 and forces all result values to utf8 (this does I<not> include result
236     parameters, only return values. Using bind variables in cinjunction with
237     sql_u* functions results in undefined behaviour).
238 root 1.15
239 root 1.1 =item sql_fetchall <see sql_exec>
240    
241 root 1.15 =item sql_ufetchall <see sql_uexec>
242    
243 root 1.1 Similarly to C<sql_fetch>, but all result rows will be fetched (this is
244     of course inefficient for large results!). The context is ignored (only
245     list context makes sense), but the result still depends on the number of
246     columns in the result:
247    
248     COLUMNS RESULT
249     0 ()
250     1 (row1, row2, row3...)
251     many ([row1], [row2], [row3]...)
252    
253     Examples (all of which are inefficient):
254    
255     for (sql_fetchall "select id from table") { ... }
256    
257     my @names = sql_fetchall "select name from user";
258    
259     for (sql_fetchall "select name, age, place from user") {
260     my ($name, $age, $place) = @$_;
261     }
262    
263 root 1.15 C<sql_ufetchall> is similar to C<sql_fetchall> but upgrades all input
264 root 1.21 values to utf8 and forces all result values to utf8 (see the caveats in
265     the description of C<sql_ufetch>, though).
266 root 1.15
267 root 1.20 =item sql_exists "<table_references> where <where_condition>...", args...
268 root 1.1
269 root 1.15 =item sql_uexists <see sql_exists>
270    
271 root 1.1 Check wether the result of the sql-statement "select xxx from
272     $first_argument" would be empty or not (that is, imagine the string
273 root 1.13 "select * from" were prepended to your statement (it isn't)). Should work
274 root 1.1 with every database but can be quite slow, except on mysql, where this
275     should be quite fast.
276    
277 root 1.15 C<sql_uexists> is similar to C<sql_exists> but upgrades all parameters to
278     utf8.
279    
280 root 1.1 Examples:
281    
282     print "user 7 exists!\n"
283     if sql_exists "user where id = ?", 7;
284    
285     die "duplicate key"
286     if sql_exists "user where name = ? and pass = ?", "stefan", "geheim";
287    
288     =cut
289    
290 root 1.3 =item $lastid = sql_insertid $sth
291    
292 root 1.8 Returns the last automatically created key value. It must be executed
293     directly after executing the insert statement that created it. This is
294     what is actually returned for various databases. If your database is
295     missing, please send me an e-mail on how to implement this ;)
296    
297     mysql: first C<AUTO_INCREMENT> column set to NULL
298     postgres: C<oid> column (is there a way to get the last SERIAL?)
299     sybase: C<IDENTITY> column of the last insert (slow)
300     informix: C<SERIAL> or C<SERIAL8> column of the last insert
301    
302     Except for sybase, this does not require a server access.
303 root 1.3
304     =cut
305    
306     sub sql_insertid($) {
307     my $sth = shift or die "sql_insertid requires a statement handle";
308     my $dbh = $sth->{Database};
309     my $driver = $dbh->{Driver}{Name};
310    
311 root 1.8 $driver eq "mysql" and return $sth->{mysql_insertid};
312     $driver eq "Pg" and return $sth->{pg_oid_status};
313     $driver eq "Sybase" and return sql_fetch($dbh, 'SELECT @@IDENTITY');
314 root 1.3 $driver eq "Informix" and return $sth->{ix_sqlerrd}[1];
315    
316     die "sql_insertid does not spport the dbd driver '$driver', please see PApp::SQL::sql_insertid";
317 root 1.1 }
318    
319     =item [old-size] = cachesize [new-size]
320    
321     Returns (and possibly changes) the LRU cache size used by C<sql_exec>. The
322     default is somewhere around 50 (= the 50 last recently used statements
323 root 1.26 will be cached). It shouldn't be too large, since a simple linear list
324 root 1.1 is used for the cache at the moment (which, for small (<100) cache sizes
325     is actually quite fast).
326    
327     The function always returns the cache size in effect I<before> the call,
328     so, to nuke the cache (for example, when a database connection has died
329     or you want to garbage collect old database/statement handles), this
330     construct can be used:
331    
332     PApp::SQL::cachesize PApp::SQL::cachesize 0;
333    
334     =cut
335    
336     =item reinitialize [not exported]
337    
338 root 1.9 Clears any internal caches (statement cache, database handle
339     cache). Should be called after C<fork> and other accidents that invalidate
340     database handles.
341 root 1.1
342     =cut
343    
344     sub reinitialize {
345     cachesize cachesize 0;
346     for (values %dbcache) {
347 root 1.11 eval { $_->{InactiveDestroy} = 1 };
348 root 1.1 }
349     undef %dbcache;
350     }
351    
352     =back
353    
354     =cut
355    
356 root 1.7 reinitialize;
357    
358 root 1.1 package PApp::SQL::Database;
359    
360     =head2 THE DATABASE CLASS
361    
362 root 1.15 Again (sigh) the problem of persistency. What do you do when you have
363     to serialize on object that contains (or should contain) a database
364     handle? Short answer: you don't. Long answer: you can embed the necessary
365     information to recreate the dbh when needed.
366 root 1.1
367     The C<PApp::SQL::Database> class does that, in a relatively efficient
368     fashion: the overhead is currently a single method call per access (you
369     can cache the real dbh if you want).
370    
371     =over 4
372    
373     =item $db = new <same arguments as C<connect_cached>>
374    
375     The C<new> call takes the same arguments as C<connect_cached> (obviously,
376     if you supply a connect callback it better is serializable, see
377     L<PApp::Callback>!) and returns a serializable database class. No database
378     handle is actually being created.
379    
380     =item $db->dbh
381    
382     Return the database handle as fast as possible (usually just a hash lookup).
383    
384     =item $db->checked_dbh
385    
386     Return the database handle, but first check that the database is still
387     available and re-open the connection if necessary.
388    
389     =cut
390    
391     sub new($$;@) {
392     my $class = shift;
393     my ($id, $dsn, $user, $pass, $flags, $connect) = @_;
394     # the following line is duplicated in PApp::SQL::Database::new
395     my $id2 = "$id\0$dsn\0$user\0$pass";
396     bless [$id2, $flags, $connect], $class;
397     }
398    
399     # the following two functions better be fast!
400     sub dbh($) {
401     $dbcache{$_[0][0]} || $_[0]->checked_dbh;
402     }
403    
404     sub checked_dbh($) {
405     my $dbh = $dbcache{$_[0][0]};
406     $dbh && $dbh->ping
407     ? $dbh
408     : PApp::SQL::connect_cached((split /\x00/, $_[0][0]), $_[0][1], $_[0][2]);
409     }
410    
411     =item $db->dsn
412    
413     Return the DSN (L<DBI>) fo the database object (e.g. for error messages).
414    
415 root 1.14 =item $db->login
416    
417     Return the login name.
418    
419     =item $db->password
420    
421 root 1.25 Return the password (emphasizing the fact that the password is stored plaintext ;)
422 root 1.14
423 root 1.1 =cut
424    
425     sub dsn($) {
426     my $self = shift;
427 root 1.9 (split /\x00/, $self->[0])[1];
428 root 1.14 }
429    
430     sub login($) {
431     my $self = shift;
432     (split /\x00/, $self->[0])[2];
433     }
434    
435     sub password($) {
436     my $self = shift;
437     (split /\x00/, $self->[0])[3];
438 root 1.1 }
439    
440     =back
441    
442     =cut
443    
444     1;
445    
446     =head1 SEE ALSO
447    
448     L<PApp>.
449    
450     =head1 AUTHOR
451    
452     Marc Lehmann <pcg@goof.com>
453     http://www.goof.com/pcg/marc/
454    
455     =cut
456