App-DBBrowser
view release on metacpan or search on metacpan
lib/App/DBBrowser/Table/Substatement/Condition.pm view on Meta::CPAN
}
}
}
sub __add_operator_and_value {
my ( $sf, $sql, $clause, $stmt, $col, $r_data ) = @_;
my $ax = App::DBBrowser::Auxil->new( $sf->{i}, $sf->{o}, $sf->{d} );
my $tc = Term::Choose->new( $sf->{i}{tc_default} );
my @operators = @{$sf->{o}{G}{operators}};
my $not_equal = ( any { $_ =~ /^\s?!=\s?\z/ } @operators ) ? "!=" : "<>";
if ( ! length $col ) {
$sql->{$stmt} =~ s/\s\z//;
@operators = ( "EXISTS", "NOT EXISTS" );
}
elsif ( $sf->{i}{driver} eq 'SQLite' ) {
@operators = grep { ! /^(?:ANY|ALL)\z/ } @operators;
}
elsif ( $sf->{i}{driver} eq 'Firebird' ) {
@operators = uniq map { s/REGEXP(?:_i)?\z/SIMILAR TO/; $_ } @operators;
}
lib/App/DBBrowser/Table/Substatement/Condition.pm view on Meta::CPAN
{ %{$sf->{i}{lyt_h}}, info => $info }
);
$ax->print_sql_info( $info );
if ( ! defined $operator ) {
$sql->{$stmt} = $bu_stmt;
return;
}
#}
$operator =~ s/^\s+|\s+\z//g;
if ( $operator =~ /(?:REGEXP(?:_i)?|SIMILAR\sTO)\z/ ) {
my $not_match = $operator =~ /^NOT/ ? 1 : 0;
my $case_sensitive = $operator =~ /REGEXP_i\z/ ? 0 : 1;
my $regex_op = $sf->__pattern_match( $col, $not_match, $case_sensitive );
if ( ! $regex_op ) {
next OPERATOR if @operators > 1;
return;
}
$sql->{$stmt} =~ s/ (?: (?<=\() | \s ) \Q$col\E \z //x;
if ( $sql->{$stmt} =~ /\(\z/ ) {
$regex_op =~ s/^\s//;
}
$sql->{$stmt} .= $regex_op;
}
elsif ( $operator =~ /^(?:ALL|ANY)\z/) {
my @comb_op = ( "= $operator", "$not_equal $operator", "> $operator", "< $operator", ">= $operator", "<= $operator" );
my @pre = ( undef );
my $info = $sf->__info_add_condition( $sql, $stmt, $r_data );
# Choose
$operator = $tc->choose(
[ @pre, @comb_op ],
{ %{$sf->{i}{lyt_h}}, info => $info }
);
$ax->print_sql_info( $info );
if ( ! defined $operator ) {
next OPERATOR if @operators > 1;
lib/App/DBBrowser/Table/Substatement/Condition.pm view on Meta::CPAN
next COL;
}
$col = $complex_col;
}
return $col;
}
}
sub __pattern_match {
my ( $sf, $col, $not_match, $case_sensitive ) = @_;
my $driver = $sf->{i}{driver};
if ( $driver eq 'SQLite' ) {
if ( $not_match ) {
return sprintf " NOT REGEXP(?,%s,%d)", $col, $case_sensitive;
}
else {
return sprintf " REGEXP(?,%s,%d)", $col, $case_sensitive;
}
}
elsif ( $driver =~ /^(?:mysql|MariaDB)\z/ ) {
if ( $not_match ) {
return " $col NOT REGEXP" if ! $case_sensitive;
return " $col NOT REGEXP BINARY" if $case_sensitive;
}
else {
return " $col REGEXP" if ! $case_sensitive;
return " $col REGEXP BINARY" if $case_sensitive;
}
}
elsif ( $driver eq 'Pg' ) {
if ( $not_match ) {
return " ${col}::text !~*" if ! $case_sensitive; ##
return " ${col}::text !~" if $case_sensitive;
}
else {
return " ${col}::text ~*" if ! $case_sensitive;
return " ${col}::text ~" if $case_sensitive;
}
}
elsif ( $driver eq 'Firebird' ) {
if ( $not_match ) {
return " $col NOT SIMILAR TO ? ESCAPE '\\'";
}
else {
return " $col SIMILAR TO ? ESCAPE '\\'";
}
}
elsif ( $driver =~ /^(?:DB2|Oracle)\z/ ) {
if ( $not_match ) {
return " NOT REGEXP_LIKE($col,?,'i')" if ! $case_sensitive;
return " NOT REGEXP_LIKE($col,?,'c')" if $case_sensitive;
}
else {
return " REGEXP_LIKE($col,?,'i')" if ! $case_sensitive;
return " REGEXP_LIKE($col,?,'c')" if $case_sensitive;
}
}
}
( run in 0.400 second using v1.01-cache-2.11-cpan-4d4bc49f3ae )