X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage.pm;h=34c3eac3f25f96cd9468dc4b4edb214bd07acfc6;hb=b6cd6478dc4f3fdf7a4fbee12bb40e2030571fcb;hp=c4997d5a27d23b61f5c52d8beaf6527ed861da70;hpb=f43ea814d6c4c181aeaac244c5db17058aac3d5e;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage.pm b/lib/DBIx/Class/Storage.pm index c4997d5..34c3eac 100644 --- a/lib/DBIx/Class/Storage.pm +++ b/lib/DBIx/Class/Storage.pm @@ -7,10 +7,11 @@ use base qw/DBIx::Class/; use mro 'c3'; use DBIx::Class::Exception; -use Scalar::Util(); +use Scalar::Util 'weaken'; use IO::File; use DBIx::Class::Storage::TxnScopeGuard; use Try::Tiny; +use namespace::clean; __PACKAGE__->mk_group_accessors('simple' => qw/debug debugobj schema/); __PACKAGE__->mk_group_accessors('inherited' => 'cursor_class'); @@ -62,9 +63,22 @@ sub new { bless $new, $self; $new->set_schema($schema); - $new->debugobj(new DBIx::Class::Storage::Statistics()); - - #my $fh; + my $debugobj; + if (my $profile = $ENV{DBIC_TRACE_PROFILE}) { + require DBIx::Class::Storage::Debug::PrettyPrint; + if ($profile =~ /^\.?\//) { + require Config::Any; + my $cfg = Config::Any->load_files({ files => [$profile], use_ext => 1 }); + + my ($filename, $config) = %{$cfg->[0]}; + $debugobj = DBIx::Class::Storage::Debug::PrettyPrint->new($config) + } else { + $debugobj = DBIx::Class::Storage::Debug::PrettyPrint->new({ profile => $profile }) + } + } else { + $debugobj = DBIx::Class::Storage::Statistics->new + } + $new->debugobj($debugobj); my $debug_env = $ENV{DBIX_CLASS_STORAGE_DBI_DEBUG} || $ENV{DBIC_TRACE}; @@ -84,7 +98,7 @@ storage object, such as during L. sub set_schema { my ($self, $schema) = @_; $self->schema($schema); - Scalar::Util::weaken($self->{schema}) if ref $self->{schema}; + weaken $self->{schema} if ref $self->{schema}; } =head2 connected @@ -186,7 +200,8 @@ transaction failure. =cut sub txn_do { - my ($self, $coderef, @args) = @_; + my $self = shift; + my $coderef = shift; ref $coderef eq 'CODE' or $self->throw_exception ('$coderef must be a CODE reference'); @@ -198,19 +213,21 @@ sub txn_do { my $wantarray = wantarray; # Need to save this since the context # inside the try{} block is independent # of the context that called txn_do() + my $args = \@_; + try { # Need to differentiate between scalar/list context to allow for # returning a list in scalar context to get the size of the list if ($wantarray) { # list context - @return_values = $coderef->(@args); + @return_values = $coderef->(@$args); } elsif (defined $wantarray) { # scalar context - $return_value = $coderef->(@args); + $return_value = $coderef->(@$args); } else { # void context - $coderef->(@args); + $coderef->(@$args); } $self->txn_commit; } @@ -332,7 +349,7 @@ sub txn_scope_guard { =head2 sql_maker Returns a C object - normally an object of class -C. +C. =cut @@ -479,10 +496,20 @@ If the value is of the form C<1=/path/name> then the trace output is written to the file C. This environment variable is checked when the storage object is first -created (when you call connect on your schema). So, run-time changes -to this environment variable will not take effect unless you also +created (when you call connect on your schema). So, run-time changes +to this environment variable will not take effect unless you also re-connect on your schema. +=head2 DBIC_TRACE_PROFILE + +If C is set, L +will be used to format the output from C. The value it +is set to is the C that it will be used. If the value is a +filename the file is read with L and the results are +used as the configuration for tracing. See L +for what that structure should look like. + + =head2 DBIX_CLASS_STORAGE_DBI_DEBUG Old name for DBIC_TRACE