X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FSQL%2FAbstract%2FTree.pm;h=28a276cc2aebcbb530d454f2fe292e715a2e00c9;hb=637bb22cb431db6283cafc3770f30fcee44eb5e4;hp=ada82df4f671c2f5832d192a4d4cd0fceb3fd15a;hpb=b7c3526d90d66059589c7102eb75d33e819e0dd2;p=scpubgit%2FQ-Branch.git diff --git a/lib/SQL/Abstract/Tree.pm b/lib/SQL/Abstract/Tree.pm index ada82df..28a276c 100644 --- a/lib/SQL/Abstract/Tree.pm +++ b/lib/SQL/Abstract/Tree.pm @@ -29,6 +29,7 @@ use base 'Class::Accessor::Grouped'; __PACKAGE__->mk_group_accessors( simple => $_ ) for qw( newline indent_string indent_amount colormap indentmap fill_in_placeholders + include_caller caller_depth ); # Parser states for _recurse_parse() @@ -122,6 +123,7 @@ my %indents = ( my %profiles = ( console => { + caller_depth => 0, fill_in_placeholders => 1, indent_string => ' ', indent_amount => 2, @@ -130,6 +132,7 @@ my %profiles = ( indentmap => { %indents }, }, console_monochrome => { + caller_depth => 0, fill_in_placeholders => 1, indent_string => ' ', indent_amount => 2, @@ -138,6 +141,7 @@ my %profiles = ( indentmap => { %indents }, }, html => { + caller_depth => 0, fill_in_placeholders => 1, indent_string => ' ', indent_amount => 2, @@ -332,7 +336,7 @@ sub _fill_in_placeholder { my ($self, $bindargs) = @_; if ($self->fill_in_placeholders) { - my $val = pop @{$bindargs}; + my $val = pop @{$bindargs} || ''; $val =~ s/\\/\\\\/g; $val =~ s/'/\\'/g; return qq('$val') @@ -340,10 +344,21 @@ sub _fill_in_placeholder { return '?' } +sub _caller_info { + my ($self, $depth) = @_; + + return '' if $depth != 1 or !$self->include_caller; + + my @caller_info = caller($self->caller_depth + 0); + + " at $caller_info[1] line $caller_info[2]."; +} + sub unparse { - my ($self, $tree, $bindargs, $depth) = @_; + my ($self, $tree, $bindargs, $indent, $depth) = @_; - $depth ||= 0; + $depth ||= 0; + $indent ||= 0; if (not $tree ) { return ''; @@ -353,7 +368,7 @@ sub unparse { my $cdr = $tree->[1]; if (ref $car) { - return join ('', map $self->unparse($_, $bindargs, $depth), @$tree); + return join ('', map $self->unparse($_, $bindargs, $indent, $depth + 1), @$tree); } elsif ($car eq 'LITERAL') { if ($cdr->[0] eq '?') { @@ -364,15 +379,15 @@ sub unparse { elsif ($car eq 'PAREN') { return '(' . join(' ', - map $self->unparse($_, $bindargs, $depth + 2), @{$cdr}) . - ($self->_is_key($cdr)?( $self->newline||'' ).$self->indent($depth + 1):'') . ') '; + map $self->unparse($_, $bindargs, $indent + 2, $depth + 1), @{$cdr}) . + ($self->_is_key($cdr)?( $self->newline||'' ).$self->indent($indent + 1):'') . ') '; } elsif ($car eq 'OR' or $car eq 'AND' or (grep { $car =~ /^ $_ $/xi } @binary_op_keywords ) ) { - return join (" $car ", map $self->unparse($_, $bindargs, $depth), @{$cdr}); + return join (" $car ", map $self->unparse($_, $bindargs, $indent, $depth + 1), @{$cdr}); } else { - my ($l, $r) = @{$self->whitespace($car, $depth)}; - return sprintf "$l%s %s$r", $self->format_keyword($car), $self->unparse($cdr, $bindargs, $depth); + my ($l, $r) = @{$self->whitespace($car, $indent)}; + return sprintf "$l%s %s$r%s", $self->format_keyword($car), $self->unparse($cdr, $bindargs, $indent, $depth + 1), $self->_caller_info($depth); } }