[Koha-patches] [PATCH] Modules for caching - C4::Cache is the base class, C4::Cache::Memcached and C4::Cache::FastMemcached are subclasses

Chris Cormack chris at bigballofwax.co.nz
Wed Aug 26 09:07:50 CEST 2009


---
 C4/Cache.pm               |   81 ++++++++++++++++++++++++++++++++++++++
 C4/Cache/FastMemcached.pm |   95 +++++++++++++++++++++++++++++++++++++++++++++
 C4/Cache/Memcached.pm     |   76 ++++++++++++++++++++++++++++++++++++
 3 files changed, 252 insertions(+), 0 deletions(-)
 create mode 100644 C4/Cache.pm
 create mode 100644 C4/Cache/FastMemcached.pm
 create mode 100644 C4/Cache/Memcached.pm

diff --git a/C4/Cache.pm b/C4/Cache.pm
new file mode 100644
index 0000000..6d55b25
--- /dev/null
+++ b/C4/Cache.pm
@@ -0,0 +1,81 @@
+package C4::Cache;
+
+# Copyright 2009 Chris Cormack and The Koha Dev Team
+#
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+# Suite 330, Boston, MA  02111-1307 USA
+
+=head1 NAME
+
+    C4::Cache - Handling caching of html and Objects for Koha
+
+=head1 SYNOPSIS
+
+  use C4::Cache (cache_type => $cache_type, %params );
+
+
+=head1 DESCRIPTION
+
+  Base class for C4::Cache::X. Subclasses need to provide the following methods
+
+  B<_cache_handle  ($params_hr)> - cache handle creator                         
+  B<set_in_cache   ($key, $value, $expiry)>                                     
+  B<get_from_cache ($key)>                                                      
+  B<clear_from_cache ($key)>                                                    
+  B<flush_all      ()>  
+
+=head1 FUNCTIONS
+
+=cut
+
+use strict;
+use warnings;
+use Carp;
+
+use base qw(Class::Accessor);
+
+use C4::Cache::Memcached;
+use C4::Cache::FastMemcached;
+
+__PACKAGE__->mk_ro_accessors( qw( cache ) );
+
+sub new {
+    my $class = shift;                                                          
+    my %param = @_;                                                             
+    
+    my $cache_type = $param{cache_type} || 'memcached';
+    my $subclass = __PACKAGE__."::".ucfirst($cache_type);
+    my $cache    = $subclass->_cache_handle(\%param)
+      or croak "Cannot create cache handle for '$cache_type'";
+    return bless $class->SUPER::new({cache => $cache}), $subclass;              
+}
+
+=head2 EXPORT
+
+  None by default.
+
+=head1 SEE ALSO
+  
+  C4::Cache::Memcached
+
+=head1 AUTHOR
+
+Chris Cormack, E<lt>chris at bigballofwax.co.nzE<gt>
+
+=cut
+
+1;
+
+__END__
diff --git a/C4/Cache/FastMemcached.pm b/C4/Cache/FastMemcached.pm
new file mode 100644
index 0000000..d0a0fde
--- /dev/null
+++ b/C4/Cache/FastMemcached.pm
@@ -0,0 +1,95 @@
+package Koha::Cache::FastMemcached;
+
+# Copyright 2009 Chris Cormack and The Koha Dev Team                                                                                           
+#                                                                                                                                              
+# This file is part of Koha.                                                                                                                   
+#                                                                                                                                              
+# Koha is free software; you can redistribute it and/or modify it under the                                                                    
+# terms of the GNU General Public License as published by the Free Software                                                                    
+# Foundation; either version 2 of the License, or (at your option) any later                                                                   
+# version.                                                                                                                                     
+#                                                                                                                                              
+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY                                                                      
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR                                                                
+# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.                                                                  
+#                                                                                                                                              
+# You should have received a copy of the GNU General Public License along with                                                                 
+# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,                                                                  
+# Suite 330, Boston, MA  02111-1307 USA    
+
+use strict;
+use warnings;
+use Carp;
+
+use Cache::Memcached::Fast;
+use IO::Compress::Gzip;
+use IO::Uncompress::Gunzip;
+use Storable;
+
+use base qw(C4::Cache);
+
+sub _cache_handle {
+    my $class  = shift;
+    my $params = shift;
+
+    my @servers = split /,/, $params->{'cache_servers'};
+
+    return Cache::Memcached::Fast->new(
+        {
+            servers            => \@servers,
+            namespace          => $params->{'namespace'} || 'KOHA',
+            connect_timeout    => $params->{'connect_timeout'} || 2,
+            io_timeout         => $params->{'io_timeout'} || 2,
+            close_on_error     => 1,
+            compress_threshold => 100_000,
+            compress_ratio     => 0.9,
+            compress_methods =>
+              [ \&IO::Compress::Gzip::gzip, \&IO::Uncompress::Gunzip::gunzip ],
+            max_failures      => 3,
+            failure_timeout   => 2,
+            ketama_points     => 150,
+            nowait            => 1,
+            hash_namespace    => 1,
+            serialize_methods => [ \&Storable::freeze, \&Storable::thaw ],
+            utf8              => 1,
+        }
+    );
+}
+
+sub set_in_cache {
+    my ( $self, $key, $value, $expiry ) = @_;
+    croak "No key" unless $key;
+
+    if ( defined $expiry ) {
+        return $self->cache->set( $key, $value, $expiry );
+    }
+    else {
+        return $self->cache->set( $key, $value );
+    }
+}
+
+sub get_from_cache {
+    my ( $self, $key ) = @_;
+    croak "No key" unless $key;
+    return $self->cache->get($key);
+}
+
+sub clear_from_cache {
+    my ( $self, $key ) = @_;
+    croak "No key" unless $key;
+    return $self->cache->delete($key);
+}
+
+sub flush_all {
+    my $self = shift;
+    return $self->cache->flush_all;
+}
+
+1;
+__END__                                                                         
+                                                                                  
+=head1 NAME                                                                     
+                                                                                
+  C4::Cache::FastMemcached - memcached::fast subclass of C4::Cache                
+                                                                                  
+=cut
diff --git a/C4/Cache/Memcached.pm b/C4/Cache/Memcached.pm
new file mode 100644
index 0000000..67ee420
--- /dev/null
+++ b/C4/Cache/Memcached.pm
@@ -0,0 +1,76 @@
+package C4::Cache::Memcached;
+
+# Copyright 2009 Chris Cormack and The Koha Dev Team                                                                                           
+#                                                                                                                                              
+# This file is part of Koha.                                                                                                                   
+#                                                                                                                                              
+# Koha is free software; you can redistribute it and/or modify it under the                                                                    
+# terms of the GNU General Public License as published by the Free Software                                                                    
+# Foundation; either version 2 of the License, or (at your option) any later                                                                   
+# version.                                                                                                                                     
+#                                                                                                                                              
+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY                                                                      
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR                                                                
+# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.                                                                  
+#                                                                                                                                              
+# You should have received a copy of the GNU General Public License along with                                                                 
+# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,                                                                  
+# Suite 330, Boston, MA  02111-1307 USA    
+
+use strict;
+use warnings;
+use Carp;
+
+use Cache::Memcached;
+
+use base qw(C4::Cache);
+
+sub _cache_handle {
+    my $class  = shift;
+    my $params = shift;
+
+    my @servers = split /,/, $params->{'cache_servers'};
+
+    return Cache::Memcached->new(
+        servers   => \@servers,
+        namespace => $params->{'namespace'} || 'KOHA',
+    );
+}
+
+sub set_in_cache {
+    my ( $self, $key, $value, $expiry ) = @_;
+    croak "No key" unless $key;
+
+    if ( defined $expiry ) {
+        return $self->cache->set( $key, $value, $expiry );
+    }
+    else {
+        return $self->cache->set( $key, $value );
+    }
+}
+
+sub get_from_cache {
+    my ( $self, $key ) = @_;
+    croak "No key" unless $key;
+    return $self->cache->get($key);
+}
+
+sub clear_from_cache {
+    my ( $self, $key ) = @_;
+    croak "No key" unless $key;
+    return $self->cache->delete($key);
+}
+
+sub flush_all {
+    my $self = shift;
+    return $self->cache->flush_all;
+}
+
+1;
+__END__                                                                         
+                                                                                  
+=head1 NAME                                                                     
+                                                                                
+  C4::Cache::Memcached - memcached subclass of C4::Cache                
+                                                                                  
+=cut
-- 
1.6.0.4




More information about the Koha-patches mailing list