X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FOracle%2FGeneric.pm;h=3d463ba0bb819bcde04a85ee80ba21b7f48ec570;hb=ab4f4e4cdbe2eee3b6230d03f152942e96fb24f9;hp=0a7294d06febad0512b3f8684becbbedb461058a;hpb=2265a41b568ce018b0e38681ee9b161f1522347b;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm b/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm index 0a7294d..3d463ba 100644 --- a/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm +++ b/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm @@ -7,6 +7,8 @@ use Context::Preserve 'preserve_context'; use Try::Tiny; use namespace::clean; +__PACKAGE__->sql_limit_dialect ('RowNum'); + =head1 NAME DBIx::Class::Storage::DBI::Oracle::Generic - Oracle Support for DBIx::Class @@ -77,7 +79,7 @@ versions before 9. use base qw/DBIx::Class::Storage::DBI/; use mro 'c3'; -__PACKAGE__->sql_maker_class('DBIx::Class::SQLAHacks::Oracle'); +__PACKAGE__->sql_maker_class('DBIx::Class::SQLMaker::Oracle'); sub deployment_statements { my $self = shift;; @@ -88,9 +90,13 @@ sub deployment_statements { $sqltargs->{quote_table_names} = $quote_char ? 1 : 0; $sqltargs->{quote_field_names} = $quote_char ? 1 : 0; - my $oracle_version = try { $self->_get_dbh->get_info(18) }; - - $sqltargs->{producer_args}{oracle_version} = $oracle_version; + if ( + ! exists $sqltargs->{producer_args}{oracle_version} + and + my $dver = $self->_server_info->{dbms_version} + ) { + $sqltargs->{producer_args}{oracle_version} = $dver; + } $self->next::method($schema, $type, $version, $dir, $sqltargs, @rest); } @@ -130,7 +136,7 @@ sub _dbh_get_autoinc_seq { my ( $schema, $table ) = $source_name =~ /(\w+)\.(\w+)/; my ($sql, @bind) = $sql_maker->select ( 'ALL_TRIGGERS', - ['trigger_body'], + ['trigger_body', 'table_owner'], { $schema ? (owner => $schema) : (), table_name => $table || $source_name, @@ -141,10 +147,18 @@ sub _dbh_get_autoinc_seq { my $sth = $dbh->prepare($sql); $sth->execute (@bind); - while (my ($insert_trigger) = $sth->fetchrow_array) { - return $1 if $insert_trigger =~ m!("?\w+"?)\.nextval!i; # col name goes here??? + while (my ($insert_trigger, $schema) = $sth->fetchrow_array) { + my ($seq_name) = $insert_trigger =~ m/("?[.\w"]+"?)\.nextval .+ into \s+ :new\.$col/xmsi; + + next unless $seq_name; + + if ($seq_name !~ /\./) { + $seq_name = join '.' => $schema, $seq_name; + } + + return $seq_name; } - $self->throw_exception("Unable to find a sequence INSERT trigger on table '$source_name'."); + $self->throw_exception("Unable to find a sequence %INSERT% trigger on table '$source_name'."); } sub _sequence_fetch { @@ -362,25 +376,7 @@ sub relname_to_table_alias { my $alias = $self->next::method(@_); - return $alias if length($alias) <= 30; - - # get a base64 md5 of the alias with join_count - require Digest::MD5; - my $ctx = Digest::MD5->new; - $ctx->add($alias); - my $md5 = $ctx->b64digest; - - # remove alignment mark just in case - $md5 =~ s/=*\z//; - - # truncate and prepend to truncated relname without vowels - (my $devoweled = $relname) =~ s/[aeiou]//g; - my $shortened = substr($devoweled, 0, 18); - - my $new_alias = - $shortened . '_' . substr($md5, 0, 30 - length($shortened) - 1); - - return $new_alias; + return $self->sql_maker->_shorten_identifier($alias, [$relname]); } =head2 with_deferred_fk_checks