simba/scripts/cleanup

92 lines
2.3 KiB
Plaintext
Raw Normal View History

#!/usr/bin/perl
# this script checks for all instances with a given prefix whether they
# actually exist and removes them from the database if they don't.
#
# this is mostly useful after part of a backup has been (intentionally
# or accidentally) deleted.
use warnings;
use strict;
use Simba::CA;
my $prefix_re = $ARGV[0];
unless ($prefix_re) {
print STDERR "Usage: $0 prefix_re\n";
exit(1);
}
my $ca = Simba::CA->new({
dbi_file => $ENV{SIMBA_DB_CONN} || "$ENV{HOME}/.dbi/simba",
});
my $dbh = $ca->{dbh};
my $sessions
= $dbh->selectall_arrayref(
q{select * from sessions},
{ Slice => {} }
);
$sessions = [ grep { $_->{prefix} =~ m/$prefix_re/ } @$sessions ];
for my $session (@$sessions) {
my $instances
= $dbh->selectall_arrayref(
q{select i.id, f.path
from instances i, files f
where i.session=? and i.file=f.id
},
{ Slice => {} },
$session->{id}
);
for my $instance (@$instances) {
my $backup_path = $session->{prefix} . '/' . $instance->{path};
print "$backup_path\n";
if (!lstat($backup_path)) {
if ($!{ENOENT}) {
# file doesn't exist, delete it
$dbh->do(q{delete from instances where id=?}, {}, $instance->{id});
print "\tdeleted\n";
} else {
die "unexpected error on $backup_path: $!";
}
}
}
}
# remove orphaned records:
2011-03-25 13:15:34 +01:00
$sessions
= $dbh->selectcol_arrayref(
q{select s.id from instances i right outer join sessions s on i.session=s.id where i.id is null}
);
for my $session (@$sessions) {
$dbh->do(q{delete from sessions where id=?}, {}, $session);
print "session $session deleted\n";
}
my $files
= $dbh->selectcol_arrayref(
q{select f.id from instances i right outer join files f on i.file=f.id where i.id is null}
);
for my $file (@$files) {
$dbh->do(q{delete from files where id=?}, {}, $file);
print "file $file deleted\n";
}
my $versions
= $dbh->selectcol_arrayref(
q{select v.id from instances i right outer join versions2 v on i.version=v.id where i.id is null}
);
for my $version (@$versions) {
$dbh->do(q{delete from versions2 where id=?}, {}, $version);
print "version $version deleted\n";
}