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
=head1 METHODS
-=cut
-
=head2 new
Returns a new L<DBIx::Class::Storage::Statistics> 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<print> method is used). Initially
-should be set to STDERR - although see information on the
-L<DBIC_TRACE> environment variable.
+be an L<IO::Handle> 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<DBIC_TRACE|DBIx::Class::Storage/DBIC_TRACE> 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
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
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<AUTHOR|DBIx::Class/AUTHOR> and L<CONTRIBUTORS|DBIx::Class/CONTRIBUTORS> in DBIx::Class
+Check the list of L<additional DBIC resources|DBIx::Class/GETTING HELP/SUPPORT>.
-=head1 LICENSE
+=head1 COPYRIGHT AND LICENSE
-You may distribute this code under the same terms as Perl itself.
+This module is free software L<copyright|DBIx::Class/COPYRIGHT AND LICENSE>
+by the L<DBIx::Class (DBIC) authors|DBIx::Class/AUTHORS>. You can
+redistribute it and/or modify it under the same terms as the
+L<DBIx::Class library|DBIx::Class/COPYRIGHT AND LICENSE>.
=cut
+
+1;