App-SimpleBackuper
view release on metacpan or search on metacpan
lib/App/SimpleBackuper/Backup.pm view on Meta::CPAN
package App::SimpleBackuper;
use strict;
use warnings;
use feature ':5.14';
use Carp;
use Try::Tiny;
use Time::HiRes qw(time);
use Const::Fast;
use App::SimpleBackuper::BackupDB;
use App::SimpleBackuper::_format;
use App::SimpleBackuper::_BlockDelete;
use App::SimpleBackuper::_BlocksInfo;
const my $SIZE_OF_TOP_FILES => 10;
const my $SAVE_DB_PERIOD => 60 * 60;
const my $PRINT_PROGRESS_PERIOD => 60;
sub _proc_uid_gid($$$) {
my($uid, $gid, $uids_gids) = @_;
my $last_uid_gid = @$uids_gids ? $uids_gids->unpack( $uids_gids->[-1] )->{id} : 0;
my $user_name = getpwuid($uid);
my($user) = grep { $_->{name} eq $user_name } map { $uids_gids->unpack($_) } @$uids_gids;
if(! $user) {
$user = {id => ++$last_uid_gid, name => $user_name};
$uids_gids->upsert({ id => $user->{id} }, $user );
#printf "new owner user added (unix uid %d, name %s, internal uid %d)\n", $uid, $user_name, $user->{id};
}
$uid = $user->{id};
my $group_name = getgrgid($gid);
my($group) = grep { $_->{name} eq $group_name } map { $uids_gids->unpack($_) } @$uids_gids;
if(! $group) {
$group = {id => ++$last_uid_gid, name => $group_name};
$uids_gids->upsert({ id => $group->{id} }, $group );
#printf "new owner group added (unix gid %d, name %s, internal gid %d)\n", $gid, $group_name, $group->{id};
}
$gid = $group->{id};
return $uid, $gid;
}
sub _get_block_to_delete {
my($state) = @_;
if(ref($state->{blocks2delete_prio2size2chunks}) eq 'HASH') {
$state->{blocks2delete_prio2size2chunks} = [
map {$state->{blocks2delete_prio2size2chunks}->{ $_ }}
sort {$a <=> $b}
keys %{ $state->{blocks2delete_prio2size2chunks} }
];
}
return if ! @{ $state->{blocks2delete_prio2size2chunks} };
if(ref($state->{blocks2delete_prio2size2chunks}->[0]) eq 'HASH') {
$state->{blocks2delete_prio2size2chunks}->[0] = [
map {$state->{blocks2delete_prio2size2chunks}->[0]->{ $_ }}
sort {$b <=> $a}
keys %{ $state->{blocks2delete_prio2size2chunks}->[0] }
];
}
my $prio_basket = $state->{blocks2delete_prio2size2chunks}->[0];
my $size_basket = $prio_basket->[0];
( run in 2.473 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )