X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FOracle.pm;h=77cedf303e0a14d6b789f66cf8662017fc1ec563;hb=dbaee7482fe6ff190e8ae53d609d0294b911339b;hp=73859c52847da4ac777791d83ed77974216262f2;hpb=34470972fbb715106e4990bab61871498dae979f;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/lib/DBIx/Class/Storage/DBI/Oracle.pm b/lib/DBIx/Class/Storage/DBI/Oracle.pm index 73859c5..77cedf3 100644 --- a/lib/DBIx/Class/Storage/DBI/Oracle.pm +++ b/lib/DBIx/Class/Storage/DBI/Oracle.pm @@ -3,54 +3,58 @@ package DBIx::Class::Storage::DBI::Oracle; use strict; use warnings; -use Carp qw/croak/; +use Carp::Clan qw/^DBIx::Class/; -use base qw/DBIx::Class::Storage::DBI/; +use base qw/DBIx::Class::Storage::DBI::MultiDistinctEmulation/; # __PACKAGE__->load_components(qw/PK::Auto/); -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; +sub _dbh_last_insert_id { + my ($self, $dbh, $source, $col) = @_; + my $seq = ($source->column_info($col)->{sequence} ||= $self->get_autoinc_seq($source,$col)); + my $sql = 'SELECT ' . $seq . '.currval FROM DUAL'; + my ($id) = $dbh->selectrow_array($sql); + return $id; } -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); - } - +sub _dbh_get_autoinc_seq { + my ($self, $dbh, $source, $col) = @_; + # look up the correct sequence automatically - my $dbh = $self->_dbh; - my $sql = qq{ + 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) { - 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 . "'."; + 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) = @_; + + $self->dbh_do($self->can('_dbh_get_autoinc_seq'), $source, $col); +} + +sub columns_info_for { + my ($self, $table) = @_; + + $self->next::method(uc($table)); +} + + 1; -=head1 NAME +=head1 NAME DBIx::Class::Storage::DBI::Oracle - Automatic primary key class for Oracle