Cache::AgainstFile::Base - base class for default backends


Cache-AgainstFile documentation Contained in the Cache-AgainstFile distribution.

Index


Code Index:

NAME

Top

Cache::AgainstFile::Base - base class for default backends

SYNOPSIS

Top

 package Cache::AgainstFile::MyBackend;

 use Cache::AgainstFile::Base;
 @ISA = qw(Cache::AgainstFile::Base);

 ...implement methods...

 1;




DESCRIPTION

Top

This provides a default implementation for purging the cache, based on a list of stale files and a hashref of access times.

Classes inheriting from this base class should provide the following public methods:

$b = new Cache::AgainstFile::MyBackend(\&loader, \%options)

This should call the base class constructor.

$data = $b->get($filename, @opts)

Fetch an item from the cache. @opts should be passed after the filename to the loader coderef.

$n = $b->count()

Number of items in the cache

$bytes = $b->size()

Total size of the cache in bytes

They should also provide the following protected methods which are used to support purge():

$b->_remove(\@filenames)

Remove a number of items from the cache

$hashref = $b->_accessed()

A hashref of filename => access time

@filenames = $b->_stale()

A list of cache items which are stale with respect to their original files

OPTIONS

Top

The implementation of purge() supports the options:

NoStat
MaxItems
MaxATime

VERSION

Top

$Revision: 1.8 $ on $Date: 2005/06/03 14:29:55 $ by $Author: johna $

AUTHOR

Top

John Alden <cpan _at_ bbc _dot_ co _dot_ uk>

COPYRIGHT

Top


Cache-AgainstFile documentation Contained in the Cache-AgainstFile distribution.

###############################################################################
# Purpose : Base class for default Cache::AgainstFile implementations
# Author  : John Alden
# Created : 24th April 2004
# CVS     : $Id: Base.pm,v 1.8 2005/06/03 14:29:55 johna Exp $
###############################################################################

package Cache::AgainstFile::Base;

use strict;
use vars qw($VERSION);
$VERSION = sprintf"%d.%03d", q$Revision: 1.8 $ =~ /: (\d+)\.(\d+)/;

sub new {
	my ($class, $loader, $options) = @_;
	
	my $self = {
		'loader' => $loader,
		'options' => $options,
	};

	TRACE("Cache: Stat disabled") if($self->{options}->{NoStat});
	return bless $self, $class;
}

sub purge {
	my($self, $all) = @_;
	my @keys;
	my $accessed = $self->_accessed();
	if($all)
	{
		TRACE("Purging all keys in cache");
		@keys = keys %$accessed;
	}
	else
	{
		#Identify items to delete
		if($self->{options}->{NoStat})
		{
			TRACE("purging stale items");
			push @keys, $self->_stale(); #Stale items
		}
		if(defined $self->{options}->{MaxATime})
		{
			my $max = $self->{options}->{MaxATime}; #seconds
			TRACE("purging files older than $max");
			DUMP($accessed);
			push @keys, grep {time - $accessed->{$_} > $max} keys %$accessed; #Inactive items
		}
		if($self->{options}->{MaxItems})
		{
			my $max = $self->{options}->{MaxItems};
			TRACE("keeping $max youngest files");
			my @agelist = sort {$accessed->{$a} <=> $accessed->{$b}} keys %$accessed; #sort by age
			while(scalar(@agelist) > $max)
			{
				push @keys, shift @agelist; #keys of the oldest ones
			}
		}
		
		#Remove duplicates
		my %unique = map {$_ => undef} @keys;
		@keys = keys %unique;
	}
	DUMP("keys to purge", \@keys);
	$self->_remove(\@keys) if(@keys);
}

sub clear {
	my $self = shift;
	return $self->purge(1);
}

sub TRACE {}
sub DUMP {}