App-MBUtiny
view release on metacpan or search on metacpan
lib/App/MBUtiny/Storage/Local.pm view on Meta::CPAN
}
}
$self->{test}->{$sign} = [@test];
return 1;
}
sub put {
my $self = shift;
my %params = @_; $self->maybe::next::method(%params);
return $self->storage_status(STORAGE_SIGN, -1) if $self->storage_status(STORAGE_SIGN) <= 0; # SKIP and set SKIP
my $status = 1;
my $name = $params{name};
my $file = $params{file};
my $local_nodes = $self->{local_nodes};
foreach my $local_node (@$local_nodes) {
my $ostat = 1;
my $localdirs = array($local_node, 'localdir') || [];
my @dirs = ();
foreach my $dir (@$localdirs) {
my $dst = File::Spec->catfile($dir, $name);
if (copy($file, $dst)) {
$params{size} ||= 0;
my $size = filesize($file) // 0;
if ($size == $params{size}) {
push @dirs, $dir;
} else {
$self->error(sprintf("Copy \"%s\" to \"%s\" failed: size is different", $name, $dir, $!));
$ostat = 0;
$status = 0;
}
} else {
$self->error(sprintf("Copy \"%s\" to \"%s\" failed: %s", $name, $dir, $!));
$ostat = 0;
$status = 0;
};
}
my $storages_comment = @dirs ? join("; ", @dirs) : "No real local storages";
my $comment = join("\n", grep {$_} ($storages_comment, value($local_node, 'comment')));
$self->fixup("put", $ostat, $comment) if value($local_node, 'fixup'); # Fixup!
}
$self->storage_status(STORAGE_SIGN, 0) unless $status;
}
sub get {
my $self = shift;
my %params = @_;
if ($self->storage_status(STORAGE_SIGN) <= 0) { # SKIP and set SKIP
$self->maybe::next::method(%params);
return $self->storage_status(STORAGE_SIGN, -1);
}
my $name = $params{name}; # archive name
my $file = $params{file}; # destination archive file path
foreach my $local_node ($self->local_storages) {
my $localdirs = array($local_node, 'localdir') || [];
foreach my $dir (@$localdirs) {
my $src = File::Spec->catfile($dir, $name);
my $src_size = filesize($src) // 0;
if (copy($src, $file)) {
my $dst_size = filesize($file) // 0;
if ($src_size == $dst_size) {
unless ($self->validate($file)) { # FAIL validation!
$self->error(sprintf("Local storage dir %s failed: file %s is not valid!", $dir, $file));
next;
}
return $self->storage_status(STORAGE_SIGN, 1); # Done!
} else {
$self->error(sprintf("Copy \"%s\" to \"%s\" failed: size is different", $src, $file, $!));
}
} else {
$self->error(sprintf("Copy \"%s\" to \"%s\" failed: %s", $src, $file, $!));
};
}
}
$self->storage_status(STORAGE_SIGN, 0);
$self->maybe::next::method(%params);
}
sub del {
my $self = shift;
my $name = shift;
$self->maybe::next::method($name);
return $self->storage_status(STORAGE_SIGN, -1) if $self->storage_status(STORAGE_SIGN) <= 0; # SKIP and set SKIP
my $status = 1;
my $local_nodes = $self->{local_nodes};
foreach my $local_node (@$local_nodes) {
my $localdirs = array($local_node, 'localdir') || [];
my @dirs = ();
foreach my $dir (@$localdirs) {
my $file = File::Spec->catfile($dir, $name);
next unless -e $file;
if (unlink($file)) {
if (-e $file) {
$self->error(sprintf("Unlink \"%s\" failed", $file));
$status = 0;
}
} else {
$self->error(sprintf("Unlink \"%s\" failed: %s", $file, $!));
$status = 0;
}
}
$self->fixup("del", $name) if value($local_node, 'fixup'); # Fixup!
}
$self->storage_status(STORAGE_SIGN, 0) unless $status;
}
sub list {
my $self = shift;
my %params = @_; $self->maybe::next::method(%params);
return $self->storage_status(STORAGE_SIGN, -1) if $self->storage_status(STORAGE_SIGN) <= 0; # SKIP and set SKIP
my $sign = STORAGE_SIGN;
my $dirs = $self->{local_dirs};
my @list = ();
foreach my $dir (@$dirs) {
if (-e $dir) {
my $l = getlist($dir) || [];
push @list, @$l;
}
}
$self->{list}->{$sign} = [uniq(@list)];
return 1;
}
1;
( run in 0.546 second using v1.01-cache-2.11-cpan-39bf76dae61 )