X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FOracle%2FGeneric.pm;h=9f564e3638b5c3c8adc3b4c786b8c562157bc3f6;hb=d789fa991e73a6b51899ba4dc04401b86f45d3be;hp=07abe5793e663e644c03cc37282617a8fdee2525;hpb=373940e16de14913107bcd5cbb6e6a286a6b795e;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm b/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm index 07abe57..9f564e3 100644 --- a/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm +++ b/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm @@ -6,7 +6,7 @@ use warnings; =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 @@ -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 @@ -103,6 +145,22 @@ L. 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