package Catalyst::TraitFor::Model::DBIC::Schema::QueryLog::AdoptPlack;
our $VERSION = "0.07";
use 5.008004;
use Moose::Role;
use Plack::Middleware::DBIC::QueryLog;
use Scalar::Util 'blessed';
with 'Catalyst::Component::InstancePerContext';
requires 'storage';
has show_missing_ql_warning => (is=>'rw', default=>1);
sub get_querylog_from_env {
my ($self, $env) = @_;
return Plack::Middleware::DBIC::QueryLog->get_querylog_from_env($env);
}
sub infer_env_from {
my ($self, $ctx) = @_;
if($ctx->engine->can('env')) {
return $ctx->engine->env;
} elsif($ctx->request->can('env')) {
return $ctx->request->env;
} else { return }
}
sub enable_dbic_querylogging {
my ($self, $querylog) = @_;
$self->storage->debugobj($querylog);
$self->storage->debug(1);
}
sub die_missing_querylog {
shift->show_missing_ql_warning(0);
die <<DEAD;
You asked me to querylog DBIC, but there is no querylog object in the Plack
\$env. You probably forgot to enable Plack::Middleware::Debug::DBIC::QueryLog
in your debugging panel.
DEAD
}
sub die_not_plack {
die "Not a Plack Engine or compatible interface!"
}
sub build_per_context_instance {
my ( $self, $ctx ) = @_;
return $self unless blessed($ctx);
if(my $env = $self->infer_env_from($ctx)) {
if(my $querylog = $self->get_querylog_from_env($env)) {
$self->enable_dbic_querylogging($querylog);
} else {
$self->die_missing_querylog() if
$self->show_missing_ql_warning;
}
} else {
die_not_plack();
}
return $self;
}
1;
=head1 NAME
Catalyst::TraitFor::Model::DBIC::Schema::QueryLog::AdoptPlack - Use a Plack Middleware QueryLog
=head1 SYNOPSIS
package MyApp::Web::Model::Schema;
use parent 'Catalyst::Model::DBIC::Schema';
__PACKAGE__->config({
schema_class => 'MyApp::Schema',
traits => ['QueryLog::AdoptPlack'],
## .. rest of configuration
});
=head1 DESCRIPTION
This is a trait for L<Catalyst::Model::DBIC::Schema> which adopts a L<Plack>
created L<DBIx::Class::QueryLog> and logs SQL for a given request cycle. It is
intended to be compatible with L<Catalyst::TraitFor::Model::DBIC::Schema::QueryLog>
which you may already be using.
It picks up the querylog from C<< $env->{'plack.middleware.dbic.querylog'} >>
or from C<< $env->{'plack.middleware.debug.dbic.querylog'} >> which is generally
provided by the L<Plack> middleware L<Plack::Middleware::Debug::DBIC::QueryLog>
In fact you will probably use these two modules together. Please see the documentation
in L<Plack::Middleware::Debug::DBIC::QueryLog> for an example.
PLEASE NOTE: Starting with the 0.04 version of L<Plack::Middleware::Debug::DBIC::QueryLog>
we will canonicalize on C<< $env->{'plack.middleware.dbic.querylog'} >>. For now
both listed keys will work, but within a release or two the older key will warn and
prompt you to upgrade your version of L<Plack::Middleware::Debug::DBIC::QueryLog>.
Sorry for the trouble.
=head1 SEE ALSO
L<Plack::Middleware::Debug::DBIC::QueryLog>,
L<Catalyst::TraitFor::Model::DBIC::Schema::QueryLog>,
L<Catalyst::Model::DBIC::Schema>,
L<Plack::Middleware::Debug>
=head1 ACKNOWLEGEMENTS
This code inspired from L<Catalyst::TraitFor::Model::DBIC::Schema::QueryLog>
and the author owes a debt of gratitude for the original authors.
=head1 AUTHOR
John Napiorkowski, C<< <jjnapiork@cpan.org> >>
=head1 COPYRIGHT & LICENSE
Copyright 2012, John Napiorkowski
This program is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=cut