App-DBBrowser
view release on metacpan or search on metacpan
lib/App/DBBrowser/From/Cte.pm view on Meta::CPAN
$idx -= @pre;
my $cte_name = $sf->{d}{cte_history}[$idx]{name};
return $cte_name;
}
}
}
sub __prepare_and_add_cte {
my ( $sf, $sql ) = @_;
my $ax = App::DBBrowser::Auxil->new( $sf->{i}, $sf->{o}, $sf->{d} );
my $sq = App::DBBrowser::From::Subquery->new( $sf->{i}, $sf->{o}, $sf->{d} );
my $tc = Term::Choose->new( $sf->{i}{tc_default} );
my $tr = Term::Form::ReadLine->new( $sf->{i}{tr_default} );
my $ctes = [ @{$sf->{d}{cte_history}} ];
CHOOSE_QUERY: while ( 1 ) {
my $selected_stmt = $sq->__choose_query( $sql, 'cte' );
if ( ! defined $selected_stmt ) {
return;
}
my $count_query_loop;
QUERY: while ( 1 ) {
my $info = $ax->get_sql_info( $sql ); ##
# Readline
my $query = $tr->readline(
'Stmt: ',
{ default => $selected_stmt, show_context => 1, info => $info }
);
$ax->print_sql_info( $info );
if ( ! length $query ) {
next CHOOSE_QUERY;
}
$info .= "\n". 'Stmt: ' . $query;
my $default_name;
NAME: while ( 1 ) {
# Readline
my $full_cte_name = $tr->readline(
'Name: ',
{ default => $default_name, show_context => 1, info => $info, history => [ 'cte1' .. 'cte9' ] }
);
$ax->print_sql_info( $info );
if ( ! length $full_cte_name ) {
next CHOOSE_QUERY if ++$count_query_loop > 1;
next QUERY;
}
my $rx_quoted_identifier = $ax->regex_quoted_identifier();
my $cte_name = $full_cte_name =~ s/^ \s* (?:RECURSIVE\s+)? ( $rx_quoted_identifier | [^\s(]+ ) \s* (?:\(.+)? \z/$1/rix;
my $cte = {
full_name => $full_cte_name,
query => $query,
name => $cte_name,
};
$default_name = length $default_name ? '' : $full_cte_name;
my @table_keys = keys %{$sf->{d}{tables_info}};
my @cte_names = map { $_->{name} } @$ctes;
if ( any { $_ eq $cte_name } @table_keys, @cte_names ) {
my $type = ( grep { $_ eq $cte_name } @table_keys ) ? 'table' : 'CTE';
my $prompt = "A $type '$cte_name' already exists.";
# Choose
$tc->choose(
[ 'Press ENTER' ],
{ %{$sf->{i}{lyt_h}}, info => $info, prompt => $prompt }
);
$ax->print_sql_info( $info );
next NAME;
}
else {
if ( $cte->{full_name} =~ s/^\s*RECURSIVE\s+//i ) {
$cte->{is_recursive} = 1;
}
push @$ctes, $cte;
$sf->{d}{cte_history} = [ @$ctes ];
unshift @{$sf->{d}{subquery_history}}, $query;
return 1;
}
}
}
}
}
sub __remove_ctes {
my ( $sf, $sql ) = @_;
my $ax = App::DBBrowser::Auxil->new( $sf->{i}, $sf->{o}, $sf->{d} );
my $tc = Term::Choose->new( $sf->{i}{tc_default} );
my $confirm = $sf->{i}{_confirm};
my $all = ' All CTEs';
my $ctes = [ @{$sf->{d}{cte_history}} ];
my @bu;
REMOVE_CTE: while ( 1 ) {
$sf->{d}{cte_history} = [ @$ctes ];
my @pre = ( undef, $confirm );
my $menu = [ @pre, map( '- ' . $_->{name}, @$ctes ) ];
push @$menu, $all;
my $info = $ax->get_sql_info( $sql );
# Choose
my $idx = $tc->choose(
$menu,
{ %{$sf->{i}{lyt_v}}, info => $info, prompt => 'Remove CTE:', index => 1, undef => $sf->{i}{_back} }
);
$ax->print_sql_info( $info );
if ( ! defined $idx || $idx == 0 ) {
if ( @bu ) {
$ctes = pop @bu;
next REMOVE_CTE;
}
return;
}
push @bu, [ @$ctes ];
if ( $menu->[$idx] eq $confirm ) {
$sf->{d}{cte_history} = [ @$ctes ];
return 1;
}
elsif ( $menu->[$idx] eq $all ) {
$ctes = [];
}
else {
$idx -= @pre;
splice( @$ctes, $idx, 1 );
}
}
}
1;
__END__
( run in 0.542 second using v1.01-cache-2.11-cpan-6aa56a78535 )