use Data::Dump qw/dump/;
use YAML qw/LoadFile DumpFile/;
+use Hash::Merge qw/merge/;
+use Carp qw/confess/;
=head1 NAME
=head2 open
+ $store->open({
+ path => 'var/',
+ debug => 1,
+ clean => 1,
+ });
+
=cut
-my $dir = 'yaml';
+my $path;
-my $debug = 1;
+my $debug = 0;
sub open {
my $self = shift;
- warn "open ",dump( @_ );
+ my $args = shift;
+
+ $debug = $args->{debug};
+ $path = $args->{path} || confess "no path?";
+
+ warn "open ",dump( $args ) if $debug;
+
+ $path = "$path/yaml";
- if ( ! -e $dir ) {
- mkdir $dir || die "can't create $dir: $!";
- warn "created $dir directory\n";
+ if ( ! -e $path ) {
+ mkdir $path || die "can't create $path: $!";
+ warn "created $path directory\n" if $debug;
+ } elsif ( $args->{clean} ) {
+ warn "removed old $path\n" if $debug;
+ foreach my $uid ( $self->all_uids ) {
+ my $file = "$path/$uid.yml";
+ unlink $file || die "can't remove $file: $!";
+ }
}
+
}
=head2 update_uid_state
sub update_uid_state {
my ( $self, $uid, $state ) = @_;
- my $file = "$dir/$uid.yml";
+ my $file = "$path/$uid.yml";
+
+ my $old_state = $self->get_state( $uid );
+
+ my $combined = merge( $state, $old_state );
+
+# warn "## ",dump( $old_state, $state, $combined );
- DumpFile( $file, $state ) || die "can't write $file: $!";
+ DumpFile( $file, $combined ) || die "can't write $file: $!";
}
sub get_state {
my ( $self, $uid ) = @_;
- my $file = "$dir/$uid.yml";
+ my $file = "$path/$uid.yml";
if ( -e $file ) {
return LoadFile( $file );
sub all_uids {
my $self = shift;
- opendir(my $d, $dir) || die "can't opendir $dir: $!";
- my @uids = grep { /\.yml$/ && -f "$dir/$_" } readdir($d);
+ opendir(my $d, $path) || die "can't opendir $path: $!";
+ my @uids = grep { /\.yml$/ && -f "$path/$_" } readdir($d);
closedir $d;
- return map { s/\.yml$// } @uids;
+ return map { my $l = $_; $l =~ s/\.yml$//; $l } @uids;
}
1;