=head1 NAME
-DBIx::Class::Storage::DBI::Oracle - Automatic primary key class for Oracle
+DBIx::Class::Storage::DBI::Oracle::Generic - Automatic primary key class for Oracle
=head1 SYNOPSIS
$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);
+sub _sequence_fetch {
+ my ( $self, $type, $seq ) = @_;
+ my ($id) = $self->dbh->selectrow_array("SELECT ${seq}.${type} FROM DUAL");
+ return $id;
+}
- if ( $col_info->{auto_nextval} ) {
- $to_insert->{$col} = $self->_sequence_fetch( 'nextval', $col_info->{sequence} || $self->_dbh_get_autoinc_seq($self->dbh, $source) );
+sub _dbh_execute {
+ my $self = shift;
+ my ($dbh, $op, $extra_bind, $ident, $bind_attributes, @args) = @_;
+
+ my $wantarray = wantarray;
+ my @res;
+ my $exception;
+
+ my $try = 2;
+
+ while ($try--) {
+ eval {
+ if ($wantarray) {
+ @res = $self->SUPER::_dbh_execute(@_);
+ } else {
+ $res[0] = $self->SUPER::_dbh_execute(@_);
}
+ };
+ $exception = $@;
+ if ($exception =~ /ORA-(?:00028|01012)/) {
+# ORA-00028: your session has been killed
+# ORA-01012: not logged on
+ $self->disconnect;
+
+ $self->throw_exception($exception) if $self->{_in_dbh_do};
+
+ $self->ensure_connected;
+ } elsif ($exception =~ /ORA-01003/) { # invalid cursor
+# ORA-01003: no statement parsed (someone renamed a column or something,
+# invalidating your cursor.)
+ my ($sql, $bind) = $self->_prep_for_execute($op, $extra_bind, $ident, \@args);
+ delete $dbh->{CachedKids}{$sql};
+ } else {
+ last;
}
}
- $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;
+ $self->throw_exception($exception) if $exception;
+
+ wantarray ? @res : $res[0]
}
=head2 get_autoinc_seq
sub get_autoinc_seq {
my ($self, $source, $col) = @_;
- $self->dbh_do($self->can('_dbh_get_autoinc_seq'), $source, $col);
+ $self->dbh_do('_dbh_get_autoinc_seq', $source, $col);
}
=head2 columns_info_for
sub datetime_parser_type { return "DateTime::Format::Oracle"; }
+sub _svp_begin {
+ my ($self, $name) = @_;
+
+ $self->dbh->do("SAVEPOINT $name");
+}
+
+# Oracle automatically releases a savepoint when you start another one with the
+# same name.
+sub _svp_release { 1 }
+
+sub _svp_rollback {
+ my ($self, $name) = @_;
+
+ $self->dbh->do("ROLLBACK TO SAVEPOINT $name")
+}
+
=head1 AUTHORS
Andy Grundman <andy@hybridized.org>