App-SimpleBackuper

 view release on metacpan or  search on metacpan

lib/App/SimpleBackuper/_BlocksInfo.pm  view on Meta::CPAN

package App::SimpleBackuper;

use strict;
use warnings;

sub _BlocksInfo($$;$$$$);
sub _BlocksInfo($$;$$$$) {
	my($options, $state, $block_info, $parent_id, $path, $priority) = @_;
	
	$block_info //= {};
	$parent_id //= 0;
	$path //= '/';
	$priority //= 0;
	
	my($oldest_backup_id) = $state->{db}->{backups}->unpack($state->{db}->{backups}->[0])->{id};
	
	my $subfiles = $state->{db}->{files}->find_all({parent_id => $parent_id});
	foreach my $file ( @$subfiles ) {
		
		my $full_path = ($path eq '/' ?  $path : "$path/").$file->{name};
		my $prio = $priority;
		while(my($mask, $p) = each %{ $options->{files} }) {
			$prio = $p if match_glob( $mask, $full_path );
		}
		
		_BlocksInfo($options, $state, $block_info, $file->{id}, $full_path, $prio);
		
		my %file_added2block;
		foreach my $version ( @{ $file->{versions} } ) {
			next if ! $version->{block_id};
			
			my $backup_id_score = $version->{backup_id_max} - $oldest_backup_id + 1;
			
			$block_info->{ $version->{block_id} } ||= [0, 0, [], 0, 0];
			if($block_info->{ $version->{block_id} }->[0] < $backup_id_score * $prio) {
				$block_info->{ $version->{block_id} }->[0] = $backup_id_score * $prio;
				$block_info->{ $version->{block_id} }->[3] = $backup_id_score;
				$block_info->{ $version->{block_id} }->[4] = $prio;
			}
			foreach my $part (@{ $version->{parts} }) {
				$block_info->{ $version->{block_id} }->[1] += $part->{size};
			}
			if(! $file_added2block{ $version->{block_id} }) {
				push @{ $block_info->{ $version->{block_id} }->[2] }, $file->{parent_id}, $file->{id}, $full_path;
			}
			
			$file_added2block{ $version->{block_id} } = 1;
		}
	}
	
	return $block_info;
}

1;



( run in 1.991 second using v1.01-cache-2.11-cpan-39bf76dae61 )