X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FCursor.pm;h=14816abed20c8554b1f7397b8bc7ad014d9e3f28;hb=7d3139ac1ff52213e2dad35fc9c9d1057711256a;hp=df8aea53dc202511799de593716995db841261f5;hpb=1909f72bbed4e2a9ba4e8b9d574a6ee65d33e39b;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Cursor.pm b/lib/DBIx/Class/Cursor.pm index df8aea5..14816ab 100644 --- a/lib/DBIx/Class/Cursor.pm +++ b/lib/DBIx/Class/Cursor.pm @@ -2,103 +2,78 @@ package DBIx::Class::Cursor; use strict; use warnings; -use overload - '0+' => 'count', - fallback => 1; + +use base qw/DBIx::Class/; + +=head1 NAME + +DBIx::Class::Cursor - Abstract 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 + +Virtual method. Returns a new L object. + +=cut sub new { - my ($it_class, $db_class, $sth, $args, $cols, $attrs) = @_; - #use Data::Dumper; warn Dumper(@_); - $it_class = ref $it_class if ref $it_class; - unless ($sth) { - $sth = $db_class->_get_sth('select', $cols, - $db_class->_table_name, $attrs->{where}); - } - my $new = { - class => $db_class, - sth => $sth, - cols => $cols, - args => $args, - pos => 0, - attrs => $attrs }; - return bless ($new, $it_class); + die "Virtual method!"; } -sub slice { - my ($self, $min, $max) = @_; - my $attrs = { %{ $self->{attrs} || {} } }; - $self->{class}->throw("Can't slice without where") unless $attrs->{where}; - $attrs->{offset} = $min; - $attrs->{rows} = ($max ? ($max - $min + 1) : 1); - my $slice = $self->new($self->{class}, undef, $self->{args}, - $self->{cols}, $attrs); - return (wantarray ? $slice->all : $slice); -} +=head2 next + +Virtual method. Advances the cursor to the next row. Returns an array of +column values (the result of L method). + +=cut sub next { - my ($self) = @_; - return if $self->{attrs}{rows} - && $self->{pos} >= $self->{attrs}{rows}; # + $self->{attrs}{offset}); - unless ($self->{live_sth}) { - $self->{sth}->execute(@{$self->{args} || []}); - if (my $offset = $self->{attrs}{offset}) { - $self->{sth}->fetchrow_array for 1 .. $offset; - } - $self->{live_sth} = 1; - } - my @row = $self->{sth}->fetchrow_array; - return unless (@row); - $self->{pos}++; - return $self->{class}->_row_to_object($self->{cols}, \@row); + die "Virtual method!"; } -sub count { - my ($self) = @_; - return $self->{attrs}{rows} if $self->{attrs}{rows}; - if (my $cond = $self->{attrs}->{where}) { - my $class = $self->{class}; - my $sth = $class->_get_sth( 'select', [ 'COUNT(*)' ], - $class->_table_name, $cond); - my ($count) = $class->_get_dbh->selectrow_array( - $sth, undef, @{$self->{args} || []}); - return $count; - } else { - return scalar $_[0]->all; # So inefficient - } +=head2 reset + +Virtual method. Resets the cursor to the beginning. + +=cut + +sub reset { + die "Virtual method!"; } +=head2 all + +Virtual method. Returns all rows in the L. + +=cut + sub all { my ($self) = @_; $self->reset; my @all; - while (my $obj = $self->next) { - push(@all, $obj); + while (my @row = $self->next) { + push(@all, \@row); } $self->reset; return @all; } -sub reset { - my ($self) = @_; - $self->{sth}->finish if $self->{sth}->{Active}; - $self->{pos} = 0; - $self->{live_sth} = 0; - return $self; -} - -sub first { - return $_[0]->reset->next; -} - -sub delete_all { - my ($self) = @_; - $_->delete for $self->all; - return 1; -} - -sub DESTROY { - my ($self) = @_; - $self->{sth}->finish if $self->{sth}->{Active}; -} - 1;