override storage to access sth details
Robert Sedlacek [Wed, 26 Aug 2015 16:59:49 +0000 (16:59 +0000)]
lib/CtrlO/DBIC/Cursor/RowCountStatistics.pm
lib/CtrlO/DBIC/Cursor/RowCountStatistics/Storage.pm [new file with mode: 0644]
t/basic.t

index ba0a828..882cc54 100644 (file)
@@ -4,26 +4,51 @@ use warnings;
 package CtrlO::DBIC::Cursor::RowCountStatistics;
 use Class::Method::Modifiers;
 
+use CtrlO::DBIC::Cursor::RowCountStatistics::Storage;
+
 use parent 'DBIx::Class::Storage::DBI::Cursor';
 
 our $VERSION = '0.000001'; # 0.0.1
 $VERSION = eval $VERSION;
 
+around new => sub {
+    my $orig = shift;
+    my ($class, $storage, @rest) = @_;
+    return $orig->(
+        $class,
+        CtrlO::DBIC::Cursor::RowCountStatistics::Storage->new($storage),
+        @rest,
+    );
+};
+
 after next => sub {
     my ($self) = @_;
     $self->{_ctrlo_rcs_count}++
         unless $self->{_done};
 };
 
+around all => sub {
+    my $orig = shift;
+    my ($self) = @_;
+    my @rows = $orig->(@_);
+    $self->_emit_query_complete(scalar(@rows));
+    return @rows;
+};
+
 before __finish_sth => sub {
     my ($self) = @_;
     my $sql = $self->sth->{Statement};
+    $self->_emit_query_complete($self->{_ctrlo_rcs_count} || 0);
+};
+
+sub _emit_query_complete {
+    my ($self, $count) = @_;
     $self->storage->debugobj->query_complete(
-        $self->{_ctrlo_rcs_count} || 0,
-        $sql,
+        $count,
+        $self->storage->_cached_sql,
         # TODO pass bind params
     ) if $self->storage->debug;
-};
+}
 
 1;
 
diff --git a/lib/CtrlO/DBIC/Cursor/RowCountStatistics/Storage.pm b/lib/CtrlO/DBIC/Cursor/RowCountStatistics/Storage.pm
new file mode 100644 (file)
index 0000000..005a92b
--- /dev/null
@@ -0,0 +1,41 @@
+use strict;
+use warnings;
+
+package CtrlO::DBIC::Cursor::RowCountStatistics::Storage;
+use Class::Method::Modifiers;
+
+sub new {
+    my ($class, $original) = @_;
+    return bless {
+        original => $original,
+    }, $class;
+}
+
+sub _cached_sql {
+    my ($self) = @_;
+    return $self->{cached_sql};
+}
+
+sub throw_exception {
+    my $self = shift;
+    return $self->{original}->throw_exception(@_);
+}
+
+sub _select {
+    my $self = shift;
+    my @res = $self->{original}->_select(@_);
+    $self->{cached_sql} = $res[1]{Statement};
+    return @res;
+}
+
+sub debug {
+    my $self = shift;
+    return $self->{original}->debug(@_);
+}
+
+sub debugobj {
+    my $self = shift;
+    return $self->{original}->debugobj(@_);
+}
+
+1;
index db72f38..c48bb6c 100644 (file)
--- a/t/basic.t
+++ b/t/basic.t
@@ -46,7 +46,7 @@ is $schema->storage->cursor_class,
 
 my $rs = $schema->resultset('Test');
 
-subtest 'simple' => sub {
+subtest 'count with ->next' => sub {
     local @_COMPLETE;
     $rs->create({ id => $_ }) for 1..10;
     do {
@@ -62,6 +62,20 @@ subtest 'simple' => sub {
     $rs->delete;
 };
 
+subtest 'count with ->all' => sub {
+    local @_COMPLETE;
+    $rs->create({ id => $_ }) for 1..10;
+    do {
+        my $rows = $rs->search_rs;
+        is ref($rows->cursor), 'CtrlO::DBIC::Cursor::RowCountStatistics',
+            'resultset cursor';
+        my @all = $rows->all;
+    };
+    is scalar(@_COMPLETE), 1, 'single complete call';
+    is $_COMPLETE[0][0], 10, 'full count';
+    $rs->delete;
+};
+
 subtest 'empty' => sub {
     local @_COMPLETE;
     do {