X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=rt%2Flib%2FRT%2FSQL.pm;h=f470a91f163d8f01f2b12e01f1e59734f8e6e1e4;hb=7322f2afedcc2f427e997d1535a503613a83f088;hp=bf48bda503ad56bb6994409473fae92736e9bddf;hpb=e70abd21bab68b23488f7ef1ee2e693a3b365691;p=freeside.git diff --git a/rt/lib/RT/SQL.pm b/rt/lib/RT/SQL.pm index bf48bda50..f470a91f1 100644 --- a/rt/lib/RT/SQL.pm +++ b/rt/lib/RT/SQL.pm @@ -1,40 +1,40 @@ # BEGIN BPS TAGGED BLOCK {{{ -# +# # COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# -# +# +# This software is Copyright (c) 1996-2016 Best Practical Solutions, LLC +# +# # (Except where explicitly superseded by other copyright notices) -# -# +# +# # LICENSE: -# +# # This work is made available to you under the terms of Version 2 of # the GNU General Public License. A copy of that license should have # been provided with this software, but in any event can be snarfed # from www.gnu.org. -# +# # This work is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. -# +# # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 or visit their web page on the internet at # http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# +# +# # CONTRIBUTION SUBMISSION POLICY: -# +# # (The following paragraph is not intended to limit the rights granted # to you to modify and distribute this software under the terms of # the GNU General Public License and is only of importance to you if # you choose to contribute your changes and enhancements to the # community by submitting them to Best Practical Solutions, LLC.) -# +# # By intentionally submitting any modifications, corrections or # derivatives to this work, or any other work intended for use with # Request Tracker, to Best Practical Solutions, LLC, you confirm that @@ -43,7 +43,7 @@ # royalty-free, perpetual, license to use, copy, create derivative # works based on those contributions, and sublicense and distribute # those contributions and any derivatives thereof. -# +# # END BPS TAGGED BLOCK }}} package RT::SQL; @@ -51,10 +51,6 @@ package RT::SQL; use strict; use warnings; -use constant HAS_BOOLEAN_PARSER => do { - local $@; - eval { require Parse::BooleanLogic; 1 } -}; # States use constant VALUE => 1; @@ -68,9 +64,9 @@ my @tokens = qw[VALUE AGGREGATOR OPERATOR OPEN_PAREN CLOSE_PAREN KEYWORD]; use Regexp::Common qw /delimited/; my $re_aggreg = qr[(?i:AND|OR)]; my $re_delim = qr[$RE{delimited}{-delim=>qq{\'\"}}]; -my $re_value = qr[\d+|NULL|$re_delim]; +my $re_value = qr[[+-]?\d+|(?i:NULL)|$re_delim]; my $re_keyword = qr[[{}\w\.]+|$re_delim]; -my $re_op = qr[=|!=|>=|<=|>|<|(?i:IS NOT)|(?i:IS)|(?i:NOT LIKE)|(?i:LIKE)]; # long to short +my $re_op = qr[=|!=|>=|<=|>|<|(?i:IS NOT)|(?i:IS)|(?i:NOT LIKE)|(?i:LIKE)|(?i:NOT STARTSWITH)|(?i:STARTSWITH)|(?i:NOT ENDSWITH)|(?i:ENDSWITH)]; # long to short my $re_open_paren = qr[\(]; my $re_close_paren = qr[\)]; @@ -92,6 +88,7 @@ sub ParseToArray { sub Parse { my ($string, $cb) = @_; + my $loc = sub {HTML::Mason::Commands::loc(@_)}; $string = '' unless defined $string; my $want = KEYWORD | OPEN_PAREN; @@ -128,7 +125,7 @@ sub Parse { unless ($current && $want & $current) { my $tmp = substr($string, 0, pos($string)- length($match)); $tmp .= '>'. $match .'<--here'. substr($string, pos($string)); - my $msg = "Wrong query, expecting a ". _BitmaskToString($want) ." in '$tmp'"; + my $msg = $loc->("Wrong query, expecting a [_1] in '[_2]'", _BitmaskToString($want), $tmp); return $cb->{'Error'}->( $msg ) if $cb->{'Error'}; die $msg; } @@ -178,7 +175,7 @@ sub Parse { $want = AGGREG; $want |= CLOSE_PAREN if $depth; } else { - my $msg = "Query parser is lost"; + my $msg = $loc->("Query parser is lost"); return $cb->{'Error'}->( $msg ) if $cb->{'Error'}; die $msg; } @@ -187,15 +184,15 @@ sub Parse { } # while unless( !$last || $last & (CLOSE_PAREN | VALUE) ) { - my $msg = "Incomplete query, last element (" - . _BitmaskToString($last) - . ") is not CLOSE_PAREN or VALUE in '$string'"; + my $msg = $loc->("Incomplete query, last element ([_1]) is not close paren or value in '[_2]'", + _BitmaskToString($last), + $string); return $cb->{'Error'}->( $msg ) if $cb->{'Error'}; die $msg; } if( $depth ) { - my $msg = "Incomplete query, $depth paren(s) isn't closed in '$string'"; + my $msg = $loc->("Incomplete query, [quant,_1,unclosed paren,unclosed parens] in '[_2]'", $depth, $string); return $cb->{'Error'}->( $msg ) if $cb->{'Error'}; die $msg; } @@ -215,88 +212,6 @@ sub _BitmaskToString { return join ' or ', @res; } -sub PossibleCustomFields { - my %args = (Query => undef, CurrentUser => undef, @_); - - my $cfs = RT::CustomFields->new( $args{'CurrentUser'} ); - my $ocf_alias = $cfs->_OCFAlias; - $cfs->LimitToLookupType( 'RT::Queue-RT::Ticket' ); - - my $tree; - if ( HAS_BOOLEAN_PARSER ) { - $tree = Parse::BooleanLogic->filter( - RT::SQL::ParseToArray( $args{'Query'} ), - sub { $_[0]->{'key'} =~ /^Queue(?:\z|\.)/ }, - ); - } - if ( $tree && @$tree ) { - my $clause = 'QUEUES'; - my $queue_alias = $cfs->Join( - TYPE => 'LEFT', - ALIAS1 => $ocf_alias, - FIELD1 => 'ObjectId', - TABLE2 => 'Queues', - FIELD2 => 'id', - ); - $cfs->_OpenParen($clause); - $cfs->Limit( - SUBCLAUSE => $clause, - ENTRYAGGREGATOR => 'AND', - ALIAS => $ocf_alias, - FIELD => 'ObjectId', - VALUE => 0, - ); - $cfs->_OpenParen($clause); - - my $ea = 'OR'; - Parse::BooleanLogic->walk( - $tree, - { - open_paren => sub { $cfs->_OpenParen($clause) }, - close_paren => sub { $cfs->_CloseParen($clause) }, - operator => sub { $ea = $_[0] }, - operand => sub { - my ($key, $op, $value) = @{$_[0]}{'key', 'op', 'value'}; - my (undef, @sub) = split /\./, $key; - push @sub, $value =~ /\D/? 'Name' : 'id' - unless @sub; - - die "Couldn't handle ". join('.', 'Queue', @sub) if @sub > 1; - $cfs->Limit( - SUBCLAUSE => $clause, - ENTRYAGGREGATOR => $ea, - ALIAS => $queue_alias, - FIELD => $sub[0], - OPERATOR => $op, - VALUE => $value, - ); - }, - } - ); - - $cfs->_CloseParen($clause); - $cfs->_CloseParen($clause); - } else { - $cfs->Limit( - ENTRYAGGREGATOR => 'AND', - ALIAS => $ocf_alias, - FIELD => 'ObjectId', - OPERATOR => 'IS NOT', - VALUE => 'NULL', - ); - } - return $cfs; -} - - -eval "require RT::SQL_Vendor"; -if ($@ && $@ !~ qr{^Can't locate RT/SQL_Vendor.pm}) { - die $@; -}; - -eval "require RT::SQL_Local"; -if ($@ && $@ !~ qr{^Can't locate RT/SQL_Local.pm}) { - die $@; -}; +RT::Base->_ImportOverlays(); 1;