package Apache::DBI::Cache::ImaDBI; use strict; use warnings; use Apache::DBI::Cache (); # NOTE: do not call import() our $VERSION = '0.07'; sub _mk_db_closure { my ($class, @connection) = @_; my $dbh; return sub { unless( $dbh ) { $dbh = DBI->connect(@connection); Apache::DBI::Cache::undef_at_request_cleanup(\$dbh); } return $dbh; }; } sub import { my $class=shift; my %o=@_; if( exists $o{patch} ) { $o{patch}=[$o{patch}] unless( ref $o{patch} eq 'ARRAY' ); foreach my $c (@{$o{patch}}) { no strict qw/refs/; no warnings qw/redefine/; $c='Ima::DBI' if( $c=~/^\d+$/ and $c!=0 ); *{$c.'::_mk_db_closure'}=\&_mk_db_closure; } } } 1; __END__ =head1 NAME Apache::DBI::Cache::ImaDBI - make Apache::DBI::Cache work with Class::DBI =head1 SYNOPSIS In your httpd.conf: use Apache::DBI::Cache ...; use Apache::DBI::Cache::ImaDBI patch=>'Ima::DBI'; Then use Class::DBI in your modules as usual. or In your httpd.conf: use Apache::DBI::Cache ...; use Apache::DBI::Cache::ImaDBI patch=>'My::Class'; package My::Class; use base qw/Class::DBI/; or In your httpd.conf: use Apache::DBI::Cache ...; package My::Class; use base qw/Apache::DBI::Cache::ImaDBI Class::DBI/; =head1 DESCRIPTION This module provides one method that is designed to override the way Ima::DBI caches its DBI handle. Normally the handle is connected once and saved in a closure. With Apache::DBI::Cache::ImaDBI the handle is cached by means of Apache::DBI::Cache. Once per Apache request cycle if a class is used for this request a handle is obtained from the cache. This means: =over 4 =item * A classes DBI handle stays the same over an Apache request cycle but may change between cycles. =item * Multiple classes can use the same handle if used in different request cylces. =item * If multiple classes use the same database and these classes are used in one request cycle then each class gets its own handle. =back =head1 USAGE Normally your classes are designed to work not only with Apache::DBI::Cache. Hence, your classes don't know also about Apache::DBI::Cache::ImaDBI. But your classes inherit from Class::DBI and Class::DBI inherits from Ima::DBI. To get our special method called Apache::DBI::Cache::ImaDBI is used in one of these ways: use Apache::DBI::Cache::ImaDBI patch=>1; or use Apache::DBI::Cache::ImaDBI patch=>'Ima::DBI'; or use Apache::DBI::Cache::ImaDBI patch=>'Class::DBI'; or use Apache::DBI::Cache::ImaDBI patch=>qw[My::Class1 My::Class2]; The first 2 usages are exactly the same. Our special method is inserted directly into Ima::DBI. Thus, all classes based on Ima::DBI inherit it. The 3rd usage inserts our method into Class::DBI. Thus, all classes based on it inherit our method but classes that are base directly on Ima::DBI do not. In the 4th case our method is inserted into individual classes only. Another way to use Apache::DBI::Cache::ImaDBI is by inheriting from it: package My::Class; use base qw/Apache::DBI::Cache::ImaDBI Class::DBI/; or package My::Class; use base qw/Apache::DBI::Cache::ImaDBI Ima::DBI/; Here it is necessary that Apache::DBI::Cache::ImaDBI cames I Class::DBI or Ima::DBI. I think that is not the preferred way because it requires source code modification of your classes. =head1 SEE ALSO =over 4 =item L =item L =item L =back =head1 AUTHOR Torsten Foertsch, Etorsten.foertsch@gmx.netE =head1 COPYRIGHT AND LICENSE Copyright (C) 2006 by Torsten Foertsch This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut