e7cbd88d55c914ed2218a84af071f5c908c093cd
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / ResultSet.pm
1 package DBIx::Class::ResultSet;
2
3 use strict;
4 use warnings;
5 use overload
6         '0+'     => 'count',
7         fallback => 1;
8
9 sub new {
10   my ($it_class, $db_class, $attrs) = @_;
11   #use Data::Dumper; warn Dumper(@_);
12   $it_class = ref $it_class if ref $it_class;
13   $attrs = { %{ $attrs || {} } };
14   my $cols = [ $db_class->_select_columns ];
15   my $cursor = $db_class->storage->select($db_class->_table_name,$cols,
16                                         $attrs->{where},$attrs);
17   my $new = {
18     class => $db_class,
19     cursor => $cursor,
20     cols => $cols,
21     cond => $attrs->{where},
22     attrs => $attrs };
23   return bless ($new, $it_class);
24 }
25
26 sub slice {
27   my ($self, $min, $max) = @_;
28   my $attrs = { %{ $self->{attrs} || {} } };
29   $self->{class}->throw("Can't slice without where") unless $attrs->{where};
30   $attrs->{offset} = $min;
31   $attrs->{rows} = ($max ? ($max - $min + 1) : 1);
32   my $slice = $self->new($self->{class}, $attrs);
33   return (wantarray ? $slice->all : $slice);
34 }
35
36 sub next {
37   my ($self) = @_;
38   my @row = $self->{cursor}->next;
39   return unless (@row);
40   return $self->{class}->_row_to_object($self->{cols}, \@row);
41 }
42
43 sub count {
44   my ($self) = @_;
45   return $self->{attrs}{rows} if $self->{attrs}{rows};
46     # This is a hack, and will break on the last page of a paged set.
47     # Once we have limit support in Storage, kill it.
48
49   my $db_class = $self->{class};
50   my @cols = 'COUNT(*)';
51   my $cursor = $db_class->storage->select($db_class->_table_name, \@cols,
52                                             $self->{cond}, $self->{attrs});
53   return ($cursor->next)[0];
54 }
55
56 sub all {
57   my ($self) = @_;
58   $self->reset;
59   my @all;
60   while (my $obj = $self->next) {
61     push(@all, $obj);
62   }
63   $self->reset;
64   return @all;
65 }
66
67 sub reset {
68   my ($self) = @_;
69   $self->{cursor}->reset;
70   return $self;
71 }
72
73 sub first {
74   return $_[0]->reset->next;
75 }
76
77 sub delete {
78   my ($self) = @_;
79   $_->delete for $self->all;
80   return 1;
81 }
82
83 *delete_all = \&delete; # Yeah, yeah, yeah ...
84
85 1;