package DBIx::Skinny::Pager;
use strict;
use warnings;
use base 'DBIx::Skinny::SQL';
use DBIx::Skinny::Pager::Page::Default;
use DBIx::Skinny::Pager::ResultSet;
use Class::Accessor::Lite;
our $VERSION = '0.11';
Class::Accessor::Lite->mk_accessors(qw/page/);
sub get_total_entries {
die "please override";
}
sub pager_class {
"DBIx::Skinny::Pager::Page::Default";
}
sub retrieve {
my $self = shift;
Carp::croak("limit not found") unless defined($self->limit);
unless ( defined($self->offset) ) {
Carp::croak("limit or page not found") unless defined($self->page);
$self->offset($self->limit * ( (int($self->page) || 1) - 1) );
}
my $iter = $self->SUPER::retrieve(@_);
my $total_entries = $self->get_total_entries($iter);
my $pager = $self->pager_class->new($total_entries, $self->limit, ( $self->offset / $self->limit) + 1);
if ( wantarray ) {
return ( $iter, $pager );
} else {
return DBIx::Skinny::Pager::ResultSet->new(
iterator => $iter,
pager => $pager,
);
}
}
1;
__END__
=head1 NAME
DBIx::Skinny::Pager -
=head1 SYNOPSIS
package Proj::DB;
use DBIx::Skinny;
use DBIx::Skinny::Mixin modules => ['Pager'];
package main;
use Proj::DB;
my $rs = Proj::DB->resultset_with_pager('MySQLFoundRows');
# $rs can handle like DBIx::Skinny::SQL.
$rs->from(['some_table']);
$rs->add_where('foo' => 'bar');
$rs->limit(10);
$rs->offset(20);
$rs->select([qw(foo bar baz)]);
my ($iter, $pager) = $rs->retrieve;
# $iter is a DBIx::Skinny::Iterator
# $pager is a Data::Page
# or you can set page
my $rs2 = Proj::DB->resultset_with_pager;
$rs2->from(['some_table']);
$rs2->add_where('foo' => 'bar');
$rs2->limit(10);
$rs2->page(2); # offset is 10 * ( 2 - 1) = 10.
$rs2->select([qw(foo bar baz)]);
my $result = $rs2->retrieve;
$result->iterator #=> DBIx::Skinny::Iterator
$result->pager #=> Data::Page
=head1 DESCRIPTION
DBIx::Skinny::Pager is resultset pager interface for DBIx::Skinny.
This module is not support for search_by_sql or search_named.
and This modele is not support Oracle connection.
XXX: THIS PROJECT IS EARLY DEVELOPMENT. API may change in future.
=head1 AUTHOR
Keiji Yoshimi E<lt>walf443 at gmail dot comE<gt>
=head1 SEE ALSO
L<DBIx::Skinny>, L<DBIx::Skinny::SQL>, L<DBIx::Skinny::Mixin>, L<Data::Page>
=head1 LICENSE
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=cut