App-AltSQL
view release on metacpan or search on metacpan
lib/App/AltSQL/View.pm view on Meta::CPAN
return $class->$orig(\%args);
}
$args{footer} = sprintf "%d rows in set (%s)\n\n", int @{ $table_data{rows} }, _describe_timing($args{timing});
return $class->$orig(\%args);
};
=head2 render %args
Optionally pass 'no_pager' or 'one_row_per_column'. Will render the stored buffer by either printing it to the screen or piping it to a pager.
=cut
sub render {
my $self = shift;
my %args = validate(@_, {
no_pager => 0,
one_row_per_column => 0,
});
# Buffer will be unset unless there is a static result
my $buffer = $self->buffer;
if ($buffer) {
print $buffer;
return;
}
# Otherwise, construct the buffer from rendering the table_data with footer
if ($args{one_row_per_column}) {
$buffer = $self->render_one_row_per_column();
}
else {
$buffer = $self->render_table();
}
if ($self->footer) {
$buffer .= $self->footer;
}
## Possibly page the output
my $pager;
my ($buffer_width, $buffer_height) = _buffer_dimensions(\$buffer);
# less args are:
# -F quit if one screen
# -R support color
# -X don't send termcap init
# -S chop long lines; don't wrap long lines
if ($buffer_width > $self->app->term->get_term_width) {
$pager = 'less -FRXS';
}
elsif ($buffer_height > $self->app->term->get_term_height) {
$pager = 'less -FRX';
}
if ($pager && ! $args{no_pager}) {
open my $out, "| $pager" or die "Can't open $pager for pipe: $!";
binmode $out, ':utf8';
print $out $buffer;
close $out;
}
else {
print $buffer;
}
}
=head2 render_table
Given the table data that was extracted from the statement handler, compose a nicely formatted table for showing to the user.
Optionally pass in the table data to be used.
=cut
sub render_table {
my ($self, $data) = @_;
$data ||= $self->table_data;
my %table = (
alignment => [ map { $_->{is_num} ? 'right' : 'left' } @{ $data->{columns} } ],
columns => [ map { $self->format_column_cell($_) } @{ $data->{columns} } ],
rows => [],
);
foreach my $row (@{ $data->{rows} }) {
my @row;
foreach my $i (0..$#{ $data->{columns} }) {
push @row, $self->format_cell($row->[$i], $data->{columns}[$i]);
}
push @{ $table{rows} }, \@row;
}
my $t0 = gettimeofday;
my $output = $self->_render_table_data(\%table);
$self->timing->{render_table} = gettimeofday - $t0;
return $output;
}
sub _render_table_data {
my ($self, $data) = @_;
require Text::ASCIITable;
my $table = Text::ASCIITable->new({ allowANSI => 1 });
$table->setCols(@{ $data->{columns} });
foreach my $row (@{ $data->{rows} }) {
$table->addRow(@$row);
}
return '' . $table;
}
=head2 render_one_row_column
Rather then using ASCII art to horizontally format each row, use one row of output per cell of data.
Optionally pass in the table data to be used.
=cut
sub render_one_row_per_column {
( run in 1.297 second using v1.01-cache-2.11-cpan-97f6503c9c8 )