Server IP : 103.119.228.120 / Your IP : 18.117.99.192 Web Server : Apache System : Linux v8.techscape8.com 3.10.0-1160.119.1.el7.tuxcare.els2.x86_64 #1 SMP Mon Jul 15 12:09:18 UTC 2024 x86_64 User : nobody ( 99) PHP Version : 5.6.40 Disable Function : shell_exec,symlink,system,exec,proc_get_status,proc_nice,proc_terminate,define_syslog_variables,syslog,openlog,closelog,escapeshellcmd,passthru,ocinum cols,ini_alter,leak,listen,chgrp,apache_note,apache_setenv,debugger_on,debugger_off,ftp_exec,dl,dll,myshellexec,proc_open,socket_bind,proc_close,escapeshellarg,parse_ini_filepopen,fpassthru,exec,passthru,escapeshellarg,escapeshellcmd,proc_close,proc_open,ini_alter,popen,show_source,proc_nice,proc_terminate,proc_get_status,proc_close,pfsockopen,leak,apache_child_terminate,posix_kill,posix_mkfifo,posix_setpgid,posix_setsid,posix_setuid,dl,symlink,shell_exec,system,dl,passthru,escapeshellarg,escapeshellcmd,myshellexec,c99_buff_prepare,c99_sess_put,fpassthru,getdisfunc,fx29exec,fx29exec2,is_windows,disp_freespace,fx29sh_getupdate,fx29_buff_prepare,fx29_sess_put,fx29shexit,fx29fsearch,fx29ftpbrutecheck,fx29sh_tools,fx29sh_about,milw0rm,imagez,sh_name,myshellexec,checkproxyhost,dosyayicek,c99_buff_prepare,c99_sess_put,c99getsource,c99sh_getupdate,c99fsearch,c99shexit,view_perms,posix_getpwuid,posix_getgrgid,posix_kill,parse_perms,parsesort,view_perms_color,set_encoder_input,ls_setcheckboxall,ls_reverse_all,rsg_read,rsg_glob,selfURL,dispsecinfo,unix2DosTime,addFile,system,get_users,view_size,DirFiles,DirFilesWide,DirPrintHTMLHeaders,GetFilesTotal,GetTitles,GetTimeTotal,GetMatchesCount,GetFileMatchesCount,GetResultFiles,fs_copy_dir,fs_copy_obj,fs_move_dir,fs_move_obj,fs_rmdir,SearchText,getmicrotime MySQL : ON | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /usr/local/share/perl5/SQL/Statement/ |
Upload File : |
package SQL::Statement::TermFactory; ###################################################################### # # This module is copyright (c), 2009-2016 by Jens Rehsack. # All rights reserved. # # It may be freely distributed under the same terms as Perl itself. # See below for help and copyright information (search for SYNOPSIS). # ###################################################################### use strict; use warnings FATAL => "all"; use SQL::Statement::Term (); use SQL::Statement::Operation (); use SQL::Statement::Placeholder (); use SQL::Statement::Function (); use Data::Dumper; use Params::Util qw(_HASH _ARRAY0 _INSTANCE); use Scalar::Util qw(blessed weaken); our $VERSION = '1.410'; my %oplist = ( '=' => 'Equal', '<>' => 'NotEqual', 'AND' => 'And', 'OR' => 'Or', '<=' => 'LowerEqual', '>=' => 'GreaterEqual', '<' => 'Lower', '>' => 'Greater', 'LIKE' => 'Like', 'RLIKE' => 'Rlike', 'CLIKE' => 'Clike', 'IN' => 'Contains', 'BETWEEN' => 'Between', 'IS' => 'Is', ); sub new { my ( $class, $owner ) = @_; my $self = bless( { OWNER => $owner, }, $class ); weaken( $self->{OWNER} ); return $self; } my %opClasses; sub _getOpClass($) { my ( $self, $op ) = @_; unless ( defined( $opClasses{$op} ) ) { my $opBase = 'SQL::Statement::Operation'; my $opDialect = join( '::', $opBase, $self->{OWNER}->{dialect}, $oplist{$op} ); $opClasses{$op} = $opDialect->isa($opBase) ? $opDialect : join( '::', $opBase, $oplist{$op} ); } return $opClasses{$op}; } sub buildCondition { my ( $self, $pred ) = @_; my $term; if ( _ARRAY0($pred) ) { $term = [ map { $self->buildCondition($_) } @{$pred} ]; } elsif ( defined( $pred->{op} ) ) { my $op = uc( $pred->{op} ); if ( $op eq 'USER_DEFINED' && !$pred->{arg2} ) { $term = SQL::Statement::ConstantTerm->new( $self->{OWNER}, $pred->{arg1}->{value} ); } elsif ( defined( $oplist{$op} ) ) { my $cn = $self->_getOpClass($op); my $left = $self->buildCondition( $pred->{arg1} ); my $right = $self->buildCondition( $pred->{arg2} ); $term = $cn->new( $self->{OWNER}, $op, $left, $right ); } elsif ( defined( $self->{OWNER}->{opts}->{function_names}->{$op} ) ) { my $left = $self->buildCondition( $pred->{arg1} ); my $right = $self->buildCondition( $pred->{arg2} ); $term = SQL::Statement::Function::UserFunc->new( $self->{OWNER}, $op, $self->{OWNER}->{opts}->{function_names}->{$op}, [ $left, $right ] ); } else { return $self->{OWNER}->do_err( sprintf( q{Unknown operation '%s'}, $pred->{op} ) ); } if ( $pred->{neg} ) { $term = SQL::Statement::Operation::Neg->new( $self->{OWNER}, 'NOT', $term ); } } elsif ( defined( $pred->{type} ) ) { my $type = uc( $pred->{type} ); if ( $type =~ m/^(?:STRING|NUMBER|BOOLEAN)$/ ) { $term = SQL::Statement::ConstantTerm->new( $self->{OWNER}, $pred->{value} ); } elsif ( $type eq 'NULL' ) { $term = SQL::Statement::ConstantTerm->new( $self->{OWNER}, undef ); } elsif ( $type eq 'COLUMN' ) { $term = SQL::Statement::ColumnValue->new( $self->{OWNER}, $pred->{value} ); } elsif ( $type eq 'PLACEHOLDER' ) { $term = SQL::Statement::Placeholder->new( $self->{OWNER}, $pred->{argnum} ); } elsif ( $type eq 'FUNCTION' ) { my @params = map { blessed($_) ? $_ : $self->buildCondition($_) } @{ $pred->{value} }; if ( $pred->{name} eq 'numeric_exp' ) { $term = SQL::Statement::Function::NumericEval->new( $self->{OWNER}, $pred->{str}, \@params ); } elsif ( $pred->{name} eq 'str_concat' ) { $term = SQL::Statement::Function::StrConcat->new( $self->{OWNER}, \@params ); } elsif ( $pred->{name} eq 'TRIM' ) { $term = SQL::Statement::Function::Trim->new( $self->{OWNER}, $pred->{trim_spec}, $pred->{trim_char}, \@params ); } elsif ( $pred->{name} eq 'SUBSTRING' ) { my $start = $self->buildCondition( $pred->{start} ); my $length = $self->buildCondition( $pred->{length} ) if ( _HASH( $pred->{length} ) ); $term = SQL::Statement::Function::SubString->new( $self->{OWNER}, $start, $length, \@params ); } else { $term = SQL::Statement::Function::UserFunc->new( $self->{OWNER}, $pred->{name}, $pred->{subname}, \@params ); } } else { return $self->{OWNER}->do_err( sprintf( q{Unknown type '%s'}, $pred->{type} ) ); } } elsif ( defined( _INSTANCE( $pred, 'SQL::Statement::Term' ) ) ) { return $pred; } else { return $self->{OWNER}->do_err( sprintf( q~Unknown predicate '{%s}'~, Dumper($pred) ) ); } return $term; } sub DESTROY { my $self = $_[0]; undef $self->{OWNER}; } =pod =head1 NAME SQL::Statement::TermFactory - Factory for SQL::Statement::Term instances =head1 SYNOPSIS my $termFactory = SQL::Statement::TermFactory->new($stmt); my $whereTerms = $termFactory->buildCondition( $stmt->{where_clause} ); my $col = $termFactory->buildCondition( $stmt->{col_obj}->{$name}->{content} ); =head1 DESCRIPTION This package implements a factory to create type and operation based terms. Those terms are used to access data from the table(s) - either when evaluating the where clause or returning column data. The concept of a factory can be studied in I<Design Patterns> by the Gang of Four. The concept of using polymorphism instead of conditions is suggested by Martin Fowler in his book I<Refactoring>. =head1 METHODS =head2 buildCondition Builds a condition object from a given (part of a) where clause. This method calls itself recursively for I<predicates>. =head1 AUTHOR AND COPYRIGHT Copyright (c) 2001,2005 by Jeff Zucker: jzuckerATcpan.org Copyright (c) 2009-2016 by Jens Rehsack: rehsackATcpan.org All rights reserved. You may distribute this module under the terms of either the GNU General Public License or the Artistic License, as specified in the Perl README file. =cut 1;