From: Rafael Kitover Date: Sun, 15 Feb 2009 23:30:00 +0000 (+0000) Subject: Improved connected logic for Oracle storage X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=c2481821ea4d4e988a3586a126a103aa676bec47;p=dbsrgits%2FDBIx-Class-Historic.git Improved connected logic for Oracle storage --- diff --git a/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm b/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm index bbefa4d..87715ed 100644 --- a/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm +++ b/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm @@ -25,6 +25,7 @@ This class implements autoincrements for Oracle. =cut use Carp::Clan qw/^DBIx::Class/; +use Scalar::Util (); use base qw/DBIx::Class::Storage::DBI::MultiDistinctEmulation/; @@ -84,6 +85,30 @@ sub _sequence_fetch { return $id; } +sub connected { + my $self = shift; + + if ($self->SUPER::connected(@_)) { + my $dbh = $self->_dbh; + + my $ping_sth = $dbh->prepare_cached("select 1 from dual"); + + local $dbh->{RaiseError} = 1; + eval { + $ping_sth->execute; + $ping_sth->finish; + }; + + if ($@) { + return 0; + } else { + return 1; + } + } + + return 0; +} + sub _dbh_execute { my $self = shift; my ($dbh, $op, $extra_bind, $ident, $bind_attributes, @args) = @_; @@ -103,17 +128,8 @@ sub _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->throw_exception($exception) if $self->transaction_depth; - - $self->ensure_connected; - } elsif ($exception =~ /ORA-01003/) { # invalid cursor -# ORA-01003: no statement parsed (someone renamed a column or something, + if ($exception =~ /ORA-01003/) { +# ORA-01003: no statement parsed (someone changed the table somehow, # invalidating your cursor.) my ($sql, $bind) = $self->_prep_for_execute($op, $extra_bind, $ident, \@args); delete $dbh->{CachedKids}{$sql}; diff --git a/t/73oracle.t b/t/73oracle.t index 306ad50..ee00ed5 100644 --- a/t/73oracle.t +++ b/t/73oracle.t @@ -149,7 +149,7 @@ is($st->pkid1, 55, "Oracle Auto-PK without trigger: First primary key set manual # clean up our mess END { - if($dbh) { + if($dbh = $schema->storage->dbh) { $dbh->do("DROP SEQUENCE artist_seq"); $dbh->do("DROP SEQUENCE pkid1_seq"); $dbh->do("DROP SEQUENCE pkid2_seq");