Cache-BerkeleyDB

 view release on metacpan or  search on metacpan

lib/Cache/BerkeleyDB_Backend.pm  view on Meta::CPAN

	  -Env      => $env, )
		or die "Can't tie to $root/$namespace.bdbcache";
	$Caches->{$namespace} = {};
	$Caches->{$namespace}->{obj}       = $obj;
	$Caches->{$namespace}->{filename}  = $fn;
	$Caches->{$namespace}->{namespace} = $namespace;
	return $Caches->{$namespace};
}

sub _canonic_namespace {
	my $namespace = shift;
	$namespace =~ s/[^A-Za-z0-9\-_\+]/+/g;
	$namespace = substr($namespace,0,56) if length($namespace)>56;
	return $namespace;
}

sub _retie {
	my ($self, $namespace) = @_;
	$namespace ||= 'Default';
	return if $namespace eq $self->{_namespace};
	my $obj = _initial_tie($self->{_cache_root},$namespace);
	$self->{_filename} = $obj->{filename};
	$self->{_namespace} = $namespace;
}

sub get_root {
	my $self = shift;
	return $self->{_cache_root};
}

sub set_root {
	my ($self,$root) = @_;
	$root ||= '/tmp';
	return $root if $self->{_cache_root} eq $root;
	$self->{_cache_root} = $root;
	$Caches = {};
	my $obj = _initial_tie($root,$self->{_namespace});
	$self->{_filename} = $obj->{filename};
	return $root;
}

sub delete_key {
	my ($self, $namespace, $key) = @_;
	$self->_retie($namespace);
	$self->_get_obj->db_del($key);
}

sub delete_namespace {
	my $self = shift;
	my $count = 0;
	$self->_get_obj->truncate($count);
	return $count;
}

sub get_keys {
	my ($self, $namespace) = @_;
	$self->_retie($namespace);
	my $db = $Caches->{ $self->{_namespace} }->{obj};
	my ($k,$v) = ('','');
	my @keys = ();
	my $cursor = $db->db_cursor();
	while ($cursor->c_get($k, $v, DB_NEXT) == 0) {
		push @keys, $k;
	}
	undef $cursor;
	return @keys;
}

sub get_namespaces {
	my $self = shift;
	opendir DIR, $self->{_cache_root} or return;
	my @ns = ();
	while (my $fn = readdir DIR) {
		push @ns, $fn if $fn =~ s/\.bdbcache$//;
	}
	closedir DIR;
	return @ns;
}

sub get_size {
	my ($self, $namespace, $key) = @_;
	$self->_retie($namespace);
	my $val;
	$self->_get_obj->db_get( $key, $val);
	return defined $val ? length($val) : undef;
}

sub _get {
	my ($self,$key) = @_;
	my $val;
	my $rc = $self->_get_obj->db_get( $key, $val);
	my $ret = eval { thaw($val) };
	return $ret;
}

sub _get_obj {
	my $self = shift;
	return $Caches->{ $self->{_namespace} }->{obj};
}

sub _set {
	my ($self,$key,$val) = @_;
	$self->_get_obj->db_put($key, freeze($val));
}

sub restore {
	my ($self,$namespace,$key) = @_;
	$self->_retie($namespace);
	return $self->_get($key);
}

sub store {
	my ($self,$namespace,$key,$val) = @_;
	$self->_retie($namespace);
	$self->_set($key,$val);
}


1;

__END__

=pod

=head1 NAME



( run in 2.635 seconds using v1.01-cache-2.11-cpan-cdf2f3d4e48 )