X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FOracle%2FGeneric.pm;h=3c28b08270e762440116a6f8629c23a5b94cc8e5;hb=52b420dd006f55aced42c669f49182890b8826ea;hp=0b83e2662c05570044efdec472b22a4ea6a7a7e8;hpb=cc42fa9ac80f921b0f835fbd3bd9088e3d1d14c9;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm b/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm index 0b83e26..3c28b08 100644 --- a/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm +++ b/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm @@ -4,6 +4,7 @@ use strict; use warnings; use Scope::Guard (); use Context::Preserve (); +use Try::Tiny; =head1 NAME @@ -39,7 +40,7 @@ sub deployment_statements { $sqltargs->{quote_table_names} = $quote_char ? 1 : 0; $sqltargs->{quote_field_names} = $quote_char ? 1 : 0; - my $oracle_version = eval { $self->_get_dbh->get_info(18) }; + my $oracle_version = try { $self->_get_dbh->get_info(18) }; $sqltargs->{producer_args}{oracle_version} = $oracle_version; @@ -112,45 +113,35 @@ sub _ping { local $dbh->{RaiseError} = 1; local $dbh->{PrintError} = 0; - eval { + return try { $dbh->do('select 1 from dual'); + 1; + } catch { + 0; }; - - return $@ ? 0 : 1; } sub _dbh_execute { my $self = shift; my ($dbh, $op, $extra_bind, $ident, $bind_attributes, @args) = @_; - my $wantarray = wantarray; - - my (@res, $exception, $retried); - - RETRY: { - do { - eval { - if ($wantarray) { - @res = $self->next::method(@_); - } else { - $res[0] = $self->next::method(@_); - } - }; - $exception = $@; - if ($exception =~ /ORA-01003/) { + my $retried; + do { + try { + return $self->next::method($dbh, $op, $extra_bind, $ident, $bind_attributes, @args); + } + catch { + if (!$retried and $_ =~ /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}; - } else { - last RETRY; } - } while (not $retried++); - } - - $self->throw_exception($exception) if $exception; - - $wantarray ? @res : $res[0] + else { + $self->throw_exception($_); + } + }; + } while (not $retried++); } =head2 get_autoinc_seq