Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
Arthur Axel 'fREW' Schmidt committed Dec 7, 2015
1 parent 8fb18b7 commit f57e2c8
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 2 deletions.
43 changes: 41 additions & 2 deletions lib/DBIx/Class/QueryLog.pm
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package DBIx::Class::QueryLog;
# ABSTRACT: Log queries for later analysis.

use Moo;
use Types::Standard qw( Str Maybe ArrayRef Bool InstanceOf );
use Types::Standard qw( Str Maybe ArrayRef Bool InstanceOf Int );

has bucket => (
is => 'rw',
Expand All @@ -21,14 +21,52 @@ has current_transaction => (
isa => Maybe[InstanceOf['DBIx::Class::QueryLog::Transaction']]
);

has max_log_event => (
is => 'rw',
lazy => 1,
clearer => 'reset_max_log_event',
builder => 'max_log_event_generator',
);

sub max_event_generator_template {
my ($class, $max) = @_;

sub {
my $self = shift;

my $i = 0;

sub {
return unless $i++ == $max;

my $self = shift;
warn "Exceeded max log size of $max" .
'; consider calling ->reset to avoid memory leakage'
}
}
}

sub max_log_event_generator { $_[0]->_max_log_event_generator->($_[0]) }
has _max_log_event_generator => (
is => 'ro',
init_arg => 'max_log_event_generator',
lazy => 1,
default => sub { shift->max_event_generator_template(1_000) },
);

has log => (
traits => [qw(Array)],
is => 'rw',
isa => ArrayRef,
default => sub { [] },
);

sub add_to_log { push @{shift->log}, @_ }
sub add_to_log {
my $self = shift;

$self->max_log_event->($self);
push @{$self->log}, @_
}
sub reset { shift->log([]) }

has passthrough => (
Expand Down Expand Up @@ -259,6 +297,7 @@ sub query_end {
$q->end_time($self->_time);
$q->bucket($self->bucket);
if(defined($self->current_transaction)) {
$self->max_log_event->($self);
$self->current_transaction->add_to_queries($q);
} else {
$self->add_to_log($q)
Expand Down
59 changes: 59 additions & 0 deletions t/max.t
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#!perl

use strict;
use warnings;

use Test::More;

use DBIx::Class::QueryLog;

my $triggered;
my $ql = DBIx::Class::QueryLog->new(
max_log_event_generator => sub {
my $self = shift;

my $max = 2;
my $i = 0;

sub {
return unless $i++ == $max;

$triggered++;
}
},
);

$ql->query_start('SELECT * from foo');
$ql->query_end('SELECT * from foo');
ok(!$triggered, 'not yet triggered');
$ql->query_start('SELECT * from foo');
$ql->query_end('SELECT * from foo');
ok(!$triggered, 'still not triggered');
$ql->query_start('SELECT * from foo');
$ql->query_end('SELECT * from foo');
is($triggered, 1, 'triggered once');
$ql->query_start('SELECT * from foo');
$ql->query_end('SELECT * from foo');
is($triggered, 1, 'not triggered again');

subtest 'reset_max_log_event' => sub {

$ql->reset_max_log_event;
$triggered = 0;

$ql->query_start('SELECT * from foo');
$ql->query_end('SELECT * from foo');
ok(!$triggered, 'not yet triggered');
$ql->query_start('SELECT * from foo');
$ql->query_end('SELECT * from foo');
ok(!$triggered, 'still not triggered');
$ql->query_start('SELECT * from foo');
$ql->query_end('SELECT * from foo');
is($triggered, 1, 'triggered once');
$ql->query_start('SELECT * from foo');
$ql->query_end('SELECT * from foo');
is($triggered, 1, 'not triggered again');

};

done_testing;

0 comments on commit f57e2c8

Please sign in to comment.