#!/usr/local/bin/perl -w =head1 NAME deletefiles.pl - a script for deleting files form the database =head1 SYNOPSIS deletefiles.pl file file file... =head1 DESCRIPTION The script will delete all questions with the given file name(s) from the database =head1 BUGS The database, user and password are hardcoded. =head1 SEE ALSO createindex.pl(1), updatedb.pl(1), updateindex.pl(1) =head1 AUTHOR Boris Veytsman =head1 $Id: deletefiles.pl,v 1.4 2001/07/28 21:21:29 boris Exp $ =cut use strict; use DBI; MAIN: { my $USAGE="Usage: deletefiles.pl file file file...\n"; my($dbh) = DBI->connect("DBI:mysql:chgk", "piataev", "") or die "Can't connect to DB chgk\n"; foreach my $file (@ARGV) { my $sth=$dbh->prepare (" select Id,ParentId,QuestionsNum from Tournaments where Type='þ' and FileName='$file'"); $sth->execute; if (!$sth->rows) { print STDERR "File $file is not found in the database\n"; next; } while (my ($Id,$ParentId,$QuestionsNum) = $sth->fetchrow) { print STDERR "Deleting $file, Id=$Id, $QuestionsNum questions\n"; UpdateParents($dbh,$ParentId,$QuestionsNum); UpdateChildrenAndDie($dbh,$Id); } } $dbh->disconnect; exit 0; } sub UpdateParents { my ($dbh,$Id,$Num) = @_; if ($Id==0) { return 0; } my $sth=$dbh->prepare(" Update Tournaments set QuestionsNum=QuestionsNum-$Num where Id='$Id'"); $sth->execute; $sth=$dbh->prepare(" select ParentId from Tournaments where Id=$Id"); $sth->execute; while (my ($ParentId)=$sth->fetchrow) { UpdateParents($dbh,$ParentId,$Num); } return 0; } sub UpdateChildrenAndDie { my($dbh,$Id)=@_; my $sth=$dbh->prepare(" select QuestionId from Questions where ParentId=$Id"); $sth->execute; while (my($QuestionId)=$sth->fetchrow) { $dbh->do("delete from Questions where QuestionId=$QuestionId"); } $sth=$dbh->prepare(" select Id from Tournaments where ParentId=$Id"); $sth->execute; while(my ($ChildId)=$sth->fetchrow) { UpdateChildrenAndDie($dbh,$ChildId); } $dbh->do("delete from Tournaments where Id=$Id"); return 0; }