package DBIx::Class::Storage::DBI;
+use base 'DBIx::Class::Storage';
+
use strict;
use warnings;
use DBI;
return $ret;
}
+sub _order_directions {
+ my ($self, $order) = @_;
+ $order = $order->{order_by} if ref $order eq 'HASH';
+ return $self->SUPER::_order_directions($order);
+}
+
sub _table {
my ($self, $from) = @_;
if (ref $from eq 'ARRAY') {
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);
}
return $self->{limit_dialect};
}
+sub quote_char {
+ my $self = shift;
+ $self->{quote_char} = shift if @_;
+ return $self->{quote_char};
+}
+
+sub name_sep {
+ my $self = shift;
+ $self->{name_sep} = shift if @_;
+ return $self->{name_sep};
+}
+
+
+
+
package DBIx::Class::Storage::DBI::DebugCallback;
sub print {
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;
}
sub txn_rollback {
my $self = shift;
- if ($self->{transaction_depth} == 0) {
- $self->dbh->rollback unless $self->dbh->{AutoCommit};
- }
- else {
- --$self->{transaction_depth} == 0 ? $self->dbh->rollback : die $@;
+
+ eval {
+ if ($self->{transaction_depth} == 0) {
+ $self->dbh->rollback unless $self->dbh->{AutoCommit};
+ }
+ else {
+ --$self->{transaction_depth} == 0 ?
+ $self->dbh->rollback :
+ die DBIx::Class::Storage::NESTED_ROLLBACK_EXCEPTION->new;
+ }
+ };
+
+ if ($@) {
+ my $error = $@;
+ my $exception_class = "DBIx::Class::Storage::NESTED_ROLLBACK_EXCEPTION";
+ $error =~ /$exception_class/ and $self->throw_exception($error);
+ $self->{transaction_depth} = 0; # ensure that a failed rollback
+ $self->throw_exception($error); # resets the transaction depth
}
}