X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSQLAHacks%2FOracle.pm;h=a4a815ed51faf9654a48fe0d32c6ceb45781b85b;hb=2df1857d287a0481224caef360f29b9eeb1421ae;hp=fd0f20edfe2777a48241d26680de4ec5fc9494f3;hpb=43426175a56c02bf2ab64a902df2b317ca585fa3;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/SQLAHacks/Oracle.pm b/lib/DBIx/Class/SQLAHacks/Oracle.pm index fd0f20e..a4a815e 100644 --- a/lib/DBIx/Class/SQLAHacks/Oracle.pm +++ b/lib/DBIx/Class/SQLAHacks/Oracle.pm @@ -6,28 +6,12 @@ use Carp::Clan qw/^DBIx::Class|^SQL::Abstract/; # # TODO: -# - Problems with such statements: parentid != PRIOR artistid # - Check the parameter syntax of connect_by -# - Review review by experienced DBIC/SQL:A developers :-) +# - Review by experienced DBIC/SQL:A developers :-) +# - Check NOCYCLE parameter +# http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/pseudocolumns001.htm#i1009434 # -sub new { - my $self = shift->SUPER::new(@_); - - push @{ $self->{unary_ops} },{ - regex => qr/^prior$/, - handler => '_prior_as_unary_op', - }; - - push @{ $self->{special_ops} },{ - regex => qr/^prior$/, - handler => '_prior_as_special_op', - }; - - return $self; -} - - sub select { my ($self, $table, $fields, $where, $order, @rest) = @_; @@ -94,85 +78,6 @@ sub _order_siblings_by { return $val ? $self->_sqlcase(' order siblings by')." $val" : ''; } -sub _prior_as_special_op { - my ( $self, $field, $op, $arg ) = @_; - - my ( $label, $and, $placeholder ); - $label = $self->_convert( $self->_quote($field) ); - $and = ' ' . $self->_sqlcase('and') . ' '; - $placeholder = $self->_convert('?'); - - # TODO: $op is prior, and not the operator - $op = $self->_sqlcase('='); - - my ( $sql, @bind ) = $self->_SWITCH_refkind( - $arg, - { - SCALARREF => sub { - my $sql = sprintf( "%s %s PRIOR %s", $label, $op, $$arg ); - return $sql; - }, - SCALAR => sub { - my $sql = sprintf( "%s %s PRIOR %s", $label, $op, $placeholder ); - return ( $sql, $arg ); - }, - HASHREF => sub { # case { '-prior' => { '=<' => 'nwiger'} } - # no _convert and _quote from SCALARREF - my ( $sql, @bind ) = $self->_where_hashpair_HASHREF( $field, $arg, $op ); - $sql = sprintf( " PRIOR %s", $sql ); - return ( $sql, @bind ); - }, - FALLBACK => sub { - # TODO - $self->puke(" wrong way... :/"); - }, - } - ); - return ( $sql, @bind ); -} - -sub _prior_as_unary_op { - my ( $self, $op, $arg ) = @_; - - my $placeholder = $self->_convert('?'); - my $and = ' ' . $self->_sqlcase('and') . ' '; - - my ( $sql, @bind ) = $self->_SWITCH_refkind( - $arg, - { - ARRAYREF => sub { - $self->puke("special op 'prior' accepts an arrayref with exactly two values") - if @$arg != 2; - - my ( @all_sql, @all_bind ); - - foreach my $val ( @{$arg} ) { - my ( $sql, @bind ) = $self->_SWITCH_refkind($val, - { - SCALAR => sub { - return ( $placeholder, ($val) ); - }, - SCALARREF => sub { - return ( $$val, () ); - }, - } - ); - push @all_sql, $sql; - push @all_bind, @bind; - } - my $sql = sprintf("PRIOR %s ",join $self->_sqlcase('='), @all_sql); - return ($sql,@all_bind); - }, - FALLBACK => sub { - - # TODO - $self->puke(" wrong way... :/ "); - }, - } - ); - return ( $sql, @bind ); -}; - 1; __END__