Home » Databases » Perl: dbi_query_iterator with Iterator and understanding the $row

Perl: dbi_query_iterator with Iterator and understanding the $row

First let me explain that I’ve been up for more than 40 hours. I’ve had a few hours of sleep earlier today but my brain is not working yet.

On page 171, chapter 4, section 4.5.5 of Higher Order Perl by Mark Jason Dominus, the iterator example given shows an oddity that my brain is having trouble understanding. Specifically, it appears that the second row retrieved from the query result set is being thrown away. Is this correct?

} elsif ($action eq ‘nextval’) {
   my $oldrow = $row;
   $row = $sth->fetchrow_arrayref;
   return $oldrow->[0];
}

UPDATE: This simply sets up the next iteration. That way, we will know if the result set has been entirely processed and the next iteration will be the last iteration. Lesson learned: before reading Higher Order Perl, get some SLEEP!

Full subroutine code:

sub dbi_query_iterator {
    my ($sth, @params) = @_;
    $sth->execute(@params) or return;
    my $row = $sth->fetchrow_arrayref()
    return Iterator {
      my $action = shift() || ‘nextval’;
      if ($action eq ‘exhausted?’) {
        return ! defined $row;
      } elsif ($action eq ‘nextval’) {
        my $oldrow = $row;
        $row = $sth->fetchrow_arrayref;
        return $oldrow->[0];
      }
 }
Share Button

Leave a Reply

Your email address will not be published. Required fields are marked *

*
*

Facebook login by WP-FB-AutoConnect