package Rose::DBx::AutoReconnect; use strict; use warnings; use Carp; use base qw( Rose::DB ); use Rose::DBx::Cache::Anywhere; our $VERSION = '0.03'; __PACKAGE__->db_cache_class('Rose::DBx::Cache::Anywhere'); __PACKAGE__->use_private_registry(1); DBI->trace(1) if $ENV{PERL_DEBUG} && $ENV{PERL_DEBUG} > 1; use Rose::Object::MakeMethods::Generic ( 'scalar --get_set_init' => [qw( debug logfh )], ); =head1 NAME Rose::DBx::AutoReconnect - Rose::DB with auto-reconnect to server =head1 SYNOPSIS use Rose::DBx::AutoReconnect; my $db = Rose::DBx::AutoReconnect->new; $db->logger('hello world'); =head1 DESCRIPTION Rose::DBx::AutoReconnect is a subclass of Rose::DB. Additional features include: =over =item If using new_or_cached() method, will ping() dbh on every fetch from cache to ensure that the dbh is connected. This extends the basic Rose::DB::Cache behaviour beyond mod_perl/Apache::DBI. =item Convenient logger() method for debugging. =item Always uses DBI connect_cached() method when creating handles. =back Rose::DBx::AutoReconnect was written to allow new_or_cached() to work with MySQL's "morning bug" and to allow for restarting your database without restarting your application. See also Rose::DBx::Cache::Anywhere. =head1 METHODS =cut =head2 init_logfh Defaults to STDERR. Get/set it with logfh(). =cut sub init_logfh { *STDERR{IO} } =head2 init_debug Defaults to value of PERL_DEBUG env var (if set) or 0 (false). Get/set it with debug(). =cut sub init_debug { $ENV{PERL_DEBUG} || 0 } =head2 logger( I ) Writes I to the filehandle set with logfh(). =cut sub logger { my $self = shift; my @msg = @_; for my $m (@msg) { print { $self->logfh } join( ' ', $self->loglabel, $m, "\n" ); } } =head2 loglabel Returns a pretty timestamp and label. Used by logger(). =cut sub loglabel { my $self = shift; my $time = localtime(); return '[' . $time . '] ' . '[' . $self->nick . '] '; } =head2 nick Returns pretty label unique to this DB object. Used by loglabel(). =cut sub nick { my $self = shift; return join( '.', $self->domain, $self->type, $self->database . '@' . ($self->host||'localhost') ); } =head2 dbi_connect Override base method to use DBI connect_cached() method. =cut sub dbi_connect { my $self = shift; $self->logger(" ---------> dbi->connect") if $self->debug; return DBI->connect_cached(@_); } 1; __END__ =head1 AUTHOR Peter Karman, C<< >> =head1 BUGS Please report any bugs or feature requests to C, or through the web interface at L. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. =head1 SUPPORT You can find documentation for this module with the perldoc command. perldoc Rose::DBx::AutoReconnect You can also look for information at: =over 4 =item * AnnoCPAN: Annotated CPAN documentation L =item * CPAN Ratings L =item * RT: CPAN's request tracker L =item * Search CPAN L =back =head1 ACKNOWLEDGEMENTS The Minnesota Supercomputing Institute C<< http://www.msi.umn.edu/ >> sponsored the development of this software. =head1 COPYRIGHT Copyright 2008 by the Regents of the University of Minnesota. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut