--- db/prgsrc/updateindex.pl 2000/10/19 01:06:18 1.3 +++ db/prgsrc/updateindex.pl 2000/10/22 01:25:25 1.6 @@ -6,13 +6,12 @@ updateindex.pl - a script for creation o =head1 SYNOPSIS -updateind.pl [B<-i> I] +updateind.pl [B<-i> I] [B<-y>|B<-n>] =head1 DESCRIPTION -Upadets metainformation in the B databse. Uses file - L<./index> unless [B<-i>] option is used +Upadets metainformation in the B databse. An example of the index file follows: @@ -27,6 +26,22 @@ An example of the index file follows: burda12.txt Тренировки Бориса Бурды 12 +=head1 OPTIONS + +=over 4 + +=item B<-i> I + +The index file to read (Standard input by default) + +=item B<-y> + +Answer 'yes' to all questions + +=item B<-n> + +Answer 'no' to all questions + =head1 BUGS The database, user and password are hardcoded. @@ -39,32 +54,43 @@ createindex.pl(1) Boris Veytsman -=head1 $Id: updateindex.pl,v 1.3 2000/10/19 01:06:18 boris Exp $ +=head1 $Id: updateindex.pl,v 1.6 2000/10/22 01:25:25 boris Exp $ =cut use strict; -use vars qw($opt_i $opt_h); +use vars qw($opt_i $opt_h $opt_y $opt_n); use Getopt::Std; use DBI; MAIN: { - my $USAGE="Usage: updateindex.pl -i indexfile\n"; - getopts('hi:') or die $USAGE; + my $USAGE="Usage: updateindex.pl [-i indexfile] [-y|-n]\n"; + getopts('hi:yn') or die $USAGE; if ($opt_h) { print $USAGE; exit 0; } - my($source) = $opt_i || 'index'; + my $decision='askuser'; + if ($opt_y) { + $decision = 'yes'; + } + if ($opt_n ) { + $decision = 'no'; + } + my($source) = $opt_i; my($depth, @depthId); my $filename; my($dbh) = DBI->connect("DBI:mysql:chgk", "piataev", "") or die "Can't connect to DB chgk\n"; - open INFD, $source or die "Can't open input file: $!\n"; - while () { + if ($source) { + open INFO, $source or die "Can't open input file: $!\n"; + } else { + *INFO=*STDIN; + } + while () { chomp; s/ //; next if (/^\s*$/); @@ -82,42 +108,112 @@ MAIN: } s/^\s*//; s/\s$//; - my $title = $dbh->quote($_); + my $title = $_; my $ParentId = ($depth) ? $depthId[$depth - 1] : 0; - my $sth; - my $type; - if ($filename) { - $type=$dbh->quote('Ч'); - $filename = $dbh->quote($filename); - $sth = $dbh->prepare("SELECT Id FROM Tournaments - WHERE FileName=$filename"); - $sth->execute; - if ($sth->fetchrow) { - print "$filename is already in the DB!\n"; - next; - } - $sth = $dbh->prepare("INSERT INTO Tournaments - (Title, ParentId, FileName, Type) - VALUES ($title, $ParentId, $filename, $type)"); - $sth->execute; - } else { - $type=$dbh->quote('Г'); - $sth = $dbh->prepare("SELECT Id FROM Tournaments - WHERE Title=$title"); - - $sth->execute; - if ($sth->fetchrow) { - print "$title is already in the DB!\n"; - next; - } - $sth = $dbh->prepare("INSERT INTO Tournaments - (Title, ParentId, Type) - VALUES ($title, $ParentId, $type)"); - $sth->execute; - my $Id = $sth->{'mysql_insertid'}; - $depthId[$depth] = $Id; + my $Id = CheckId($dbh,$title,$ParentId,$decision,$filename); + if (!$Id || $filename) { + next; } + $depthId[$depth] = $Id; } + print STDERR "Всего вопросов: ", + UpdateGroup($dbh,0),"\n"; $dbh->disconnect; } + + +sub CheckId { + my ($dbh,$title,$ParentId,$answer,$filename) = @_; + my $type; + my $key; + my $value; + my $Id = 0; + if ($filename) { + $type=$dbh->quote('Ч'); + $key = "FileName"; + $value = $dbh->quote($filename); + } else { + $type=$dbh->quote('Г'); + $key = "Title"; + $value = $dbh->quote($title); + } + $title=$dbh->quote($title); + my $sth = $dbh->prepare("SELECT Id FROM Tournaments + WHERE $key=$value"); + $sth->execute or die $dbh->errstr; + my @arr = $sth->fetchrow; + if (scalar @arr) { + if ($answer eq 'askuser') { + print "$value is already in the DB!\n"; + print "Заменить новым значением? [y/N]\n"; + $answer = ; + } + if ($answer !~ /^[yY]/) { + print STDERR "Не заменяем $value\n"; + return 0; + } else { + print STDERR "Заменяем $value\n"; + $Id = $arr[0]; + } + } + if ($Id) { + $sth = $dbh->prepare("UPDATE Tournaments + SET Title=$title, ParentId=$ParentId, + Type=$type + WHERE Id=$Id"); + + } else { + $sth = $dbh->prepare("INSERT INTO Tournaments + (Title, ParentId, Type) + VALUES + ($title, $ParentId,$type)"); + } + $sth->execute or die $dbh->errstr; + if (!$Id) { + $Id = $sth->{'mysql_insertid'}; + } + if ($filename) { + $filename=$dbh->quote($filename); + $sth = $dbh->prepare("UPDATE Tournaments + SET FileName=$filename + WHERE Id=$Id"); + $sth->execute or die $dbh->errstr; + } + return $Id; +} + +sub UpdateGroup { + my ($dbh,$Id) = @_; + my $sth = $dbh->prepare("SELECT COUNT(*) FROM Questions + WHERE ParentId=$Id"); + $sth->execute; + my @arr=$sth->fetchrow; + my $result=$arr[0]; + my @Tours = GetTours($dbh,$Id); + foreach my $TourId (@Tours) { + $result += UpdateGroup($dbh,$TourId); + } + $sth=$dbh->prepare("UPDATE Tournaments SET + QuestionsNum=$result + WHERE Id=$Id"); + $sth->execute; + return $result; +} + +sub GetTours { + my ($dbh, $ParentId) = @_; + my (@arr, @Tours); + + my ($sth) = $dbh->prepare("SELECT Id FROM Tournaments + WHERE ParentId=$ParentId ORDER BY Id"); + + $sth->execute; + + while (@arr = $sth->fetchrow) { + push @Tours, $arr[0]; + } + + return @Tours; +} +