X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FOracle.pm;h=64bf9f182b67735b1bb62f07d6ac0bd0856c455c;hb=9c0df5f32b68e23c670c89ce6cdbff60b4bd0ed0;hp=53d657a8e22a7b30962589d2191df4d420eae8a6;hpb=75d079145a507a0e5ff89b2676d383f4fd1a5511;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/Oracle.pm b/lib/DBIx/Class/Storage/DBI/Oracle.pm index 53d657a..64bf9f1 100644 --- a/lib/DBIx/Class/Storage/DBI/Oracle.pm +++ b/lib/DBIx/Class/Storage/DBI/Oracle.pm @@ -3,63 +3,70 @@ package DBIx::Class::Storage::DBI::Oracle; use strict; use warnings; -use Carp qw/croak/; - use base qw/DBIx::Class::Storage::DBI/; -# __PACKAGE__->load_components(qw/PK::Auto/); +sub _rebless { + my ($self) = @_; + + my $version = eval { $self->_dbh->get_info(18); }; + + if ( !$@ ) { + my ($major, $minor, $patchlevel) = split(/\./, $version); + + # Default driver + my $class = $major <= 8 + ? 'DBIx::Class::Storage::DBI::Oracle::WhereJoins' + : 'DBIx::Class::Storage::DBI::Oracle::Generic'; -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->selectrow_array($sql); - return $id; + # Load and rebless + eval "require $class"; + + bless $self, $class unless $@; + } } -sub get_autoinc_seq { - my ($self,$source,$col) = @_; - - # look up the correct sequence automatically - my $dbh = $self->_dbh; - my $sql = q{ - 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) { - 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 _svp_begin { + my ($self, $name) = @_; + + $self->dbh->do("SAVEPOINT $name"); +} + +# Would've implemented _svp_release here, but Oracle doesn't support it. + +sub _svp_rollback { + my ($self, $name) = @_; + + $self->dbh->do("ROLLBACK TO SAVEPOINT $name") } 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 # In your table classes - __PACKAGE__->load_components(qw/PK::Auto Core/); - __PACKAGE__->set_primary_key('id'); - __PACKAGE__->sequence('mysequence'); + __PACKAGE__->load_components(qw/Core/); =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. -=head1 AUTHORS +For Oracle major versions <= 8 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 -Andy Grundman + __PACKAGE__->storage_type('::DBI::Oracle::WhereJoins'); + +to your Schema class. + +=head1 AUTHORS -Scott Connelly +David Jack Olrik C<< >> =head1 LICENSE