use DBIx::Class::Storage::Statistics;
use Scalar::Util();
use List::Util();
+use Data::Dumper::Concise();
# what version of sqlt do we require if deploy() without a ddl_dir is invoked
# when changing also adjust the corresponding author_require in Makefile.PL
my ($self) = @_;
if ((not $self->_driver_determined) && (not $self->{_in_determine_driver})) {
- my $started_unconnected = 0;
+ my $started_connected = 0;
local $self->{_in_determine_driver} = 1;
if (ref($self) eq __PACKAGE__) {
my $driver;
if ($self->_dbh) { # we are connected
$driver = $self->_dbh->{Driver}{Name};
+ $started_connected = 1;
} else {
# if connect_info is a CODEREF, we have no choice but to connect
if (ref $self->_dbi_connect_info->[0] &&
# try to use dsn to not require being connected, the driver may still
# force a connection in _rebless to determine version
($driver) = $self->_dbi_connect_info->[0] =~ /dbi:([^:]+):/i;
- $started_unconnected = 1;
}
}
$self->_init; # run driver-specific initializations
$self->_run_connection_actions
- if $started_unconnected && defined $self->_dbh;
+ if !$started_connected && defined $self->_dbh;
}
}
}
sub _execute_array {
- my ($self, $source, $sth, $bind, $cols, $data, $after_exec_cb) = @_;
+ my ($self, $source, $sth, $bind, $cols, $data, @extra) = @_;
+
+ my $guard = $self->txn_scope_guard unless $self->{transaction_depth} != 0;
## This must be an arrayref, else nothing works!
my $tuple_status = [];
$placeholder_index++;
}
- my $rv;
- eval {
- $rv = $sth->execute_array({ArrayTupleStatus => $tuple_status});
- $after_exec_cb->() if $after_exec_cb;
+ my $rv = eval {
+ $self->_dbh_execute_array($sth, $tuple_status, @extra);
};
my $err = $@ || $sth->errstr;
$self->throw_exception(sprintf "%s for populate slice:\n%s",
($tuple_status->[$i][1] || $err),
- $self->_pretty_print ({
+ Data::Dumper::Concise::Dumper({
map { $cols->[$_] => $data->[$i][$_] } (0 .. $#$cols)
}),
);
}
+ $guard->commit if $guard;
+
return $rv;
}
+sub _dbh_execute_array {
+ my ($self, $sth, $tuple_status, @extra) = @_;
+
+ return $sth->execute_array({ArrayTupleStatus => $tuple_status});
+}
+
sub _execute_array_empty {
my ($self, $sth, $count) = @_;
+
+ my $guard = $self->txn_scope_guard unless $self->{transaction_depth} != 0;
+
eval {
my $dbh = $self->_get_dbh;
local $dbh->{RaiseError} = 1;
local $dbh->{PrintError} = 0;
-# In case of a multi-statement with a select, some DBDs (namely Sybase) require
-# the statement to be exhausted.
- my $fetch = 0;
- if ($self->_exhaust_statements && $sth->{Statement} =~ /(?:\n|;)select/i) {
- $fetch = 1;
- }
-
- foreach (1..$count) {
- $sth->execute;
- $sth->fetchall_arrayref if $fetch;
- }
+ $sth->execute foreach 1..$count;
};
my $exception = $@;
$self->throw_exception($exception) if $exception;
+ $guard->commit if $guard;
+
return $count;
}
-# Whether we prefer to exhaust cursors with results, or they can be
-# reused/finished without fetching anything. To be overridden to '1' in storages
-# that need it.
-sub _exhaust_statements { 0 }
-
sub update {
my ($self, $source, @args) = @_;