X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FCursor.pm;h=4c59ff30aee4bace19d5a2ce5e32be97efb8ce8f;hb=8b445e337a0dbacf4ccb827211002f8d691ad671;hp=d492ebb57fb6de049a5b1a5e72bec057ff5b2b91;hpb=1923c0b4b27dfc62e61cc02b6391e4d37349bcfb;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Cursor.pm b/lib/DBIx/Class/Cursor.pm index d492ebb..4c59ff3 100644 --- a/lib/DBIx/Class/Cursor.pm +++ b/lib/DBIx/Class/Cursor.pm @@ -7,26 +7,60 @@ use overload fallback => 1; sub new { - my ($it_class, $db_class, $sth, $args, $cols) = @_; - $sth->execute(@{$args || []}) unless $sth->{Active}; + 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->storage->select($db_class->_table_name,$cols, + $attrs->{where},$attrs); + } my $new = { class => $db_class, sth => $sth, cols => $cols, - args => $args }; + args => $args, + pos => 0, + attrs => $attrs }; return bless ($new, $it_class); } +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); +} + 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; - #unless (@row) { $self->{sth}->finish; return; } + return unless (@row); + $self->{pos}++; return $self->{class}->_row_to_object($self->{cols}, \@row); } sub count { - return scalar $_[0]->all; # So inefficient + my ($self) = @_; + return $self->{attrs}{rows} if $self->{attrs}{rows}; + if (my $cond = $self->{attrs}->{where}) { +#warn "Counting ".$$cond; + return $self->{class}->count($cond, { bind => $self->{args} }); + } else { + return scalar $_[0]->all; # So inefficient + } } sub all { @@ -41,13 +75,26 @@ sub all { } sub reset { - $_[0]->{sth}->finish if $_[0]->{sth}->{Active}; - $_[0]->{sth}->execute(@{$_[0]->{args} || []}); - return $_[0]; + 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;