sub _quote {
my ($self, $label) = @_;
return '' unless defined $label;
- return "*" if $label eq '*';
return $label unless $self->{quote_char};
- if(ref $self->{quote_char} eq "ARRAY"){
- return $self->{quote_char}->[0] . $label . $self->{quote_char}->[1]
- if !defined $self->{name_sep};
- my $sep = $self->{name_sep};
- return join($self->{name_sep},
- map { $self->{quote_char}->[0] . $_ . $self->{quote_char}->[1] }
- split(/\Q$sep\E/,$label));
- }
return $self->SUPER::_quote($label);
}
sub dbh {
my ($self) = @_;
- $self->_dbh(undef)
- if $self->_connection_pid && $self->_connection_pid != $$;
+ if($self->_connection_pid && $self->_connection_pid != $$) {
+ $self->_dbh->{InactiveDestroy} = 1;
+ $self->_dbh(undef)
+ }
$self->ensure_connected;
return $self->_dbh;
}
Calls begin_work on the current dbh.
+See L<DBIx::Class::Schema> for the txn_do() method, which allows for
+an entire code block to be executed transactionally.
+
=cut
sub txn_begin {
my $self = shift;
- $self->dbh->begin_work if $self->{transaction_depth}++ == 0 and $self->dbh->{AutoCommit};
+ $self->dbh->begin_work
+ if $self->{transaction_depth}++ == 0 and $self->dbh->{AutoCommit};
}
=head2 txn_commit
=head2 txn_rollback
-Issues a rollback against the current dbh.
+Issues a rollback against the current dbh. A nested rollback will
+throw a L<DBIx::Class::Storage::NESTED_ROLLBACK_EXCEPTION> exception,
+which allows the rollback to propagate to the outermost transaction.
=cut
my ($sql, @bind) = $self->sql_maker->$op($ident, @args);
unshift(@bind, @$extra_bind) if $extra_bind;
if ($self->debug) {
- my @debug_bind = map { defined $_ ? $_ : 'NULL' } @bind;
- $self->debugfh->print("$sql: @debug_bind\n");
+ my @debug_bind = map { defined $_ ? qq{`$_'} : q{`NULL'} } @bind;
+ $self->debugfh->print("$sql: " . join(', ', @debug_bind) . "\n");
}
my $sth = $self->sth($sql,$op);
$self->throw_exception("no sth generated via sql: $sql") unless $sth;