X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FOracle.pm;h=6dd8b724ea2d9cfdb7006c74358b435674ee683f;hb=b8e92dac9f2f65895700dbd0d0606f75b900a8e0;hp=73859c52847da4ac777791d83ed77974216262f2;hpb=34470972fbb715106e4990bab61871498dae979f;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/Oracle.pm b/lib/DBIx/Class/Storage/DBI/Oracle.pm index 73859c5..6dd8b72 100644 --- a/lib/DBIx/Class/Storage/DBI/Oracle.pm +++ b/lib/DBIx/Class/Storage/DBI/Oracle.pm @@ -3,76 +3,50 @@ package DBIx::Class::Storage::DBI::Oracle; use strict; use warnings; -use Carp qw/croak/; - use base qw/DBIx::Class::Storage::DBI/; +use mro 'c3'; +use Try::Tiny; +use namespace::clean; -# __PACKAGE__->load_components(qw/PK::Auto/); +sub _rebless { + my ($self) = @_; -sub last_insert_id { - my ($self, $source) = shift; - $self->get_autoinc_seq($source) unless $source->{_autoinc_seq}; - my $sql = "SELECT " . $source->{_autoinc_seq} . ".currval FROM DUAL"; - my ($id) = $self->_dbh->selectrow_array($sql); - return $id; -} + # Default driver + my $class = $self->_server_info->{normalized_dbms_version} < 9 + ? 'DBIx::Class::Storage::DBI::Oracle::WhereJoins' + : 'DBIx::Class::Storage::DBI::Oracle::Generic'; -sub get_autoinc_seq { - my ($self, $source) = @_; - - # return the user-defined sequence if known - my $result_class = $source->result_class; - if ($result_class->can('sequence') and $result_class->sequence) { - return ($source->{_autoinc_seq} = $result_class->sequence); - } - - # look up the correct sequence automatically - my $dbh = $self->_dbh; - my $sql = qq{ - SELECT trigger_body FROM ALL_TRIGGERS t - WHERE t.table_name = ? - AND t.triggering_event = 'INSERT' - AND t.status = 'ENABLED' - }; - # trigger_body is a LONG - $dbh->{LongReadLen} = 64 * 1024 if ($dbh->{LongReadLen} < 64 * 1024); - my $sth = $dbh->prepare($sql); - $sth->execute( uc($source->name) ); - while (my ($insert_trigger) = $sth->fetchrow_array) { - if ($insert_trigger =~ m!(\w+)\.nextval!i ) { - $source->{_autoinc_seq} = uc($1); - } - } - unless ($source->{_autoinc_seq}) { - croak "Unable to find a sequence INSERT trigger on table '" . $self->_table_name . "'."; - } + $self->ensure_class_loaded ($class); + bless $self, $class; } 1; -=head1 NAME - -DBIx::Class::Storage::DBI::Oracle - Automatic primary key class for Oracle +=head1 NAME -=head1 SYNOPSIS - - # In your table classes - __PACKAGE__->load_components(qw/PK::Auto Core/); - __PACKAGE__->set_primary_key('id'); - __PACKAGE__->sequence('mysequence'); +DBIx::Class::Storage::DBI::Oracle - Base class for Oracle driver =head1 DESCRIPTION -This class implements autoincrements for Oracle. +This class simply provides a mechanism for discovering and loading a sub-class +for a specific version Oracle backend. It should be transparent to the user. + +For Oracle major versions < 9 it loads the ::Oracle::WhereJoins subclass, +which unrolls the ANSI join style DBIC normally generates into entries in +the WHERE clause for compatibility purposes. To force usage of this version +no matter the database version, add -=head1 AUTHORS + __PACKAGE__->storage_type('::DBI::Oracle::WhereJoins'); -Andy Grundman +to your Schema class. -Scott Connelly +=head1 FURTHER QUESTIONS? -=head1 LICENSE +Check the list of L. -You may distribute this code under the same terms as Perl itself. +=head1 COPYRIGHT AND LICENSE -=cut +This module is free software L +by the L. You can +redistribute it and/or modify it under the same terms as the +L.