App-DBBrowser
view release on metacpan or search on metacpan
lib/App/DBBrowser/From/Subquery.pm view on Meta::CPAN
);
$ax->print_sql_info( $info );
if ( ! length $stmt ) {
next CHOOSE_QUERY;
}
unshift @{$sf->{d}{subquery_history}}, $stmt;
if ( $stmt =~ /^\s*(?:SELECT|WITH)\s/i ) {
# A statement entered with readline could have a WITH clause.
return "($stmt)";
}
else {
return $stmt;
}
}
}
sub __choose_query {
my ( $sf, $sql, $caller, $ext_info ) = @_;
my $ax = App::DBBrowser::Auxil->new( $sf->{i}, $sf->{o}, $sf->{d} );
my $tc = Term::Choose->new( $sf->{i}{tc_default} );
my ( $saved_subqueries, $subquery_history, $print_history ) = $sf->__get_history();
my $edit_sq_history_file = 'Choose:';
my ( $readline, $build_SQ ) = ( ' Readline', ' SQL Menu' );
my @pre = ( $edit_sq_history_file, undef, $build_SQ, $readline );
my $old_idx = 1;
SUBQUERY: while ( 1 ) {
my @queries = $sf->__get_queries( $saved_subqueries, $subquery_history, $print_history );
my $menu = [ @pre, @queries ];
my $info = $ext_info || $ax->get_sql_info( $sql );
# Choose
my $idx = $tc->choose(
$menu,
{ %{$sf->{i}{lyt_v}}, info => $info, prompt => '', index => 1, default => $old_idx, undef => '<=' }
);
$ax->print_sql_info( $info );
if ( ! defined $idx || ! defined $menu->[$idx] ) {
return;
}
if ( $sf->{o}{G}{menu_memory} ) {
if ( $old_idx == $idx && ! $ENV{TC_RESET_AUTO_UP} ) {
$old_idx = 1;
next SUBQUERY;
}
$old_idx = $idx;
}
my $selected_stmt;
if ( $menu->[$idx] eq $edit_sq_history_file ) {
if ( $sf->__edit_sq_history_file() ) {
( $saved_subqueries, $subquery_history, $print_history ) = $sf->__get_history();
@queries = $sf->__get_queries( $saved_subqueries, $subquery_history, $print_history );
$menu = [ @pre, @queries ];
}
next SUBQUERY;
}
elsif ( $menu->[$idx] eq $readline ) {
$selected_stmt = '';
}
elsif ( $menu->[$idx] eq $build_SQ ) {
# Don't backup $sf->{d}{default_table_alias_count}
my $bu_stmt_types = [ @{$sf->{d}{stmt_types}} ];
my $bu_table_origin = $sf->{d}{table_origin};
my $bu_main_info = $sf->{d}{main_info};
$sf->{d}{main_info} = $ext_info || $ax->get_sql_info( $sql );
$sf->{d}{nested_subqueries}++;
my $stmt = $sf->__build_SQ( $caller );
$sf->{d}{nested_subqueries}--;
$sf->{d}{stmt_types} = $bu_stmt_types;
$sf->{d}{table_origin} = $bu_table_origin;
$sf->{d}{main_info} = $bu_main_info;
if ( ! defined $stmt ) {
next SUBQUERY;
}
$sf->{from_build_SQ} = 1;
$selected_stmt = $ax->normalize_space_in_stmt( $stmt );
}
else {
$idx -= @pre;
if ( $idx < @$saved_subqueries ) {
$selected_stmt = $saved_subqueries->[$idx]{stmt};
}
else {
$idx -= @$saved_subqueries;
$selected_stmt = ( @$subquery_history, @$print_history )[$idx];
}
}
return $selected_stmt;
}
}
sub __session_history {
my ( $sf ) = @_;
my $ax = App::DBBrowser::Auxil->new( $sf->{i}, $sf->{o}, $sf->{d} );
# Print history:
my $print_history = [];
for my $stmt ( @{$sf->{d}{table_print_history}} ) {
$stmt = $ax->normalize_space_in_stmt( $stmt );
$stmt =~ s/^ WITH \s .+ \) \s ( SELECT \s .+ ) \z/$1/ix;
if ( $stmt =~ /^ SELECT \s \* \s FROM \s \(( SELECT \s .+ ) \) \s \S+ \z/ix ) {
# union stmt
$stmt = $1;
}
if ( any { $_ eq $stmt } @$print_history ) {
next;
}
push @$print_history, $stmt;
if ( @$print_history == 7 ) {
$sf->{d}{table_print_history} = [ @$print_history ];
last;
}
}
# Subquery history:
# Subqueries in `$sf->{d}{subquery_history}` to survive the end of Subqueries.pm in a controlled way.
my $subquery_history = $sf->{d}{subquery_history};
my $tmp_subquery_history = [];
for my $subquery ( @$subquery_history ) {
if ( any { $_ eq $subquery } @$tmp_subquery_history, @$print_history ) {
( run in 0.836 second using v1.01-cache-2.11-cpan-39bf76dae61 )