App-DBBrowser
view release on metacpan or search on metacpan
lib/App/DBBrowser/Table/Extensions.pm view on Meta::CPAN
sub __choose_extension {
my ( $sf, $sql, $clause, $r_data, $caller, $extensions, $opt ) = @_;
my $ax = App::DBBrowser::Auxil->new( $sf->{i}, $sf->{o}, $sf->{d} );
my $tr = Term::Form::ReadLine->new( $sf->{i}{tr_default} );
my $tc = Term::Choose->new( $sf->{i}{tc_default} );
my $tu = Term::Choose::Util->new( $sf->{i}{tcu_default} );
my $old_idx = 0;
EXTENSION: while ( 1 ) {
my $info = $ax->get_sql_info( $sql ) . $sf->nested_func_info( $r_data );
my $extension;
if ( @$extensions == 1 && (
( $caller eq 'value' && ! $sf->{o}{enable}{extended_values} )
|| ( $caller eq 'argument' && ! $sf->{o}{enable}{extended_args} )
) ) {
$extension = $extensions->[0];
}
else {
my $empty;
if ( $caller eq 'column' && $clause eq 'where' ) {
$empty = 'skip'; ##
}
my @pre = ( undef );
# Choose
my $idx = $tc->choose(
[ @pre, @$extensions ],
{ %{$sf->{i}{lyt_h}}, info => $info, index => 1, default => $old_idx,
prompt => $opt->{prompt}, undef => '<<', empty => $empty }
);
$ax->print_sql_info( $info );
if ( ! $idx ) { ##
return;
}
if ( $sf->{o}{G}{menu_memory} ) {
if ( $old_idx == $idx && ! $ENV{TC_RESET_AUTO_UP} ) {
$old_idx = 0;
next EXTENSION;
}
$old_idx = $idx;
}
$extension = $extensions->[$idx-@pre];
}
my $cols = $sf->__avail_cols_in_extenstions( $sql, $clause, $extension );
if ( $extension eq $e_const ) {
my $prompt = $opt->{prompt} // 'Value: ';
# Readline
my $value = $tr->readline(
$prompt,
{ info => $info, history => $opt->{history} }
);
$ax->print_sql_info( $info );
if ( ! defined $value ) {
return if @$extensions = 1;
next EXTENSION;
}
# return if ! length $value; ##
if ( $opt->{is_numeric} ) {
if ( $opt->{is_numeric} == -1 ) {
# -1: unknown data type
return $ax->quote_if_not_numeric( $value );
}
else {
#return $value; # then change the documentation
return $ax->quote_if_not_numeric( $value );
}
}
else {
return $sf->{d}{dbh}->quote( $value );
}
}
elsif ( $extension eq $e_subquery ) {
my $new_sq = App::DBBrowser::From::Subquery->new( $sf->{i}, $sf->{o}, $sf->{d} );
my $subq = $new_sq->subquery( $sql, $info );
if ( ! defined $subq ) {
return if @$extensions == 1;
next EXTENSION;
}
return $subq;
}
elsif ( $extension eq $e_scalar_func ) {
my $new_func = App::DBBrowser::Table::Extensions::ScalarFunctions->new( $sf->{i}, $sf->{o}, $sf->{d} );
my $scalar_func_stmt = $new_func->scalar_function( $sql, $clause, $cols, $r_data ); # recursion yes
if ( ! defined $scalar_func_stmt ) {
return if @$extensions == 1;
next EXTENSION;
}
return $scalar_func_stmt;
}
elsif ( $extension eq $e_window_func ) {
my $wf = App::DBBrowser::Table::Extensions::WindowFunctions->new( $sf->{i}, $sf->{o}, $sf->{d} );
my $win_func_stmt = $wf->window_function( $sql, $clause, $cols, $r_data );
if ( ! defined $win_func_stmt ) {
return if @$extensions == 1;
next EXTENSION;
}
return $win_func_stmt;
}
elsif ( $extension eq $e_case ) {
my $new_cs = App::DBBrowser::Table::Extensions::Case->new( $sf->{i}, $sf->{o}, $sf->{d} );
my $case_stmt = $new_cs->case( $sql, $clause, $cols, $r_data ); # recursion yes
if ( ! defined $case_stmt ) {
return if @$extensions == 1;
next EXTENSION;
}
return $case_stmt;
}
elsif ( $extension eq $e_math ) {
my $new_math = App::DBBrowser::Table::Extensions::Maths->new( $sf->{i}, $sf->{o}, $sf->{d} );
my $arith = $new_math->maths( $sql, $clause, $cols, $r_data ); # recursion yes
if ( ! defined $arith ) {
return if @$extensions == 1;
next EXTENSION;
}
return $arith;
}
elsif ( $extension eq $e_col ) {
my $new_col = App::DBBrowser::Table::Extensions::Columns->new( $sf->{i}, $sf->{o}, $sf->{d} );
my $col = $new_col->columns( $sql, $cols, $info );
if ( ! defined $col ) {
return if @$extensions == 1;
next EXTENSION;
}
return $col;
}
( run in 0.612 second using v1.01-cache-2.11-cpan-39bf76dae61 )