ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/PApp-SQL/SQL.pm
(Generate patch)

Comparing PApp-SQL/SQL.pm (file contents):
Revision 1.1 by root, Sat Oct 21 19:00:53 2000 UTC vs.
Revision 1.8 by root, Mon Jan 22 10:53:36 2001 UTC

24#use PApp::Exception; # not yet used 24#use PApp::Exception; # not yet used
25 25
26BEGIN { 26BEGIN {
27 use base Exporter; 27 use base Exporter;
28 28
29 $VERSION = 0.1; 29 $VERSION = 0.11;
30 @EXPORT = qw( 30 @EXPORT = qw(
31 sql_exec sql_fetch sql_fetchall sql_exists sql_insertid $sql_exec 31 sql_exec sql_fetch sql_fetchall sql_exists sql_insertid $sql_exec
32 ); 32 );
33 @EXPORT_OK = qw( 33 @EXPORT_OK = qw(
34 connect_cached 34 connect_cached
50 50
51Connect to the database given by C<($dsn,$user,$pass)>, while using the 51Connect to the database given by C<($dsn,$user,$pass)>, while using the
52flags from C<$flags>. These are just the same arguments as given to 52flags from C<$flags>. These are just the same arguments as given to
53C<DBI->connect>. 53C<DBI->connect>.
54 54
55The database handle will be cached under the unique id C<$id>. If the same 55The database handle will be cached under the unique id
56id is requested later, the cached handle will be checked (using ping), and 56C<$id|$dsn|$user|$pass>. If the same id is requested later, the
57cached handle will be checked (using ping), and the connection will
57the connection will be re-established if necessary (be sure to prefix your 58be re-established if necessary (be sure to prefix your application or
58application or module name to the id to make it "more" unique. Things like 59module name to the id to make it "more" unique. Things like __PACKAGE__ .
59__PACKAGE__ . __LINE__ work fine as well). 60__LINE__ work fine as well).
61
62The reason C<$id> is necessary is that you might specify special connect
63arguments or special flags, or you might want to configure your $DBH
64differently than maybe other applications requesting the same database
65connection. If none of this is becessary for your application you can
66leave $id empty (i.e. "").
60 67
61If specified, C<$connect> is a callback (e.g. a coderef) that will be 68If specified, C<$connect> is a callback (e.g. a coderef) that will be
62called each time a new connection is being established, with the new 69called each time a new connection is being established, with the new
63C<$dbh> as first argument. 70C<$dbh> as first argument.
64 71
73 my ($id, $dsn, $user, $pass, $flags, $connect) = @_; 80 my ($id, $dsn, $user, $pass, $flags, $connect) = @_;
74 # the following line is duplicated in PApp::SQL::Database::new 81 # the following line is duplicated in PApp::SQL::Database::new
75 $id = "$id\0$dsn\0$user\0$pass"; 82 $id = "$id\0$dsn\0$user\0$pass";
76 unless ($dbcache{$id} && $dbcache{$id}->ping) { 83 unless ($dbcache{$id} && $dbcache{$id}->ping) {
77 #warn "connecting to ($dsn|$user|$pass|$flags)\n";#d# 84 #warn "connecting to ($dsn|$user|$pass|$flags)\n";#d#
78 # first, nuke our cache (sooory ;) 85 # first, nuke our statement cache (sooory ;)
79 cachesize cachesize 0; 86 cachesize cachesize 0;
80 # then connect anew 87 # then connect anew
81 $dbcache{$id} = 88 $dbcache{$id} =
82 eval { DBI->connect($dsn, $user, $pass, $flags) } 89 eval { DBI->connect($dsn, $user, $pass, $flags) }
83 || eval { DBI->connect($dsn, $user, $pass, $flags) } 90 || eval { DBI->connect($dsn, $user, $pass, $flags) }
84 || die $DBI::errstr; 91 || die "unable to connect to database $dsn: $DBI::errstr\n";
85 $connect->($dbcache{$id}) if $connect; 92 $connect->($dbcache{$id}) if $connect;
86 } 93 }
87 $dbcache{$id}; 94 $dbcache{$id};
88} 95}
89 96
186 die "duplicate key" 193 die "duplicate key"
187 if sql_exists "user where name = ? and pass = ?", "stefan", "geheim"; 194 if sql_exists "user where name = ? and pass = ?", "stefan", "geheim";
188 195
189=cut 196=cut
190 197
191# uncodumented, since unportable (only works with DBH even!). yet it is exported (aaargh!) 198=item $lastid = sql_insertid $sth
199
200Returns the last automatically created key value. It must be executed
201directly after executing the insert statement that created it. This is
202what is actually returned for various databases. If your database is
203missing, please send me an e-mail on how to implement this ;)
204
205 mysql: first C<AUTO_INCREMENT> column set to NULL
206 postgres: C<oid> column (is there a way to get the last SERIAL?)
207 sybase: C<IDENTITY> column of the last insert (slow)
208 informix: C<SERIAL> or C<SERIAL8> column of the last insert
209
210Except for sybase, this does not require a server access.
211
212=cut
213
192sub sql_insertid { 214sub sql_insertid($) {
193 $DBH->{mysql_insertid}; 215 my $sth = shift or die "sql_insertid requires a statement handle";
216 my $dbh = $sth->{Database};
217 my $driver = $dbh->{Driver}{Name};
218
219 $driver eq "mysql" and return $sth->{mysql_insertid};
220 $driver eq "Pg" and return $sth->{pg_oid_status};
221 $driver eq "Sybase" and return sql_fetch($dbh, 'SELECT @@IDENTITY');
222 $driver eq "Informix" and return $sth->{ix_sqlerrd}[1];
223
224 die "sql_insertid does not spport the dbd driver '$driver', please see PApp::SQL::sql_insertid";
194} 225}
195 226
196=item [old-size] = cachesize [new-size] 227=item [old-size] = cachesize [new-size]
197 228
198Returns (and possibly changes) the LRU cache size used by C<sql_exec>. The 229Returns (and possibly changes) the LRU cache size used by C<sql_exec>. The
226 257
227=back 258=back
228 259
229=cut 260=cut
230 261
262reinitialize;
263
231package PApp::SQL::Database; 264package PApp::SQL::Database;
232 265
233=head2 THE DATABASE CLASS 266=head2 THE DATABASE CLASS
234 267
235Again (sigh) the problem of persistency. What do you do when you have to serialize on object 268Again (sigh) the problem of persistency. What do you do when you have to serialize on object
293 326
294=back 327=back
295 328
296=cut 329=cut
297 330
298reinitialize;
299
3001; 3311;
301 332
302=head1 BUGS 333=head1 BUGS
303 334
304As of this writing, sql_fetch and sql_fetchall are not very well tested 335As of this writing, sql_fetch and sql_fetchall are not very well tested

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines