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.
This commit is contained in:
parent
4f7aa4cc04
commit
3f08edbd25
|
@ -0,0 +1,91 @@
|
||||||
|
#!/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:
|
||||||
|
my $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";
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue