X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FStatistics.pm;h=f5216583285ef8e0b3c4cfb07bffa31a145f24b8;hb=f4dc39d649672ff4452cf827ca204a1e937bc8b7;hp=6c77ffbb8b209d7d7aac9d851d07173991cf24c0;hpb=238e071106f84eb98f001e8d14b27ae600119a28;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/Statistics.pm b/lib/DBIx/Class/Storage/Statistics.pm index 6c77ffb..f521658 100644 --- a/lib/DBIx/Class/Storage/Statistics.pm +++ b/lib/DBIx/Class/Storage/Statistics.pm @@ -1,12 +1,14 @@ package DBIx::Class::Storage::Statistics; + use strict; use warnings; -use base qw/DBIx::Class/; +use DBIx::Class::_Util qw(sigwarn_silencer qsub); +use IO::Handle (); +use Moo; +extends 'DBIx::Class'; use namespace::clean; -__PACKAGE__->mk_group_accessors(simple => qw/callback _debugfh silence/); - =head1 NAME DBIx::Class::Storage::Statistics - SQL Statistics @@ -25,55 +27,56 @@ for collecting the statistics as discussed in L. =head1 METHODS -=cut - =head2 new Returns a new L object. -=cut -sub new { - my $self = {}; - bless $self, (ref($_[0]) || $_[0]); - - return $self; -} - =head2 debugfh Sets or retrieves the filehandle used for trace/debug output. This should -be an IO::Handle compatible object (only the C method is used). Initially -should be set to STDERR - although see information on the -L environment variable. +be an L compatible object (only the +L<< print|IO::Handle/METHODS >> method is used). By +default it is initially set to STDERR - although see discussion of the +L environment variable. -As getter it will lazily open a filehandle for you if one is not already set. +Invoked as a getter it will lazily open a filehandle and set it to +L<< autoflush|perlvar/HANDLE->autoflush( EXPR ) >> (if one is not +already set). =cut -sub debugfh { - my $self = shift; +has debugfh => ( + is => 'rw', + lazy => 1, + trigger => qsub '$_[0]->_defaulted_to_stderr(undef); $_[0]->_clear_debugfh unless $_[1];', + clearer => '_clear_debugfh', + builder => '_build_debugfh', +); + +sub _build_debugfh { + my $fh; + + my $debug_env = $ENV{DBIX_CLASS_STORAGE_DBI_DEBUG} || $ENV{DBIC_TRACE}; - if (@_) { - $self->_debugfh($_[0]); - } elsif (!defined($self->_debugfh())) { - my $fh; - my $debug_env = $ENV{DBIX_CLASS_STORAGE_DBI_DEBUG} - || $ENV{DBIC_TRACE}; - if (defined($debug_env) && ($debug_env =~ /=(.+)$/)) { - open ($fh, '>>', $1) - or die("Cannot open trace file $1: $!"); - } else { - open ($fh, '>&STDERR') - or die("Duplication of STDERR for debug output failed (perhaps your STDERR is closed?): $!"); - } - - $fh->autoflush(); - $self->_debugfh($fh); + if (defined($debug_env) and ($debug_env =~ /=(.+)$/)) { + open ($fh, '>>', $1) + or die("Cannot open trace file $1: $!\n"); } + else { + open ($fh, '>&STDERR') + or die("Duplication of STDERR for debug output failed (perhaps your STDERR is closed?): $!\n"); + $_[0]->_defaulted_to_stderr(1); + } + + $fh->autoflush(1); - $self->_debugfh; + $fh; } +has [qw(_defaulted_to_stderr silence callback)] => ( + is => 'rw', +); + =head2 print Prints the specified string to our debugging filehandle. Provided to save our @@ -85,7 +88,13 @@ sub print { return if $self->silence; - $self->debugfh->print($msg); + my $fh = $self->debugfh; + + # not using 'no warnings' here because all of this can change at runtime + local $SIG{__WARN__} = sigwarn_silencer(qr/^Wide character in print/) + if $self->_defaulted_to_stderr; + + $fh->print($msg); } =head2 silence @@ -195,18 +204,22 @@ sub query_start { Called when a query finishes executing. Has the same arguments as query_start. =cut + sub query_end { my ($self, $string) = @_; } -1; - -=head1 AUTHOR AND CONTRIBUTORS +=head1 FURTHER QUESTIONS? -See L and L in DBIx::Class +Check the list of L. -=head1 LICENSE +=head1 COPYRIGHT AND LICENSE -You may distribute this code under the same terms as Perl itself. +This module is free software L +by the L. You can +redistribute it and/or modify it under the same terms as the +L. =cut + +1;