From: Rafael Kitover Date: Fri, 13 Feb 2009 10:40:55 +0000 (+0000) Subject: Some fixes for Oracle edge cases X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=d789fa991e73a6b51899ba4dc04401b86f45d3be;p=dbsrgits%2FDBIx-Class-Historic.git Some fixes for Oracle edge cases --- diff --git a/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm b/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm index 3861cdd..9f564e3 100644 --- a/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm +++ b/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm @@ -69,6 +69,48 @@ sub _sequence_fetch { return $id; } +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->throw_exception($exception) if $exception; + + wantarray ? @res : $res[0] +} + =head2 get_autoinc_seq Returns the sequence name for an autoincrement column