Commit | Line | Data |
1923c0b4 |
1 | package DBIx::Class::Cursor; |
2 | |
3 | use strict; |
4 | use warnings; |
5 | use overload |
6 | '0+' => 'count', |
7 | fallback => 1; |
8 | |
9 | sub new { |
54644855 |
10 | my ($it_class, $db_class, $sth, $args, $cols, $attrs) = @_; |
525035fb |
11 | #use Data::Dumper; warn Dumper(@_); |
12 | $it_class = ref $it_class if ref $it_class; |
13 | unless ($sth) { |
20a2c954 |
14 | $attrs->{bind} = $args; |
8b445e33 |
15 | $sth = $db_class->storage->select($db_class->_table_name,$cols, |
16 | $attrs->{where},$attrs); |
525035fb |
17 | } |
1923c0b4 |
18 | my $new = { |
19 | class => $db_class, |
20 | sth => $sth, |
21 | cols => $cols, |
54644855 |
22 | args => $args, |
525035fb |
23 | pos => 0, |
54644855 |
24 | attrs => $attrs }; |
1923c0b4 |
25 | return bless ($new, $it_class); |
26 | } |
27 | |
525035fb |
28 | sub slice { |
29 | my ($self, $min, $max) = @_; |
30 | my $attrs = { %{ $self->{attrs} || {} } }; |
31 | $self->{class}->throw("Can't slice without where") unless $attrs->{where}; |
32 | $attrs->{offset} = $min; |
33 | $attrs->{rows} = ($max ? ($max - $min + 1) : 1); |
34 | my $slice = $self->new($self->{class}, undef, $self->{args}, |
35 | $self->{cols}, $attrs); |
36 | return (wantarray ? $slice->all : $slice); |
37 | } |
38 | |
1923c0b4 |
39 | sub next { |
40 | my ($self) = @_; |
525035fb |
41 | return if $self->{attrs}{rows} |
42 | && $self->{pos} >= $self->{attrs}{rows}; # + $self->{attrs}{offset}); |
43 | unless ($self->{live_sth}) { |
44 | $self->{sth}->execute(@{$self->{args} || []}); |
45 | if (my $offset = $self->{attrs}{offset}) { |
46 | $self->{sth}->fetchrow_array for 1 .. $offset; |
47 | } |
48 | $self->{live_sth} = 1; |
49 | } |
1923c0b4 |
50 | my @row = $self->{sth}->fetchrow_array; |
c23835c4 |
51 | return unless (@row); |
525035fb |
52 | $self->{pos}++; |
1923c0b4 |
53 | return $self->{class}->_row_to_object($self->{cols}, \@row); |
54 | } |
55 | |
56 | sub count { |
54644855 |
57 | my ($self) = @_; |
525035fb |
58 | return $self->{attrs}{rows} if $self->{attrs}{rows}; |
54644855 |
59 | if (my $cond = $self->{attrs}->{where}) { |
8b445e33 |
60 | #warn "Counting ".$$cond; |
61 | return $self->{class}->count($cond, { bind => $self->{args} }); |
54644855 |
62 | } else { |
63 | return scalar $_[0]->all; # So inefficient |
64 | } |
1923c0b4 |
65 | } |
66 | |
67 | sub all { |
68 | my ($self) = @_; |
69 | $self->reset; |
70 | my @all; |
71 | while (my $obj = $self->next) { |
72 | push(@all, $obj); |
73 | } |
74 | $self->reset; |
75 | return @all; |
76 | } |
77 | |
78 | sub reset { |
525035fb |
79 | my ($self) = @_; |
80 | $self->{sth}->finish if $self->{sth}->{Active}; |
81 | $self->{pos} = 0; |
82 | $self->{live_sth} = 0; |
83 | return $self; |
1923c0b4 |
84 | } |
85 | |
86 | sub first { |
87 | return $_[0]->reset->next; |
88 | } |
89 | |
525035fb |
90 | sub delete_all { |
91 | my ($self) = @_; |
92 | $_->delete for $self->all; |
93 | return 1; |
94 | } |
95 | |
1909f72b |
96 | sub DESTROY { |
97 | my ($self) = @_; |
98 | $self->{sth}->finish if $self->{sth}->{Active}; |
99 | } |
100 | |
1923c0b4 |
101 | 1; |