move list_files to perl worker
[cloudstore.git] / lib / CloudStore / API.pm
index 197e488..c87cb03 100644 (file)
@@ -303,6 +303,52 @@ sub file_size {
        return -s $full_path;
 }
 
+sub list_files {
+       my ( $self, $user, $path ) = @_;
+
+       $user =~ s{/+$}{} && warn "cleanup list_files arg [$user]";
+
+       $user = $self->user_info($user) unless ref $user eq 'HASH';
+
+       my $files = $user->{dir} . '/.meta/files';
+       if ( -e $files && -s $files > 0) {
+               local $/ = undef;
+               open(my $fh, '<', $files);
+               my $list = <$fh>;
+               close($fh);
+               warn "# list_files $user->{login} cached ", length($list), " bytes";
+               return $list;
+       }
+
+       my $path = $user->{dir};
+       open(my $pipe, '-|', qq|find -L $path -printf "%y %s %p\n"|);
+       open(my $fh, '>', "$files.new");
+       my $total_usage = 0;
+       my $list_txt;
+       while(<$pipe>) {
+               chomp;
+               my ( $type, $size, $name ) = split(/\s/, $_);
+               $name =~ s{$path}{./};
+               $name =~ s{//+}{/}g;
+               my $line = "$type $size $name\n";
+               print $fh $line;
+               $list_txt .= $line;
+               $total_usage += $size;
+       }
+       close($pipe);
+       close($fh);
+       rename "$files.new", $files;
+
+       open(my $usage, '>', "$files.usage.new");
+       print $usage $total_usage;
+       close($usage);
+       rename "$files.usage.new", "$files.usage";
+
+       warn "# list_files $path usage: $total_usage\n";
+
+       return $list_txt;
+}
+
 sub refresh_file_list {
        my ( $self, $user ) = @_;
        $user = $self->user_info($user) unless ref $user eq 'HASH';
@@ -313,6 +359,8 @@ sub refresh_file_list {
        } else {
                warn "## refresh_file_list $full_path missing";
        }
+
+       unlink "$full_path.usage" if -e "$full_path.usage";
 }
 
 1;