Class-DBI-Pager-0.08/0000755000175000017500000000000010401260013015541 5ustar miyagawamiyagawa00000000000000Class-DBI-Pager-0.08/t/0000755000175000017500000000000010401260013016004 5ustar miyagawamiyagawa00000000000000Class-DBI-Pager-0.08/t/00_compile.t0000644000175000017500000000011510303520427020126 0ustar miyagawamiyagawa00000000000000use strict; use Test::More tests => 1; BEGIN { use_ok 'Class::DBI::Pager' } Class-DBI-Pager-0.08/t/01_pager.t0000644000175000017500000000545710321107662017615 0ustar miyagawamiyagawa00000000000000use strict; use Test::More; BEGIN { eval "use DBD::SQLite"; plan $@ ? (skip_all => 'needs DND::SQLite for testing') : (tests => 37); } use DBI; my $DB = "t/testdb"; unlink $DB if -e $DB; my @DSN = ("dbi:SQLite:dbname=$DB", '', '', { AutoCommit => 1 }); DBI->connect(@DSN)->do(<set_db(Main => @DSN); __PACKAGE__->table('film'); __PACKAGE__->columns(Primary => qw(id)); __PACKAGE__->columns(All => qw(title)); use Class::DBI::Pager; package main; for my $i (1..50) { Film->create({ title => "title $i", }); } { my $pager = Film->pager(20, 1); eval { $pager->total_entries; }; like $@, qr/Can't call pager methods without searching/, $@; } { my $pager = Film->pager(20, 1); my $iterator = $pager->retrieve_all; isa_ok $pager, 'Class::DBI::Pager'; is $pager->total_entries, 50, "total is 50"; is $pager->entries_per_page, 20, "entries_per_page"; is $pager->current_page, 1, "current_page"; is $pager->first_page, 1, "first page"; is $pager->last_page, 3, "last page is 3"; is $pager->first, 1, "first is 1"; is $pager->last, 20, "last is 20"; is $pager->previous_page, undef, "previous_page"; is $pager->next_page, 2, "next_page"; isa_ok $iterator, 'Class::DBI::Iterator'; is $iterator->count, 20, 'iterator counts 20'; } { my $pager = Film->pager(20, 3); my $iterator = $pager->retrieve_all; isa_ok $pager, 'Class::DBI::Pager'; is $pager->total_entries, 50, "total is 50"; is $pager->entries_per_page, 20, "entries_per_page"; is $pager->current_page, 3, "current_page"; is $pager->first_page, 1, "first page"; is $pager->last_page, 3, "last page is 3"; is $pager->first, 41, "first is 41"; is $pager->last, 50, "last is 50"; is $pager->previous_page, 2, "previous_page"; is $pager->next_page, undef, "next_page"; isa_ok $iterator, 'Class::DBI::Iterator'; is $iterator->count, 10, 'iterator counts 10'; } { my $pager = Film->pager(20, 1); my $iterator = $pager->search_like(title => "title 1%"); isa_ok $pager, 'Class::DBI::Pager'; is $pager->total_entries, 11, "total is 11"; is $pager->entries_per_page, 20, "entries_per_page"; is $pager->current_page, 1, "current_page"; is $pager->first_page, 1, "first page"; is $pager->last_page, 1, "last page is 1"; is $pager->first, 1, "first is 1"; is $pager->last, 11, "last is 11"; is $pager->previous_page, undef, "previous_page"; is $pager->next_page, undef, "next_page"; is $iterator->count, 11, "iterator counts 11"; my @list = $pager->search_like(title => "title 1%"); is scalar(@list), 11, "array context works"; } END { unlink $DB if -e $DB } Class-DBI-Pager-0.08/lib/0000755000175000017500000000000010401260013016307 5ustar miyagawamiyagawa00000000000000Class-DBI-Pager-0.08/lib/Class/0000755000175000017500000000000010401260013017354 5ustar miyagawamiyagawa00000000000000Class-DBI-Pager-0.08/lib/Class/DBI/0000755000175000017500000000000010401260013017752 5ustar miyagawamiyagawa00000000000000Class-DBI-Pager-0.08/lib/Class/DBI/Pager.pm0000644000175000017500000000710010401257775021371 0ustar miyagawamiyagawa00000000000000package Class::DBI::Pager; use strict; use vars qw($VERSION $AUTOLOAD); $VERSION = 0.08; use Class::DBI 0.90; use Data::Page; sub import { my $class = shift; my $pkg = caller(0); no strict 'refs'; *{"$pkg\::pager"} = \&_pager; } sub _croak { require Carp; Carp::croak(@_); } sub _pager { my($pkg, $entry, $curr) = @_; bless { pkg => $pkg, entry => $entry, curr => $curr, pager => undef, }, __PACKAGE__; } BEGIN { my @methods = qw(total_entries entries_per_page current_page entries_on_this_page first_page last_page first last previous_page next_page pages_in_navigation); for my $method (@methods) { no strict 'refs'; *$method = sub { my $self = shift; $self->{pager} or _croak("Can't call pager methods without searching"); $self->{pager}->$method(@_); }; } } sub DESTROY { } sub AUTOLOAD { my $self = shift; (my $method = $AUTOLOAD) =~ s/.*://; if (ref($self) && $self->{pkg}->can($method)) { my $iter = $self->{pkg}->$method(@_); UNIVERSAL::isa($iter, 'Class::DBI::Iterator') or _croak("$method doesn't return Class::DBI::Itertor"); my $pager = $self->{pager} = Data::Page->new( $iter->count, $self->{entry}, $self->{curr}, ); return $iter->slice($pager->first-1, $pager->last-1); } else { _croak(qq(Can't locate object method "$method" via package ) . ref($self) || $self); } } 1; __END__ =head1 NAME Class::DBI::Pager - Pager utility for Class::DBI =head1 SYNOPSIS package CD; use base qw(Class::DBI); __PACKAGE__->set_db(...); use Class::DBI::Pager; # just use it # then, in client code! package main; use CD; my $pager = CD->pager(20, 1); # ($items_per_page, $current_page) my @disks = $pager->retrieve_all; =head1 DESCRIPTION Class::DBI::Pager is a plugin for Class::DBI, which glues Data::Page with Class::DBI. This module reduces your work a lot, for example when you have to do something like: * retrieve objects from a database * display objects with 20 items per page In addition, your work will be reduced more, when you use Template-Toolkit as your templating engine. See L for details. =head1 EXAMPLE # Controller: (MVC's C) my $query = CGI->new; my $template = Template->new; my $pager = Film->pager(20, $query->param('page') || 1); my $movies = $pager->retrieve_all; $template->process($input, { movies => $movies, pager => $pager, }); # View: (MVC's V) Matched [% pager.total_entries %] items. [% WHILE (movie = movies.next) %] Title: [% movie.title | html %] [% END %] ### navigation like: [1] [2] [3] [% FOREACH num = [pager.first_page .. pager.last_page] %] [% IF num == pager.current_page %][[% num %]] [% ELSE %][[% num %]][% END %] [% END %] ### navigation like: prev 20 | next 20 [% IF pager.previous_page %] prev [% pager.entries_per_page %] | [% END %] [% IF pager.next_page %] next [% pager.entries_per_page %] [% END %] =head1 NOTE / TODO This modules internally retrieves itertors, then creates C object for paging utility. Using SQL clauses C and/or C with C might be more memory efficient. =head1 AUTHOR Tatsuhiko Miyagawa Emiyagawa@bulknews.netE Original idea by Tomohiro Ikebe Eikebe@cpan.orgE This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO L, L =cut Class-DBI-Pager-0.08/MANIFEST0000644000175000017500000000027310303520427016705 0ustar miyagawamiyagawa00000000000000Changes MANIFEST This list of files Makefile.PL README lib/Class/DBI/Pager.pm t/00_compile.t t/01_pager.t META.yml Module meta-data (added by MakeMaker) Class-DBI-Pager-0.08/META.yml0000644000175000017500000000073110401260013017013 0ustar miyagawamiyagawa00000000000000# http://module-build.sourceforge.net/META-spec.html #XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX# name: Class-DBI-Pager version: 0.08 version_from: lib/Class/DBI/Pager.pm installdirs: site requires: Class::DBI: 0.9 Data::Page: 0.13 Exporter::Lite: 0.01 Test::More: 0.32 distribution_type: module generated_by: ExtUtils::MakeMaker version 6.17 Class-DBI-Pager-0.08/Changes0000644000175000017500000000152010401257775017057 0ustar miyagawamiyagawa00000000000000Revision history for Perl extension Class::DBI::Pager 0.08 2006-03-01T08:48:12Z - Support Data::Page::Navigation (thanks to tokuhirom) 0.07 Thu Oct 6 02:43:43 UTC 2005 - Fixed test suite for Windows [cpan #14937] 0.06 Thu Sep 2 21:30:55 JST 2004 * Fixed problem with has_many() (Thanks to Rhesa Rozendaal) 0.05 Wed Dec 17 15:45:35 JST 2003 * added entries_on_this_page (Thanks to Naoya Ito) 0.04 Thu Feb 20 21:03:56 JST 2003 * require Class::DBI >= 0.90 0.03 Fri Aug 23 03:04:05 JST 2002 - Fixed tests so it doesn't inherit from C::D::SQLite 0.02 Fri Aug 16 22:13:39 JST 2002 * Fixed bug with DESTROY handled by AUTOLOAD * Added previous_page, next_page in sync with Data::Page 0.13 (Thanks to Leon Brocard ) - onto CPAN 0.01 Thu Aug 15 23:18:22 2002 - original version Class-DBI-Pager-0.08/README0000644000175000017500000000454010303520427016435 0ustar miyagawamiyagawa00000000000000NAME Class::DBI::Pager - Pager utility for Class::DBI SYNOPSIS package CD; use base qw(Class::DBI); __PACKAGE__->set_db(...); use Class::DBI::Pager; # just use it # then, in client code! package main; use CD; my $pager = CD->pager(20, 1); # ($items_per_page, $current_page) my @disks = $pager->retrieve_all; DESCRIPTION Class::DBI::Pager is a plugin for Class::DBI, which glues Data::Page with Class::DBI. This module reduces your work a lot, for example when you have to do something like: * retrieve objects from a database * display objects with 20 items per page In addition, your work will be reduced more, when you use Template-Toolkit as your templating engine. See the section on "EXAMPLE" for details. EXAMPLE # Controller: (MVC's C) my $query = CGI->new; my $template = Template->new; my $pager = Film->pager(20, $query->param('page') || 1); my $movies = $pager->retrieve_all; $template->process($input, { movies => $movies, pager => $pager, }); # View: (MVC's V) Matched [% pager.total_entries %] items. [% WHILE (movie = movies.next) %] Title: [% movie.title | html %] [% END %] ### navigation like: [1] [2] [3] [% FOREACH num = [pager.first_page .. pager.last_page] %] [% IF num == pager.current_page %][[% num %]] [% ELSE %][[% num %]][% END %] [% END %] ### navigation like: prev 20 | next 20 [% IF pager.previous_page %] prev [% pager.entries_per_page %] | [% END %] [% IF pager.next_page %] next [% pager.entries_per_page %] [% END %] NOTE / TODO This modules internally retrieves itertors, then creates "Data::Page" object for paging utility. Using SQL clauses "LIMIT" and/or "OFFSET" with "DBIx::Pager" might be more memory efficient. AUTHOR Tatsuhiko Miyagawa Original idea by Tomohiro Ikebe This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. SEE ALSO the Class::DBI manpage, the Data::Page manpage Class-DBI-Pager-0.08/Makefile.PL0000644000175000017500000000042010303520427017520 0ustar miyagawamiyagawa00000000000000use ExtUtils::MakeMaker; WriteMakefile( 'NAME' => 'Class::DBI::Pager', 'VERSION_FROM' => 'lib/Class/DBI/Pager.pm', # finds $VERSION 'PREREQ_PM' => { 'Test::More' => 0.32, 'Class::DBI' => 0.90, 'Data::Page' => 0.13, 'Exporter::Lite' => 0.01, }, );