X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FCursor.pm;h=770608c25f0d10bafec77f24ea0df04467429417;hb=182fee362308526aa3f6161e8d79d566e7df520e;hp=cd1926e3d42b5f75aac386b30a4e3e6728f9a504;hpb=c0e7b4e55952cd193b6f1866d0c27ece182397eb;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/Cursor.pm b/lib/DBIx/Class/Storage/DBI/Cursor.pm index cd1926e..770608c 100644 --- a/lib/DBIx/Class/Storage/DBI/Cursor.pm +++ b/lib/DBIx/Class/Storage/DBI/Cursor.pm @@ -1,11 +1,39 @@ -package # hide from PAUSE - DBIx::Class::Storage::DBI::Cursor; +package DBIx::Class::Storage::DBI::Cursor; use base qw/DBIx::Class::Cursor/; use strict; use warnings; +=head1 NAME + +DBIx::Class::Storage::DBI::Cursor - Object representing a query cursor on a +resultset. + +=head1 SYNOPSIS + + my $cursor = $schema->resultset('CD')->cursor(); + my $first_cd = $cursor->next; + +=head1 DESCRIPTION + +A Cursor represents a query cursor on a L object. It +allows for traversing the result set with L, retrieving all results with +L and resetting the cursor with L. + +Usually, you would use the cursor methods built into L +to traverse it. See L, +L and L for more +information. + +=head1 METHODS + +=head2 new + +Returns a new L object. + +=cut + sub new { my ($class, $storage, $args, $attrs) = @_; #use Data::Dumper; warn Dumper(@_); @@ -14,12 +42,33 @@ sub new { storage => $storage, args => $args, pos => 0, - attrs => $attrs }; + attrs => $attrs, + pid => $$, + }; + + $new->{tid} = threads->tid if $INC{'threads.pm'}; + return bless ($new, $class); } +=head2 next + +=over 4 + +=item Arguments: none + +=item Return Value: \@row_columns + +=back + +Advances the cursor to the next row and returns an arrayref of column values. + +=cut + sub next { my ($self) = @_; + + $self->_check_forks_threads; if ($self->{attrs}{rows} && $self->{pos} >= $self->{attrs}{rows}) { $self->{sth}->finish if $self->{sth}->{Active}; delete $self->{sth}; @@ -44,8 +93,25 @@ sub next { return @row; } +=head2 all + +=over 4 + +=item Arguments: none + +=item Return Value: \@row_columns+ + +=back + +Returns a list of arrayrefs of column values for all rows in the +L. + +=cut + sub all { my ($self) = @_; + + $self->_check_forks_threads; return $self->SUPER::all if $self->{attrs}{rows}; $self->{sth}->finish if $self->{sth}->{Active}; delete $self->{sth}; @@ -53,18 +119,48 @@ sub all { return @{$sth->fetchall_arrayref}; } +=head2 reset + +Resets the cursor to the beginning of the L. + +=cut + sub reset { my ($self) = @_; + + $self->_check_forks_threads; $self->{sth}->finish if $self->{sth}->{Active}; + $self->_soft_reset; +} + +sub _soft_reset { + my ($self) = @_; + delete $self->{sth}; $self->{pos} = 0; delete $self->{done}; return $self; } +sub _check_forks_threads { + my ($self) = @_; + + if($INC{'threads.pm'} && $self->{tid} != threads->tid) { + $self->_soft_reset; + $self->{tid} = threads->tid; + } + + if($self->{pid} != $$) { + $self->_soft_reset; + $self->{pid} = $$; + } +} + sub DESTROY { my ($self) = @_; - $self->{sth}->finish if $self->{sth}->{Active}; + + $self->_check_forks_threads; + $self->{sth}->finish if $self->{sth} && $self->{sth}->{Active}; } 1;