App-AutoCRUD
view release on metacpan or search on metacpan
lib/App/AutoCRUD/Controller/Table.pm view on Meta::CPAN
$context->set_template("table/$meth_name.tt");
$context->set_title($context->title . "-" . $table);
# dispatch to method
return $self->$method($table);
}
#----------------------------------------------------------------------
# published methods
#----------------------------------------------------------------------
sub descr {
my ($self, $table) = @_;
my $datasource = $self->datasource;
my $descr = $datasource->config(tables => $table => 'descr');
# datastructure describing this table
return {table => $table,
colgroups => $datasource->colgroups($table),
primary_key => [$datasource->primary_key($table)],
descr => $descr};
}
sub list {
my ($self, $table) = @_;
my $context = $self->context;
my $req_data = $context->req_data;
my $datasource = $context->datasource;
# the "message" arg is sent once from inserts/updates/deletes; not to
# be repeated in links to other queries
my $message = delete $req_data->{-message};
# dashed args are set apart
my %where_args = %$req_data; # need a clone because of deletes below
my %dashed_args = $context->view->default_dashed_args($context);
foreach my $arg (grep {/^-/} keys %where_args) {
$dashed_args{$arg} = delete $where_args{$arg};
}
# some dashed args are treated here (not sent to the SQL request)
my $with_count = delete $dashed_args{-with_count};
my $template = delete $dashed_args{-template};
$context->set_template($template) if $template;
# select from database
my $criteria = $datasource->query_parser->parse(\%where_args) || {};
my $statement = $datasource->schema->db_table($table)->select(
-where => $criteria,
%dashed_args,
-result_as => 'statement',
);
my $rows = $statement->select();
# recuperate SQL for logging / informational purposes
my ($sql, @bind) = $statement->sql;
my $show_sql = join " / ", $sql, @bind;
$self->logger({level => 'debug', message => $show_sql});
# assemble results
my $data = $self->descr($table);
$data->{rows} = $rows;
$data->{message} = $message;
$data->{criteria} = $show_sql;
if ($with_count) {
$data->{row_count} = $statement->row_count;
$data->{page_count} = $statement->page_count;
}
# links to prev/next pages
$self->_add_links_to_other_pages($data, $req_data,
$dashed_args{-page_index},
$dashed_args{-page_size});
# link to update/delete forms
$data->{where_args} = $self->_query_string(
map { ("where.$_" => $where_args{$_}) } keys %where_args,
);
return $data;
}
sub _add_links_to_other_pages {
my ($self, $data, $req_data, $page_index, $page_size) = @_;
return unless defined $page_index && defined $page_size;
$data->{page_index} = $page_index;
$data->{offset} = ($page_index - 1) * $page_size + 1;
$data->{similar_query} = $self->_query_string(%$req_data,
-page_index => 1);
$data->{next_page} = $self->_query_string(%$req_data,
-page_index => $page_index+1)
unless @{$data->{rows}} < $page_size;
$data->{prev_page} = $self->_query_string(%$req_data,
-page_index => $page_index-1)
unless $page_index <= 1;
}
sub id {
my ($self, $table) = @_;
my $data = $self->descr($table);
my $pk = $data->{primary_key};
my @vals = $self->context->extract_path_segments(scalar(@$pk));
my %criteria = mesh @$pk, @vals;
# get row from database
my $row = $self->datasource->schema->db_table($table)->fetch(@vals);
# assemble results
$data->{row} = $row;
$data->{pk_val} = join "/", @vals;
( run in 1.008 second using v1.01-cache-2.11-cpan-2398b32b56e )