package MLDBM::Easy; use warnings; @ISA = 'MLDBM'; $VERSION = '0.01'; my %cache; sub import { my $pkg = shift; require MLDBM; MLDBM->import(@_); } sub FETCH { my ($self, $key) = @_; my $ret = $self->{SR}->deserialize($self->{DB}->FETCH($key)); return $cache{$self,$key} if $cache{$self,$key}; if (ref($ret) eq "HASH") { tie my(%h), 'MLDBM::Easy::Hash', $self, $key, $ret; return $cache{$self,$key} = \%h; } if (ref($ret) eq "ARRAY") { tie my(@a), 'MLDBM::Easy::Array', $self, $key, $ret; return $cache{$self,$key} = \@a; } if (ref($ret) eq "SCALAR") { tie my($s), 'MLDBM::Easy::Scalar', $self, $key, $ret; return $cache{$self,$key} = \$s; } } sub STORE { my ($self, $key, $value) = @_; $value = $self->{SR}->serialize($cache{$self,$key}); $self->{DB}->STORE($key, $value); } package MLDBM::Easy::Hash; use Tie::Hash; @ISA = 'Tie::StdHash'; sub TIEHASH { my ($class, $mldbm, $key, $href) = @_; my $self = bless $href, $class; $cache{$self} = [$mldbm, $key]; return $self; } sub STORE { my ($self, $key, $value) = @_; $self->{$key} = $value; $cache{$self}->[0]->STORE($cache{$self}->[1], $self); } package MLDBM::Easy::Array; use Tie::Array; @ISA = 'Tie::StdArray'; sub TIEARRAY { my ($class, $mldbm, $key, $href) = @_; my $self = bless $href, $class; $cache{$self} = [$mldbm, $key]; return $self; } sub STORE { my ($self, $idx, $value) = @_; $self->[$idx] = $value; $cache{$self}->[0]->STORE($cache{$self}->[1], $self); } package MLDBM::Easy::Scalar; use Tie::Scalar; @ISA = 'Tie::StdScalar'; sub TIESCALAR { my ($class, $mldbm, $key, $sref) = @_; my $self = bless $sref, $class; $cache{$self} = [$mldbm, $key]; return $self; } sub STORE { my ($self, $value) = @_; $$self = $value; $cache{$self}->[0]->STORE($cache{$self}->[1], $self); } 1; __END__ =head1 NAME MLDBM::Easy - Provides NON-piecemeal access to MLDBM files =head1 SYNOPSIS use MLDBM::Easy; # as a drop-in for MLDBM =head1 DESCRIPTION This module allows you to work with multi-dimensional databases, just like L, but it does work behind the scenes to allow you to treat the multi-dimensional database like a normal data structure. Basically, you don't need to use the piecemeal access that L required: # old and busted my $record = $db{some_key}; $record->[2] += 100; $db{some_key} = $record; # new hotness $db{some_key}[2] += 100; Of course, with this convenience comes a loss of speed. Deal with it. =head1 SEE ALSO Check L for all other documentation. =head1 AUTHOR Jeff C Pinyan, Ejaphy@pobox.comE =head1 COPYRIGHT AND LICENSE Copyright (C) 2004 by japhy This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.3 or, at your option, any later version of Perl 5 you may have available. =cut