return $self->{limit_dialect};
}
+package DBIx::Class::Storage::DBI::DebugCallback;
+
+sub print {
+ my ($self, $string) = @_;
+ $string =~ m/^(\w+)/;
+ ${$self}->($1, $string);
+}
+
} # End of BEGIN block
use base qw/DBIx::Class/;
-__PACKAGE__->load_components(qw/Exception AccessorGroup/);
+__PACKAGE__->load_components(qw/AccessorGroup/);
__PACKAGE__->mk_group_accessors('simple' =>
qw/connect_info _dbh _sql_maker debug debugfh cursor on_connect_do transaction_depth/);
used). Initially set to be STDERR - although see information on the
L<DBIX_CLASS_STORAGE_DBI_DEBUG> environment variable.
+=head2 debugcb
+
+Sets a callback to be executed each time a statement is run; takes a sub
+reference. Overrides debugfh. Callback is executed as $sub->($op, $info)
+where $op is SELECT/INSERT/UPDATE/DELETE and $info is what would normally
+be printed.
+
=cut
+sub debugcb {
+ my ($self, $cb) = @_;
+ my $cb_obj = bless(\$cb, 'DBIx::Class::Storage::DBI::DebugCallback');
+ $self->debugfh($cb_obj);
+}
+
sub disconnect {
my ($self) = @_;
- $self->_dbh->disconnect if $self->_dbh;
+ if( $self->connected ) {
+ $self->_dbh->rollback unless $self->_dbh->{AutoCommit};
+ $self->_dbh->disconnect;
+ $self->_dbh(undef);
+ }
}
sub connected {
my ($self, $op, $extra_bind, $ident, @args) = @_;
my ($sql, @bind) = $self->sql_maker->$op($ident, @args);
unshift(@bind, @$extra_bind) if $extra_bind;
- $self->debugfh->print("$sql: @bind\n") if $self->debug;
+ if ($self->debug) {
+ my @debug_bind = map { defined $_ ? $_ : 'NULL' } @bind;
+ $self->debugfh->print("$sql: @debug_bind\n");
+ }
my $sth = $self->sth($sql,$op);
@bind = map { ref $_ ? ''.$_ : $_ } @bind; # stringify args
my $rv;
return $self->cursor->new($self, \@_, $attrs);
}
+# Need to call finish() to work round broken DBDs
+
sub select_single {
my $self = shift;
my ($rv, $sth, @bind) = $self->_select(@_);
- return $sth->fetchrow_array;
+ my @row = $sth->fetchrow_array;
+ $sth->finish();
+ return @row;
}
sub sth {
return \%result;
}
+sub DESTROY { shift->disconnect }
+
1;
=head1 ENVIRONMENT VARIABLES