register_resultset, Cursor fixes
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI / Cursor.pm
CommitLineData
28927b50 1package DBIx::Class::Storage::DBI::Cursor;
2
3use base qw/DBIx::Class::Cursor/;
4
5use strict;
6use warnings;
7
8sub new {
cb5f2eea 9 my ($class, $storage, $args, $attrs) = @_;
28927b50 10 #use Data::Dumper; warn Dumper(@_);
cb5f2eea 11 $class = ref $class if ref $class;
28927b50 12 my $new = {
cb5f2eea 13 storage => $storage,
28927b50 14 args => $args,
15 pos => 0,
16 attrs => $attrs };
cb5f2eea 17 return bless ($new, $class);
28927b50 18}
19
20sub next {
21 my ($self) = @_;
cb5f2eea 22 if ($self->{attrs}{rows} && $self->{pos} >= $self->{attrs}{rows}) {
71e65b39 23 $self->{sth}->finish if $self->{sth}->{Active};
cb5f2eea 24 delete $self->{sth};
25 $self->{done} = 1;
26 }
27 return if $self->{done};
28 unless ($self->{sth}) {
29 $self->{sth} = ($self->{storage}->_select(@{$self->{args}}))[1];
5c91499f 30 if ($self->{attrs}{software_limit}) {
31 if (my $offset = $self->{attrs}{offset}) {
cb5f2eea 32 $self->{sth}->fetch for 1 .. $offset;
5c91499f 33 }
34 }
28927b50 35 }
cb5f2eea 36 my @row = $self->{sth}->fetchrow_array;
37 if (@row) {
38 $self->{pos}++;
39 } else {
40 delete $self->{sth};
41 $self->{done} = 1;
42 }
28927b50 43 return @row;
44}
45
1a14aa3f 46sub all {
47 my ($self) = @_;
48 return $self->SUPER::all if $self->{attrs}{rows};
cb5f2eea 49 $self->{sth}->finish if $self->{sth}->{Active};
50 delete $self->{sth};
51 my ($rv, $sth) = $self->{storage}->_select(@{$self->{args}});
1a14aa3f 52 return @{$sth->fetchall_arrayref};
53}
54
28927b50 55sub reset {
56 my ($self) = @_;
57 $self->{sth}->finish if $self->{sth}->{Active};
cb5f2eea 58 delete $self->{sth};
28927b50 59 $self->{pos} = 0;
cb5f2eea 60 delete $self->{done};
28927b50 61 return $self;
62}
63
64sub DESTROY {
65 my ($self) = @_;
66 $self->{sth}->finish if $self->{sth}->{Active};
67}
68
691;