From: Johannes Plunien Date: Tue, 6 Nov 2007 21:57:44 +0000 (+0000) Subject: fetch nextval from sequence for insert X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=2e46b6eb92524b5b39b37791c122a1e2c2ee90b9;p=dbsrgits%2FDBIx-Class-Historic.git fetch nextval from sequence for insert --- diff --git a/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm b/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm index 12f1dcb..808e20f 100644 --- a/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm +++ b/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm @@ -12,6 +12,7 @@ DBIx::Class::Storage::DBI::Oracle - Automatic primary key class for Oracle # In your table classes __PACKAGE__->load_components(qw/PK::Auto Core/); + __PACKAGE__->add_columns({ id => { sequence => 'mysequence', auto_nextval => 1 } }); __PACKAGE__->set_primary_key('id'); __PACKAGE__->sequence('mysequence'); @@ -30,11 +31,14 @@ use base qw/DBIx::Class::Storage::DBI::MultiDistinctEmulation/; # __PACKAGE__->load_components(qw/PK::Auto/); 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; + my ($self, $dbh, $source, @columns) = @_; + my @ids = (); + foreach my $col (@columns) { + my $seq = ($source->column_info($col)->{sequence} ||= $self->get_autoinc_seq($source,$col)); + my $id = $self->_sequence_fetch( 'currval', $seq ); + push @ids, $id; + } + return @ids; } sub _dbh_get_autoinc_seq { @@ -59,6 +63,32 @@ sub _dbh_get_autoinc_seq { $self->throw_exception("Unable to find a sequence INSERT trigger on table '" . $source->name . "'."); } +=head2 insert + +Fetch nextval from sequence and handle insert statement. + +=cut + +sub insert { + my ( $self, $source, $to_insert ) = @_; + foreach my $col ( $source->columns ) { + if ( !defined $to_insert->{$col} ) { + my $col_info = $source->column_info($col); + + if ( $col_info->{auto_nextval} ) { + $to_insert->{$col} = $self->_sequence_fetch( 'nextval', $col_info->{sequence} || $self->_dbh_get_autoinc_seq($self->dbh, $source) ); + } + } + } + $self->next::method( $source, $to_insert ); +} + +sub _sequence_fetch { + my ( $self, $type, $seq ) = @_; + my ($id) = $self->dbh->selectrow_array("SELECT ${seq}.${type} FROM DUAL"); + return $id; +} + =head2 get_autoinc_seq Returns the sequence name for an autoincrement column