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