use strict;
use base qw( DBIx::Class::SQLMaker );
-use Carp::Clan qw/^DBIx::Class|^SQL::Abstract/;
+
+BEGIN {
+ use DBIx::Class::Optional::Dependencies;
+ die('The following extra modules are required for Oracle-based Storages ' . DBIx::Class::Optional::Dependencies->req_missing_for ('id_shortener') . "\n" )
+ unless DBIx::Class::Optional::Dependencies->req_ok_for ('id_shortener');
+}
sub new {
my $self = shift;
sub _assemble_binds {
my $self = shift;
- return map { @{ (delete $self->{"${_}_bind"}) || [] } } (qw/from where oracle_connect_by having order/);
+ return map { @{ (delete $self->{"${_}_bind"}) || [] } } (qw/select from where oracle_connect_by group having order/);
}
return ($sql, @bind);
}
+# use this codepath to hook all identifiers and mangle them if necessary
+# this is invoked regardless of quoting being on or off
+sub _quote {
+ my ($self, $label) = @_;
+
+ return '' unless defined $label;
+ return ${$label} if ref($label) eq 'SCALAR';
+
+ $label =~ s/ ( [^\.]{31,} ) /$self->_shorten_identifier($1)/gxe;
+
+ $self->next::method($label);
+}
+
# this takes an identifier and shortens it if necessary
# optionally keywords can be passed as an arrayref to generate useful
# identifiers
return $to_shorten
if length($to_shorten) <= $max_len;
- croak 'keywords needs to be an arrayref'
+ $self->throw_exception("'keywords' needs to be an arrayref")
if defined $keywords && ref $keywords ne 'ARRAY';
# if no keywords are passed use the identifier as one
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;