Data-SimpleKV
view release on metacpan or search on metacpan
lib/Data/SimpleKV.pm view on Meta::CPAN
eval { decode_utf8($_) } || $_
} keys %{$self->{cache}};
}
=head2 clear()
Clear all data from memory cache.
=cut
sub clear {
my ($self) = @_;
$self->{cache} = {};
$self->{dirty} = 1;
return 1;
}
# ç§ææ¹æ³ï¼å è½½æ°æ®
sub _load_data {
my ($self) = @_;
return unless -f $self->{data_file};
eval {
open my $fh, '<', $self->{data_file} or die "Cannot open data file: $!";
my $data = retrieve_fd($fh);
$self->{cache} = $data || {};
close $fh;
};
if ($@) {
warn "Failed to load data: $@";
$self->{cache} = {};
}
}
# ç§ææ¹æ³ï¼å¸¦éä¿åæ°æ®
sub _save_with_lock {
my ($self) = @_;
eval {
# ä½¿ç¨ +> 模å¼ï¼å¦ææä»¶ä¸åå¨åå建ï¼å¦æåå¨åæªæ
open my $fh, '+>', $self->{data_file} or die "Cannot open data file: $!";
# è·åæä»é
flock($fh, LOCK_EX) or die "Cannot acquire exclusive lock: $!";
# ç¡®ä¿ä»æä»¶å¼å¤´åå
¥
seek($fh, 0, SEEK_SET);
# å卿°æ®
store_fd($self->{cache}, $fh) or die "Cannot store data: $!";
# ç¡®ä¿æ°æ®åå
¥ç£ç
$fh->flush();
close $fh or die "Cannot close data file: $!";
chmod 0644, $self->{data_file};
$self->{dirty} = 0;
};
if ($@) {
croak "Failed to save data: $@";
}
return 1;
}
# ææå½æ°ï¼èªå¨ä¿åæªä¿åçæ´æ¹
sub DESTROY {
my ($self) = @_;
if ($self->{dirty}) {
eval { $self->save() };
warn "Auto-save failed during destruction: $@" if $@;
}
}
1;
__END__
=head1 FILE STRUCTURE
The module stores data files in the following locations:
=over 4
=item * Primary location: /var/lib/simplekv/
=item * Fallback location: $HOME/.simplekv/
=item * Emergency fallback: /tmp/.simplekv/
=back
Files created:
=over 4
=item * {db_name}.db - The main data file (Storable binary format)
=back
File permissions are set to 0644 (readable by all, writable by owner).
=head1 MULTI-PROCESS SAFETY
The module uses file locking to ensure safe concurrent access:
=over 4
=item * Exclusive locks for writing during save operations
=item * Lock files prevent concurrent write operations
=back
( run in 0.957 second using v1.01-cache-2.11-cpan-140bd7fdf52 )