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 )