Thanks Philip.

I've applied it, with just a couple of changes. The first is cosmetic,
the second fixes a bug when proxy_rows is zero.

Any chance you could write some tests for this?

Tim.

--- lib/DBD/Proxy.pm    (revision 9871)
+++ lib/DBD/Proxy.pm    (working copy)
@@ -593,8 +593,7 @@
 
     my $data = $sth->{'proxy_data'};
 
-    defined($sth->{'proxy_rows'}) ||
-      ( $sth->{'proxy_rows'} = 0 );
+    $sth->{'proxy_rows'} = 0 unless defined $sth->{'proxy_rows'};
 
     if(!$data || [EMAIL PROTECTED]) {
        return undef unless $sth->SUPER::FETCH('Active');
@@ -625,8 +624,8 @@
 *fetchrow_arrayref = \&fetch;
 
 sub rows ($) {
-    my($sth) = @_;
-    $sth->{'proxy_rows'} || -1;
+    my $rows = shift->{'proxy_rows'};
+    return (defined $rows) ? $rows : -1;
 }
 
 sub finish ($) {


On Fri, Aug 17, 2007 at 08:18:43AM -0400, Philip Dye wrote:
>    Here is the patch implementing 'rows fetched so far'.  rows() now also 
> properly returns -1 when the
>    $sth->{'proxy_rows'} is not defined.  It is debatable whether execute 
> should undefine proxy _rows or set
>    it to 0.  Unless someone has a good argument otherwise, it seems to me 
> that undefining proxy_rows is the
>    most reasonable thing to do there.
>    - philip
> 
>    Philip Dye wrote:
> 
>      Tim,
> 
>      You are quite correct.  I was too hasty in writing that first patch.  
> According to the DBI
>      documentation there are actually two approaches in vogue for select 
> operations:
> 
>  [1]rows
> 
>  $rv = $sth->rows;
> 
>        Returns the number of rows affected by the last row affecting command, 
> or -1 if the number of rows
>        is not known or not available.
> 
>        Generally, you can only rely on a row count after a non-SELECT execute 
> (for some specific operations
>        like UPDATE and DELETE), or after fetching all the rows of a SELECT 
> statement.
> 
>        For SELECT statements, it is generally not possible to know how many 
> rows will be returned except by
>        fetching them all. Some drivers will return the number of rows the 
> application has fetched so far,
>        but others may return -1 until all rows have been fetched. So use of 
> the rows method or $DBI::rows
>        with SELECT statements is not recommended.
> 
>      I will implement the 'rows fetched so far' model.  Oddly enough neither 
> my earlier fix or this fix
>      will fix the problem I had with Rose::DB::Object::load() that expects 
> sth->rows() to be greater than
>      zero if and only if the most recent fetch() has returned a row.  I 
> posted a fix
>      Rose::DB::Object::load() to its mailing list.
> 
>      Ideally, the implementation of sth->rows() would become standardized so 
> that its value would be
>      dependable one way or the other after a fetch().
> 
>      Respectfully,
>      Philip Dye
>      Senior Research Systems Programmer
>      Computing Facilities Group
>      School of Computer Science
>      [EMAIL PROTECTED]
> 
> References
> 
>    Visible links
>    1. http://search.cpan.org/%7Etimb/DBI/DBI.pm#___top
>    2. mailto:[EMAIL PROTECTED]

> *** DBD/Proxy.pm      Fri Aug 17 07:54:55 2007
> --- DBD/Proxy.pm.new  Fri Aug 17 07:55:06 2007
> *************** sub execute ($@) {
> *** 510,515 ****
> --- 510,516 ----
>   
>       # new execute, so delete any cached rows from previous execute
>       undef $sth->{'proxy_data'};
> +     undef $sth->{'proxy_rows'};
>   
>       my $rsth = $sth->{proxy_sth};
>       my $dbh = $sth->FETCH('Database');
> *************** sub fetch ($) {
> *** 590,595 ****
> --- 591,599 ----
>   
>       my $data = $sth->{'proxy_data'};
>   
> +     defined($sth->{'proxy_rows'}) ||
> +       ( $sth->{'proxy_rows'} = 0 );
> + 
>       if(!$data || [EMAIL PROTECTED]) {
>       return undef unless $sth->SUPER::FETCH('Active');
>   
> *************** sub fetch ($) {
> *** 613,625 ****
>       my $row = shift @$data;
>   
>       $sth->SUPER::STORE(Active => 0) if ( $sth->{proxy_cache_only} and 
> [EMAIL PROTECTED] );
>       return $sth->_set_fbav($row);
>   }
>   *fetchrow_arrayref = \&fetch;
>   
>   sub rows ($) {
>       my($sth) = @_;
> !     $sth->{'proxy_rows'};
>   }
>   
>   sub finish ($) {
> --- 617,630 ----
>       my $row = shift @$data;
>   
>       $sth->SUPER::STORE(Active => 0) if ( $sth->{proxy_cache_only} and 
> [EMAIL PROTECTED] );
> +     $sth->{'proxy_rows'}++;
>       return $sth->_set_fbav($row);
>   }
>   *fetchrow_arrayref = \&fetch;
>   
>   sub rows ($) {
>       my($sth) = @_;
> !     $sth->{'proxy_rows'} || -1;
>   }
>   
>   sub finish ($) {

Reply via email to