X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI.pm;h=f676ec13cebe335bfe697de78fe7a2f004bd1768;hb=57c18b65cf1c7d708efd3717f54fbbc3def07794;hp=336ab1f346a4aae0064b908c31fbaf318c5c6717;hpb=ab872312383fbf46483519a49c81fe877145c1bf;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI.pm b/lib/DBIx/Class/Storage/DBI.pm index 336ab1f..f676ec1 100644 --- a/lib/DBIx/Class/Storage/DBI.pm +++ b/lib/DBIx/Class/Storage/DBI.pm @@ -14,7 +14,7 @@ use Scalar::Util qw/blessed weaken/; __PACKAGE__->mk_group_accessors('simple' => qw/_connect_info _dbi_connect_info _dbh _sql_maker _sql_maker_opts _conn_pid _conn_tid disable_sth_caching cursor on_connect_do - transaction_depth unsafe/ + transaction_depth unsafe _dbh_autocommit/ ); BEGIN { @@ -585,6 +585,8 @@ sub txn_do { ref $coderef eq 'CODE' or $self->throw_exception ('$coderef must be a CODE reference'); + return $coderef->(@_) if $self->{transaction_depth}; + local $self->{_in_dbh_do} = 1; my @result; @@ -645,7 +647,7 @@ sub disconnect { my ($self) = @_; if( $self->connected ) { - $self->_dbh->rollback unless $self->_dbh->{AutoCommit}; + $self->_dbh->rollback unless $self->_dbh_autocommit; $self->_dbh->disconnect; $self->_dbh(undef); $self->{_dbh_gen}++; @@ -726,7 +728,7 @@ sub _populate_dbh { # Always set the transaction depth on connect, since # there is no transaction in progress by definition - $self->{transaction_depth} = $self->_dbh->{AutoCommit} ? 0 : 1; + $self->{transaction_depth} = $self->_dbh_autocommit ? 0 : 1; if(ref $self eq 'DBIx::Class::Storage::DBI') { my $driver = $self->_dbh->{Driver}->{Name}; @@ -785,6 +787,8 @@ sub _connect { $self->throw_exception("DBI Connection failed: " . ($@||$DBI::errstr)) if !$dbh || $@; + $self->_dbh_autocommit($dbh->{AutoCommit}); + $dbh; } @@ -792,7 +796,7 @@ sub _connect { sub txn_begin { my $self = shift; $self->ensure_connected(); - if($self->{transaction_depth}++ == 0) { + if($self->{transaction_depth} == 0) { $self->debugobj->txn_begin() if $self->debug; # this isn't ->_dbh-> because @@ -800,6 +804,7 @@ sub txn_begin { # for AutoCommit users $self->dbh->begin_work; } + $self->{transaction_depth}++; } sub txn_commit { @@ -810,7 +815,7 @@ sub txn_commit { if ($self->debug); $dbh->commit; $self->{transaction_depth} = 0 - if $dbh->{AutoCommit}; + if $self->_dbh_autocommit; } elsif($self->{transaction_depth} > 1) { $self->{transaction_depth}-- @@ -820,15 +825,13 @@ sub txn_commit { sub txn_rollback { my $self = shift; my $dbh = $self->_dbh; - my $autocommit; eval { - $autocommit = $dbh->{AutoCommit}; if ($self->{transaction_depth} == 1) { $self->debugobj->txn_rollback() if ($self->debug); - $dbh->rollback; $self->{transaction_depth} = 0 - if $autocommit; + if $self->_dbh_autocommit; + $dbh->rollback; } elsif($self->{transaction_depth} > 1) { $self->{transaction_depth}--; @@ -842,7 +845,7 @@ sub txn_rollback { my $exception_class = "DBIx::Class::Storage::NESTED_ROLLBACK_EXCEPTION"; $error =~ /$exception_class/ and $self->throw_exception($error); # ensure that a failed rollback resets the transaction depth - $self->{transaction_depth} = $autocommit ? 0 : 1; + $self->{transaction_depth} = $self->_dbh_autocommit ? 0 : 1; $self->throw_exception($error); } }