Whitespace cleanup
[dbsrgits/SQL-Abstract.git] / lib / DBIx / Class / Storage / Debug / PrettyPrint.pm
CommitLineData
0d5df7d6 1package DBIx::Class::Storage::Debug::PrettyPrint;
1dc93d17 2
84c65032 3use strict;
4use warnings;
5
1dc93d17 6use base 'DBIx::Class::Storage::Statistics';
7
8use SQL::Abstract::Tree;
9
10__PACKAGE__->mk_group_accessors( simple => '_sqlat' );
a2b743ce 11__PACKAGE__->mk_group_accessors( simple => '_clear_line_str' );
12__PACKAGE__->mk_group_accessors( simple => '_executing_str' );
13__PACKAGE__->mk_group_accessors( simple => '_show_progress' );
b25246f0 14__PACKAGE__->mk_group_accessors( simple => '_last_sql' );
66c2fcc3 15__PACKAGE__->mk_group_accessors( simple => 'squash_repeats' );
1dc93d17 16
17sub new {
0d5df7d6 18 my $class = shift;
416cdb2e 19 my $args = shift;
1dc93d17 20
657202c9 21 my $clear_line = $args->{clear_line} || "\r\x1b[J";
7c2d702e 22 my $executing = $args->{executing} || (
23 eval { require Term::ANSIColor } ? do {
24 my $c = \&Term::ANSIColor::color;
25 $c->('blink white on_black') . 'EXECUTING...' . $c->('reset');
26 } : 'EXECUTING...'
27 );
17c25d88 28 my $show_progress = $args->{show_progress};
416cdb2e 29
66c2fcc3 30 my $squash_repeats = $args->{squash_repeats};
416cdb2e 31 my $sqlat = SQL::Abstract::Tree->new($args);
0d5df7d6 32 my $self = $class->next::method(@_);
a2b743ce 33 $self->_clear_line_str($clear_line);
34 $self->_executing_str($executing);
35 $self->_show_progress($show_progress);
1dc93d17 36
66c2fcc3 37 $self->squash_repeats($squash_repeats);
b25246f0 38
0d5df7d6 39 $self->_sqlat($sqlat);
b25246f0 40 $self->_last_sql('');
1dc93d17 41
0d5df7d6 42 return $self
1dc93d17 43}
44
31756ef2 45sub print {
1dc93d17 46 my $self = shift;
47 my $string = shift;
25d4d820 48 my $bindargs = shift || [];
84c65032 49
416cdb2e 50 my ($lw, $lr);
51 ($lw, $string, $lr) = $string =~ /^(\s*)(.+?)(\s*)$/s;
52
f038abc7 53 local $self->_sqlat->{fill_in_placeholders} = 0 if defined $bindargs
54 && defined $bindargs->[0] && $bindargs->[0] eq q('__BULK_INSERT__');
fab0bed9 55
84c65032 56 my $use_placeholders = !!$self->_sqlat->fill_in_placeholders;
84c65032 57
b25246f0 58 my $sqlat = $self->_sqlat;
59 my $formatted;
66c2fcc3 60 if ($self->squash_repeats && $self->_last_sql eq $string) {
b25246f0 61 my ( $l, $r ) = @{ $sqlat->placeholder_surround };
fda8a675 62 $formatted = '... : ' . join(', ', map "$l$_$r", @$bindargs)
b25246f0 63 } else {
64 $self->_last_sql($string);
fda8a675 65 $formatted = $sqlat->format($string, $bindargs);
66 $formatted = "$formatted : " . join ', ', @{$bindargs}
b25246f0 67 unless $use_placeholders;
68 }
1dc93d17 69
416cdb2e 70 $self->next::method("$lw$formatted$lr", @_);
1dc93d17 71}
72
84c65032 73sub query_start {
74 my ($self, $string, @bind) = @_;
75
ca4f826a 76 if (defined $self->callback) {
84c65032 77 $string =~ m/^(\w+)/;
78 $self->callback->($1, "$string: ".join(', ', @bind)."\n");
79 return;
80 }
81
416cdb2e 82 $string =~ s/\s+$//;
83
84 $self->print("$string\n", \@bind);
85
a2b743ce 86 $self->debugfh->print($self->_executing_str) if $self->_show_progress
416cdb2e 87}
88
89sub query_end {
a2b743ce 90 $_[0]->debugfh->print($_[0]->_clear_line_str) if $_[0]->_show_progress
84c65032 91}
92
1dc93d17 931;
6b1bf9f8 94
95=pod
96
b912ee1e 97=head1 NAME
98
99DBIx::Class::Storage::Debug::PrettyPrint - Pretty Printing DebugObj
100
6b1bf9f8 101=head1 SYNOPSIS
102
2924f8b3 103 DBIC_TRACE_PROFILE=~/dbic.json perl -Ilib ./foo.pl
6b1bf9f8 104
2924f8b3 105Where dbic.json contains:
6b1bf9f8 106
2924f8b3 107 {
108 "profile":"console",
109 "show_progress":1,
110 "squash_repeats":1
111 }
112
113=head1 METHODS
6b1bf9f8 114
2924f8b3 115=head2 new
6b1bf9f8 116
0d5df7d6 117 my $pp = DBIx::Class::Storage::Debug::PrettyPrint->new({
657202c9 118 show_progress => 1, # tries it's best to make it clear that a SQL
119 # statement is still running
120 executing => '...', # the string that is added to the end of SQL
121 # if show_progress is on. You probably don't
122 # need to set this
123 clear_line => '<CR><ESC>[J', # the string used to erase the string added
124 # to SQL if show_progress is on. Again, the
125 # default is probably good enough.
126
127 squash_repeats => 1, # set to true to make repeated SQL queries
128 # be ellided and only show the new bind params
2924f8b3 129 # any other args are passed through directly to SQL::Abstract::Tree
0d5df7d6 130 });
6b1bf9f8 131
6b1bf9f8 132