App-Manager
view release on metacpan or search on metacpan
run_tracer;
stop_tracer;
}
package App::Manager::DB;
use Storable qw(nstore retrieve);
use File::Copy;
use App::Manager qw(S_ISDIR S_ISLNK S_ISREG S_IFMT slog);
use File::Compare;
sub new {
my $self = bless {},shift;
$self->{path} = shift;
$self;
}
sub sync {
my $self=shift;
if ($self->{dirty}) {
my @unlink = @{delete $self->{unlink}};
$self->{dirty}=0;
nstore $self,$self->{path}."/db"
or die "Unable to freeze into $self->{path}/db: $!\n";
unlink @unlink;
}
}
sub dirty {
my $self=shift;
$self->{mtime}=time;
$self->{dirty}++;
}
sub DESTROY {
my $self=shift;
$self->sync;
}
sub open {
shift;
my $path=App::Manager::LIBDIR."/".shift;
slog 1,"opening db $path";
retrieve $path."/db";
}
sub creat {
my $self = bless {}, shift;
$self->{path} = App::Manager::LIBDIR."/".shift;
slog 1,"creating db $self->{path}";
system 'rm','-rf',$self->{path};
mkdir $self->{path},0777
or die "Unable to create database '$self->{path}': $!\n";
$self->{genfile} = 'Xaaaaaa';
$self->{ctime} = time; # now this really is the _creation_ time
$self->{version}=$VERSION;
$self->dirty;
$self;
}
sub xlstat($) {
my @stat = lstat $_[0];
@stat ?
{
path => $_[0],
dev => $stat[ 0],
ino => $stat[ 1],
mode => $stat[ 2],
nlink => $stat[ 3],
uid => $stat[ 4],
gid => $stat[ 5],
rdev => $stat[ 6],
size => $stat[ 7],
atime => $stat[ 8],
mtime => $stat[ 9],
ctime => $stat[10],
blksize => $stat[11],
blocks => $stat[12],
}
:
{
path => $_[0],
}
}
sub ci($$) {
my $self=shift;
my $stat=xlstat shift;
my $gen = $self->{genfile}++;
$stat->{id} = $gen;
$self->{storage}{$gen}=
$self->{source}{$stat->{path}}=$stat;
if (defined $stat->{mode}) {
if (S_ISREG $stat->{mode}) {
$stat->{savetype} = 1; # none, stored
$stat->{savepath} = $self->{path}."/".$gen;
copy $stat->{path},$stat->{savepath}
or die "Unable to save away file '$stat->{path}': $!\n";
} elsif (App::Manager::S_ISLNK $stat->{mode}) {
$stat->{symlink}=readlink $stat->{path}
or die "Unable to read symlink '$stat->{path}': $!\n";
} elsif (App::Manager::S_ISDIR $stat->{mode}) {
# nothing to do
} else {
die "FATAL: Don't know how to check in $stat->{path}.\n";
}
}
$self->dirty;
}
sub optimize($$) {
my $self=shift;
my $level=shift;
slog 1,"checking for differences between database and filesystem";
for my $stat (values (%{$self->{storage}})) {
my $msg;
my $nstat = xlstat $stat->{path};
if (defined $stat->{mode} || defined $nstat->{mode}) {
( run in 1.228 second using v1.01-cache-2.11-cpan-39bf76dae61 )