package # Hide from PAUSE
DBIx::Class::SQLMaker::Oracle;
-use warnings;
-use strict;
+use Module::Runtime ();
+use Moo;
+use namespace::clean;
-use base qw( DBIx::Class::SQLMaker );
+extends 'DBIx::Class::SQLMaker';
BEGIN {
use DBIx::Class::Optional::Dependencies;
unless DBIx::Class::Optional::Dependencies->req_ok_for ('id_shortener');
}
-sub new {
- my $self = shift;
- my %opts = (ref $_[0] eq 'HASH') ? %{$_[0]} : @_;
- push @{$opts{special_ops}}, {
- regex => qr/^prior$/i,
- handler => '_where_field_PRIOR',
- };
-
- $self->SUPER::new (\%opts);
+sub _build_converter_class {
+ Module::Runtime::use_module('DBIx::Class::SQLMaker::Converter::Oracle');
}
+around _build_renderer_roles => sub {
+ my ($orig, $self) = (shift, shift);
+ (
+ 'Data::Query::Renderer::SQL::Extension::ConnectBy',
+ 'Data::Query::Renderer::SQL::Dialect::ReturnInto',
+ $self->$orig(@_),
+ );
+};
+
sub _assemble_binds {
my $self = shift;
- return map { @{ (delete $self->{"${_}_bind"}) || [] } } (qw/select from where oracle_connect_by group having order/);
+ return map { @{ (delete $self->{"${_}_bind"}) || [] } } (qw/pre_select select from where oracle_connect_by group having order limit/);
}
my ($cb_sql, @cb_bind) = $self->_connect_by($rs_attrs);
push @{$self->{oracle_connect_by_bind}}, @cb_bind;
- my $sql = $self->SUPER::_parse_rs_attrs(@_);
+ my $sql = $self->next::method(@_);
return "$cb_sql $sql";
}
my ( @sql, @bind );
for my $c ( $self->_order_by_chunks($arg) ) {
- $self->_SWITCH_refkind(
- $c,
- {
- SCALAR => sub { push @sql, $c },
- ARRAYREF => sub { push @sql, shift @$c; push @bind, @$c },
- }
- );
+ if (ref $c) {
+ push @sql, shift @$c;
+ push @bind, @$c;
+ }
+ else {
+ push @sql, $c;
+ }
}
my $sql =
return $self->_shorten_identifier($self->next::method($fqcn));
}
-#
-# Oracle has a different INSERT...RETURNING syntax
-#
-
-sub _insert_returning {
- my ($self, $options) = @_;
-
- my $f = $options->{returning};
-
- my ($f_list, @f_names) = $self->_SWITCH_refkind($f, {
- ARRAYREF => sub {
- (join ', ', map { $self->_quote($_) } @$f),
- @$f
- },
- SCALAR => sub {
- $self->_quote($f),
- $f,
- },
- SCALARREF => sub {
- $$f,
- $$f,
- },
- });
-
- my $rc_ref = $options->{returning_container}
- or $self->throw_exception('No returning container supplied for IR values');
-
- @$rc_ref = (undef) x @f_names;
-
- return (
- ( join (' ',
- $self->_sqlcase(' returning'),
- $f_list,
- $self->_sqlcase('into'),
- join (', ', ('?') x @f_names ),
- )),
- map {
- $self->{bindtype} eq 'columns'
- ? [ $f_names[$_] => \$rc_ref->[$_] ]
- : \$rc_ref->[$_]
- } (0 .. $#f_names),
- );
-}
-
1;