use Scope::Guard ();
use Context::Preserve ();
use Try::Tiny;
+use namespace::clean;
=head1 NAME
my $self = shift;
my ($dbh, $op, $extra_bind, $ident, $bind_attributes, @args) = @_;
- my $retried;
+ my (@res, $tried);
+ my $wantarray = wantarray();
+ my $next = $self->next::can;
do {
try {
- return $self->next::method($dbh, $op, $extra_bind, $ident, $bind_attributes, @args);
+ my $exec = sub { $self->$next($dbh, $op, $extra_bind, $ident, $bind_attributes, @args) };
+
+ if (!defined $wantarray) {
+ $exec->();
+ }
+ elsif (! $wantarray) {
+ $res[0] = $exec->();
+ }
+ else {
+ @res = $exec->();
+ }
+
+ $tried++;
}
catch {
- if (!$retried and $_ =~ /ORA-01003/) {
+ if (! $tried 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);
$self->throw_exception($_);
}
};
- } while (not $retried++);
+ } while (! $tried++);
+
+ return $wantarray ? @res : $res[0];
}
=head2 get_autoinc_seq
$self->dbh_do('_dbh_get_autoinc_seq', $source, $col);
}
-=head2 columns_info_for
-
-This wraps the superclass version of this method to force table
-names to uppercase
-
-=cut
-
-sub columns_info_for {
- my ($self, $table) = @_;
-
- $self->next::method($table);
-}
-
=head2 datetime_parser_type
This sets the proper DateTime::Format module for use with
my $txn_scope_guard = $self->txn_scope_guard;
$self->_do_query('alter session set constraints = deferred');
-
+
my $sg = Scope::Guard->new(sub {
$self->_do_query('alter session set constraints = immediate');
});