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 )