More refactoring, created PK::Auto::MySQL
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / ResultSet.pm
CommitLineData
89c0a5a2 1package DBIx::Class::ResultSet;
2
3use strict;
4use warnings;
5use overload
6 '0+' => 'count',
7 fallback => 1;
8
9sub new {
7624b19f 10 my ($it_class, $db_class, $attrs) = @_;
89c0a5a2 11 #use Data::Dumper; warn Dumper(@_);
12 $it_class = ref $it_class if ref $it_class;
13 $attrs = { %{ $attrs || {} } };
7624b19f 14 my $cols = [ $db_class->_select_columns ];
15 my $cursor = $db_class->storage->select($db_class->_table_name,$cols,
89c0a5a2 16 $attrs->{where},$attrs);
89c0a5a2 17 my $new = {
18 class => $db_class,
19 cursor => $cursor,
20 cols => $cols,
89c0a5a2 21 cond => $attrs->{where},
22 attrs => $attrs };
23 return bless ($new, $it_class);
24}
25
26sub 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);
7624b19f 32 my $slice = $self->new($self->{class}, $attrs);
89c0a5a2 33 return (wantarray ? $slice->all : $slice);
34}
35
36sub 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
43sub count {
44 my ($self) = @_;
45 return $self->{attrs}{rows} if $self->{attrs}{rows};
7624b19f 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];
89c0a5a2 54}
55
56sub 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
67sub reset {
68 my ($self) = @_;
69 $self->{cursor}->reset;
70 return $self;
71}
72
73sub first {
74 return $_[0]->reset->next;
75}
76
28927b50 77sub delete {
89c0a5a2 78 my ($self) = @_;
79 $_->delete for $self->all;
80 return 1;
81}
82
28927b50 83*delete_all = \&delete; # Yeah, yeah, yeah ...
84
89c0a5a2 851;