/usr/local/CPAN/Brackup/Brackup/Dict/DBM.pm
package Brackup::Dict::DBM;
use strict;
use warnings;
BEGIN { @AnyDBM_File::ISA = qw(DB_File GDBM_File NDBM_File SDBM_File) }
use AnyDBM_File;
use Fcntl qw(O_CREAT O_RDWR);
sub new {
my ($class, %opts) = @_;
my $self = bless {
file => $opts{file},
data => {},
}, $class;
my %dbm;
tie %dbm, 'AnyDBM_File', $self->{file}, O_CREAT | O_RDWR, 0644 or
die "Failed to bind to DBM digest cache at $self->{file}: $!";
$self->{dbm} = \%dbm;
return $self;
}
sub get {
my ($self, $key) = @_;
return $self->{dbm}->{$key};
}
sub set {
my ($self, $key, $val) = @_;
$self->{dbm}->{$key} = $val;
return 1;
}
# Iterator interface, returning ($key, $value), and () on eod
sub each {
my $self = shift;
$self->{keys} = [ keys %{$self->{dbm}} ] unless $self->{_loaded_keys}++;
if (! @{$self->{keys}}) {
$self->{_loaded_keys} = 0;
return wantarray ? () : undef;
}
my $next = shift @{$self->{keys}};
return wantarray ? ($next, $self->{dbm}->{$next}) : $next;
}
sub delete {
my ($self, $key) = @_;
delete $self->{dbm}->{$key};
return 1;
}
sub count {
my $self = shift;
return scalar keys %{$self->{dbm}};
}
sub backing_file {
my $self = shift;
return $self->{file};
}
1;