DBM-Deep
view release on metacpan or search on metacpan
lib/DBM/Deep.pm view on Meta::CPAN
require DBM::Deep::Hash;
tie %$self, $class, %$args;
}
return bless $self, $class;
}
# This initializer is called from the various TIE* methods. new() calls tie(),
# which allows for a single point of entry.
sub _init {
my $class = shift;
my ($args) = @_;
# locking implicitly enables autoflush
if ($args->{locking}) { $args->{autoflush} = 1; }
# These are the defaults to be optionally overridden below
my $self = bless {
type => TYPE_HASH,
base_offset => undef,
staleness => undef,
engine => undef,
}, $class;
unless ( exists $args->{engine} ) {
my $class =
exists $args->{dbi} ? 'DBM::Deep::Engine::DBI' :
exists $args->{_test} ? 'DBM::Deep::Engine::Test' :
'DBM::Deep::Engine::File' ;
eval "use $class"; die $@ if $@;
$args->{engine} = $class->new({
%{$args},
obj => $self,
});
}
# Grab the parameters we want to use
foreach my $param ( keys %$self ) {
next unless exists $args->{$param};
$self->{$param} = $args->{$param};
}
eval {
local $SIG{'__DIE__'};
$self->lock_exclusive;
$self->_engine->setup( $self );
$self->unlock;
}; if ( $@ ) {
my $e = $@;
eval { local $SIG{'__DIE__'}; $self->unlock; };
die $e;
}
if( $self->{engine}->{external_refs}
and my $sector = $self->{engine}->load_sector( $self->{base_offset} )
) {
$sector->increment_refcount;
Scalar::Util::weaken( my $feeble_ref = $self );
$obj_cache{ $self } = \$feeble_ref;
# Make sure this cache is not a memory hog
if(!HAVE_HUFH) {
for(keys %obj_cache) {
delete $obj_cache{$_} if not ${$obj_cache{$_}};
}
}
}
return $self;
}
sub TIEHASH {
shift;
require DBM::Deep::Hash;
return DBM::Deep::Hash->TIEHASH( @_ );
}
sub TIEARRAY {
shift;
require DBM::Deep::Array;
return DBM::Deep::Array->TIEARRAY( @_ );
}
sub lock_exclusive {
my $self = shift->_get_self;
return $self->_engine->lock_exclusive( $self, @_ );
}
*lock = \&lock_exclusive;
sub lock_shared {
my $self = shift->_get_self;
# cluck() the problem with cached File objects.
unless ( $self->_engine ) {
require Carp;
require Data::Dumper;
Carp::cluck( Data::Dumper->Dump( [$self], ['self'] ) );
}
return $self->_engine->lock_shared( $self, @_ );
}
sub unlock {
my $self = shift->_get_self;
return $self->_engine->unlock( $self, @_ );
}
sub _copy_value {
my $self = shift->_get_self;
my ($spot, $value) = @_;
if ( !ref $value ) {
${$spot} = $value;
}
else {
my $r = Scalar::Util::reftype( $value );
my $tied;
if ( $r eq 'ARRAY' ) {
$tied = tied(@$value);
}
( run in 1.883 second using v1.01-cache-2.11-cpan-39bf76dae61 )