switch to MX::Traits, document attributes
[catagits/Catalyst-Model-DBIC-Schema.git] / lib / Catalyst / Model / DBIC / Schema / Trait / Caching.pm
CommitLineData
c34bcab6 1package Catalyst::Model::DBIC::Schema::Trait::Caching;
fdd5f3df 2
3use Moose::Role;
bd309c0c 4use Carp::Clan '^Catalyst::Model::DBIC::Schema';
61ed82a5 5use Catalyst::Model::DBIC::Schema::Types 'CursorClass';
6use MooseX::Types::Moose qw/Int Str/;
fdd5f3df 7
8use namespace::clean -except => 'meta';
9
10=head1 NAME
11
c34bcab6 12Catalyst::Model::DBIC::Schema::Trait::Caching - Query caching support for
c4fee9b8 13Catalyst::Model::DBIC::Schema
fdd5f3df 14
15=head1 SYNOPSIS
16
17 __PACKAGE__->config({
c34bcab6 18 traits => ['Caching'],
61ed82a5 19 connect_info =>
20 ['dbi:mysql:db', 'user', 'pass'],
fdd5f3df 21 });
22
fdd5f3df 23 $c->model('DB::Table')->search({ foo => 'bar' }, { cache_for => 18000 });
24
25=head1 DESCRIPTION
26
27Enable caching support using L<DBIx::Class::Cursor::Cached> and
28L<Catalyst::Plugin::Cache>.
29
30In order for this to work, L<Catalyst::Plugin::Cache> must be configured and
31loaded. A possible configuration would look like this:
32
33 <Plugin::Cache>
34 <backend>
35 class Cache::FastMmap
36 unlink_on_exit 1
37 </backend>
38 </Plugin::Cache>
39
40Then in your queries, set the C<cache_for> ResultSet attribute to the number of
41seconds you want the query results to be cached for, eg.:
42
43 $c->model('DB::Table')->search({ foo => 'bar' }, { cache_for => 18000 });
44
2ff00e2b 45=head1 CONFIG PARAMETERS
fdd5f3df 46
c4fee9b8 47=head2 caching
fdd5f3df 48
49Turn caching on or off, you can use:
50
51 $c->model('DB')->caching(0);
52
fdd5f3df 53=cut
54
c34bcab6 55has caching => (is => 'rw', isa => Int, default => 1);
fdd5f3df 56
57after setup => sub {
58 my $self = shift;
59
61ed82a5 60 return if !$self->caching;
fdd5f3df 61
62 $self->caching(0);
63
61ed82a5 64 my $cursor_class = $self->connect_info->{cursor_class}
65 || 'DBIx::Class::Cursor::Cached';
fdd5f3df 66
61ed82a5 67 unless (eval { Class::MOP::load_class($cursor_class) }) {
68 carp "Caching disabled, cannot load cursor class"
69 . " $cursor_class: $@";
70 return;
71 }
fdd5f3df 72
61ed82a5 73 unless ($cursor_class->can('clear_cache')) {
74 carp "Caching disabled, cursor_class $cursor_class does not"
75 . " support it.";
76 return;
fdd5f3df 77 }
78
61ed82a5 79 $self->connect_info->{cursor_class} = $cursor_class;
fdd5f3df 80 $self->caching(1);
81};
82
83before ACCEPT_CONTEXT => sub {
84 my ($self, $c) = @_;
85
86 return $self unless
87 $self->caching;
61ed82a5 88
fdd5f3df 89 unless ($c->can('cache') && ref $c->cache) {
90 $c->log->warn("DBIx::Class cursor caching disabled, you don't seem to"
91 . " have a working Cache plugin.");
92 $self->caching(0);
93 $self->_reset_cursor_class;
94 return $self;
95 }
96
97 if (ref $self->schema->default_resultset_attributes) {
98 $self->schema->default_resultset_attributes->{cache_object} =
99 $c->cache;
100 } else {
101 $self->schema->default_resultset_attributes({
102 cache_object => $c->cache
103 });
104 }
105};
106
fdd5f3df 107=head1 SEE ALSO
108
109L<Catalyst::Model::DBIC::Schema>, L<DBIx::Class>, L<Catalyst::Plugin::Cache>,
110L<Cache::FastMmap>, L<DBIx::Class::Cursor::Cached>
111
112=head1 AUTHOR
113
c7d7b849 114Rafael Kitover, C<rkitover at cpan.org>
fdd5f3df 115
116=head1 COPYRIGHT
117
118This program is free software, you can redistribute it and/or modify it
119under the same terms as Perl itself.
120
121=cut
122
1231;