DataStore-CAS-FS
view release on metacpan or search on metacpan
lib/DataStore/CAS/FS.pm view on Meta::CPAN
if (!defined $subnode && (defined $nodes->[-1]{dir} || defined $ent->ref)) {
# load it if it isn't cached
($nodes->[-1]{dir} ||= $self->get_dir($ent->ref))
or return 'Failed to open directory "'.$ent->name.' ('.$ent->ref.')"';
# See if the directory contains this entry
if (defined (my $subent= $nodes->[-1]{dir}->get_entry($name))) {
$subnode= { dirent => $subent };
my $key= $self->case_insensitive? uc $name : $name;
# Weak reference, until _apply_overrides is called.
Scalar::Util::weaken( $nodes->[-1]{subtree}{$key}= $subnode );
}
}
# If we haven't found one, or if it is 0 (deleted), either create or die.
if (!$subnode) {
# If we're supposed to create virtual entries, do so
if ($flags->{mkdir} or $flags->{partial}) {
$subnode= {
invalid => 1, # not valid until _apply_overrides
dirent => DataStore::CAS::FS::DirEnt->new(
lib/DataStore/CAS/FS.pm view on Meta::CPAN
sub get {
return $_[0]{_by_hash}{$_[1]};
}
sub put {
my ($self, $dir)= @_;
# Hold onto a strong reference for a while.
$self->{_recent}[ $self->{_recent_idx}++ ]= $dir;
$self->{_recent_idx}= 0 if $self->{_recent_idx} > @{$self->{_recent}};
# Index it using a weak reference.
Scalar::Util::weaken( $self->{_by_hash}{$dir->hash}= $dir );
# Now, a nifty hack: we attach an object to watch for the destriction of the
# directory. Lazy references will get rid of the dir object, but this cleans
# up our _by_hash index.
$dir->{'#DataStore::CAS::FS::DirCacheCleanup'}=
bless [ $self->{_by_hash}, $dir->hash ], 'DataStore::CAS::FS::DirCacheCleanup';
}
package DataStore::CAS::FS::DirCacheCleanup;
use strict;
use warnings;
( run in 0.270 second using v1.01-cache-2.11-cpan-65fba6d93b7 )