X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDebug%2FPrettyPrint.pm;h=59ffe420e65dfcf1e4a2ae24ccc29f680ce7d4cd;hb=2924f8b3ce58b66565f0e733b9daeba416cbf74a;hp=53de0026047c724fd0925af66f21dbdac131d910;hpb=ec02b310277c474bb2b97085e546b45b521b275a;p=dbsrgits%2FSQL-Abstract.git diff --git a/lib/DBIx/Class/Storage/Debug/PrettyPrint.pm b/lib/DBIx/Class/Storage/Debug/PrettyPrint.pm index 53de002..59ffe42 100644 --- a/lib/DBIx/Class/Storage/Debug/PrettyPrint.pm +++ b/lib/DBIx/Class/Storage/Debug/PrettyPrint.pm @@ -8,14 +8,36 @@ use base 'DBIx::Class::Storage::Statistics'; use SQL::Abstract::Tree; __PACKAGE__->mk_group_accessors( simple => '_sqlat' ); +__PACKAGE__->mk_group_accessors( simple => '_clear_line_str' ); +__PACKAGE__->mk_group_accessors( simple => '_executing_str' ); +__PACKAGE__->mk_group_accessors( simple => '_show_progress' ); +__PACKAGE__->mk_group_accessors( simple => '_last_sql' ); +__PACKAGE__->mk_group_accessors( simple => 'squash_repeats' ); sub new { my $class = shift; - - my $sqlat = SQL::Abstract::Tree->new(shift @_); + my $args = shift; + + my $clear_line = $args->{clear_line} || "\r"; + my $executing = $args->{executing} || ( + eval { require Term::ANSIColor } ? do { + my $c = \&Term::ANSIColor::color; + $c->('blink white on_black') . 'EXECUTING...' . $c->('reset'); + } : 'EXECUTING...' + ); + my $show_progress = $args->{show_progress}; + + my $squash_repeats = $args->{squash_repeats}; + my $sqlat = SQL::Abstract::Tree->new($args); my $self = $class->next::method(@_); + $self->_clear_line_str($clear_line); + $self->_executing_str($executing); + $self->_show_progress($show_progress); + + $self->squash_repeats($squash_repeats); $self->_sqlat($sqlat); + $self->_last_sql(''); return $self } @@ -25,17 +47,30 @@ sub print { my $string = shift; my $bindargs = shift || []; + my ($lw, $lr); + ($lw, $string, $lr) = $string =~ /^(\s*)(.+?)(\s*)$/s; + + local $self->_sqlat->{fill_in_placeholders} = 0 if defined $bindargs + && defined $bindargs->[0] && $bindargs->[0] eq q('__BULK_INSERT__'); + my $use_placeholders = !!$self->_sqlat->fill_in_placeholders; # DBIC pre-quotes bindargs $bindargs = [map { s/^'//; s/'$//; $_ } @{$bindargs}] if $use_placeholders; - my $formatted = $self->_sqlat->format($string, $bindargs) . "\n"; - - $formatted = "$formatted: " . join ', ', @{$bindargs} - unless $use_placeholders; + my $sqlat = $self->_sqlat; + my $formatted; + if ($self->squash_repeats && $self->_last_sql eq $string) { + my ( $l, $r ) = @{ $sqlat->placeholder_surround }; + $formatted = '... : ' . join(', ', map "$l$_$r", @$bindargs) + } else { + $self->_last_sql($string); + $formatted = $sqlat->format($string, $bindargs); + $formatted = "$formatted : " . join ', ', @{$bindargs} + unless $use_placeholders; + } - $self->next::method($formatted, @_); + $self->next::method("$lw$formatted$lr", @_); } sub query_start { @@ -47,7 +82,15 @@ sub query_start { return; } - $self->print($string, \@bind); + $string =~ s/\s+$//; + + $self->print("$string\n", \@bind); + + $self->debugfh->print($self->_executing_str) if $self->_show_progress +} + +sub query_end { + $_[0]->debugfh->print($_[0]->_clear_line_str) if $_[0]->_show_progress } 1; @@ -56,25 +99,33 @@ sub query_start { =head1 SYNOPSIS - package MyApp::Schema; + DBIC_TRACE_PROFILE=~/dbic.json perl -Ilib ./foo.pl - use parent 'DBIx::Class::Schema'; +Where dbic.json contains: + + { + "profile":"console", + "show_progress":1, + "squash_repeats":1 + } - use DBIx::Class::Storage::Debug::PrettyPrint; +=head1 METHODS - __PACKAGE__->load_namespaces; +=head2 new my $pp = DBIx::Class::Storage::Debug::PrettyPrint->new({ - profile => 'console', + show_progress => 1, # tries it's best to make it clear that a SQL + # statement is still running + executing => '...', # the string that is added to the end of SQL + # if show_progress is on. You probably don't + # need to set this + clear_line => '\r^[[J', # the string used to erase the string added + # to SQL if show_progress is on. Again, the + # default is probably good enough. + + squash_repeats => 1, # set to true to make repeated SQL queries + # be ellided and only show the new bind params + # any other args are passed through directly to SQL::Abstract::Tree }); - sub connection { - my $self = shift; - - my $ret = $self->next::method(@_); - - $self->storage->debugobj($pp); - - $ret - }