X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FOracle.pm;h=b0184e8fccb96a3601dd254982ff50cfff82aaa9;hb=0c11ad0ee5c8407f6b87d6e15c62a1b445076dc0;hp=8549b4148db126adfb8978133375b3eade3302c1;hpb=aaba95249e9b4a986ff3f5820e6c95e2ecae68f9;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/Oracle.pm b/lib/DBIx/Class/Storage/DBI/Oracle.pm index 8549b41..b0184e8 100644 --- a/lib/DBIx/Class/Storage/DBI/Oracle.pm +++ b/lib/DBIx/Class/Storage/DBI/Oracle.pm @@ -3,81 +3,46 @@ package DBIx::Class::Storage::DBI::Oracle; use strict; use warnings; -use Carp::Clan qw/^DBIx::Class/; +use base qw/DBIx::Class::Storage::DBI/; +use mro 'c3'; +use Try::Tiny; +use namespace::clean; -use base qw/DBIx::Class::Storage::DBI::MultiDistinctEmulation/; +sub _rebless { + my ($self) = @_; -# __PACKAGE__->load_components(qw/PK::Auto/); + # Default driver + my $class = $self->_server_info->{normalized_dbms_version} < 9 + ? 'DBIx::Class::Storage::DBI::Oracle::WhereJoins' + : 'DBIx::Class::Storage::DBI::Oracle::Generic'; -sub _ora_last_insert_id { - my ($dbh, $sql) = @_; - $dbh->selectrow_array($sql); -} -sub last_insert_id { - my ($self,$source,$col) = @_; - my $seq = ($source->column_info($col)->{sequence} ||= $self->get_autoinc_seq($source,$col)); - my $sql = 'SELECT ' . $seq . '.currval FROM DUAL'; - my ($id) = $self->dbh_do(\&_ora_last_insert_id($sql)); - return $id; -} - -sub _ora_get_autoinc_seq { - my ($dbh, $source, $sql) = @_; - - # 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) { - return uc($1) if $insert_trigger =~ m!(\w+)\.nextval!i; # col name goes here??? - } - croak "Unable to find a sequence INSERT trigger on table '" . $source->name . "'."; -} - -sub get_autoinc_seq { - my ($self,$source,$col) = @_; - - # look up the correct sequence automatically - my $sql = q{ - SELECT trigger_body FROM ALL_TRIGGERS t - WHERE t.table_name = ? - AND t.triggering_event = 'INSERT' - AND t.status = 'ENABLED' - }; - - $self->dbh_do(\&_ora_get_autoinc_seq, $source, $sql); + $self->ensure_class_loaded ($class); + bless $self, $class; } -sub columns_info_for { - my ($self, $table) = @_; - - $self->next::method($self, uc($table)); -} - - 1; =head1 NAME -DBIx::Class::Storage::DBI::Oracle - Automatic primary key class for Oracle +DBIx::Class::Storage::DBI::Oracle - Base class for Oracle driver -=head1 SYNOPSIS +=head1 DESCRIPTION - # In your table classes - __PACKAGE__->load_components(qw/PK::Auto Core/); - __PACKAGE__->set_primary_key('id'); - __PACKAGE__->sequence('mysequence'); +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. -=head1 DESCRIPTION +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 -This class implements autoincrements for Oracle. + __PACKAGE__->storage_type('::DBI::Oracle::WhereJoins'); -=head1 AUTHORS +to your Schema class. -Andy Grundman +=head1 AUTHOR AND CONTRIBUTORS -Scott Connelly +See L and L in DBIx::Class =head1 LICENSE