--- db/prgsrc/updateindex.pl 2000/10/18 18:48:58 1.1 +++ db/prgsrc/updateindex.pl 2000/11/11 00:35:39 1.7 @@ -6,16 +6,45 @@ updateindex.pl - a script for creation o =head1 SYNOPSIS -updateind.pl [B<-i> I] +updateind.pl [B<-i> I] [B<-y>|B<-n>] [B<-r>] =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: + Авторские вопросы + Виктор Байрак + bayrak.txt Вопросы В.Байрака + Борис Бурда + burda.txt Вопросы Бориса Бурды + burda1.txt Тренировки Бориса Бурды 1 + burda10.txt Тренировки Бориса Бурды 10 + burda11.txt Тренировки Бориса Бурды 11 + 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 + +=item B<-r> + +Remove all entries with zero QuestionNum =head1 BUGS @@ -29,47 +58,174 @@ createindex.pl(1) Boris Veytsman -=head1 $Id: updateindex.pl,v 1.1 2000/10/18 18:48:58 boris Exp $ +=head1 $Id: updateindex.pl,v 1.7 2000/11/11 00:35:39 boris Exp $ =cut use strict; -use vars qw($opt_m); +use vars qw($opt_i $opt_h $opt_y $opt_n $opt_r); use Getopt::Std; use DBI; MAIN: { - getopts('m:') or die "Wrong options"; - my($source) = $opt_m || 'meta'; - my($depth, @depthId); - 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 () { - my $MetaId; - s/^\[(\d*)\]\t//; - $MetaId = $1; - s/^(\t*)//; - chomp; - $depth = length($1); - my $title = $dbh->quote($_); - my $ParentId = ($depth) ? $depthId[$depth - 1] : 0; - my ($sth) = $dbh->prepare("SELECT Id FROM Tournaments WHERE - MetaId=$MetaId"); - $sth->execute; - if ($sth->fetchrow) { - print "$title is already in the DB!\n"; - next; - } - $sth = $dbh->prepare("INSERT INTO Tournaments - (Title, ParentId, MetaId, Type) - VALUES ($title, $ParentId, $MetaId, 'Г')"); - $sth->execute; - my $Id = $sth->{'mysql_insertid'}; - $depthId[$depth] = $Id; + my $USAGE="Usage: updateindex.pl [-i indexfile] [-y|-n][-r]\n"; + my $REMOVE=0; + getopts('hi:ynr') or die $USAGE; + if ($opt_h) { + print $USAGE; + exit 0; + } + my $decision='askuser'; + if ($opt_y) { + $decision = 'yes'; + } + if ($opt_n ) { + $decision = 'no'; + } + if ($opt_r) { + $REMOVE=1; + } + 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"; + + if ($source) { + open INFO, $source or die "Can't open input file: $!\n"; + } else { + *INFO=*STDIN; + } + while () { + chomp; + s/ //; + next if (/^\s*$/); + if (s/^(\S+) *//) { # File found + $filename = $1; + $depth = -1; + } else { # Group found + $filename = ''; + $depth = -2; + } + s/^(\t*)//; + $depth += length($1); + if ($depth < 0) { + die "Wrong line $_\n"; + } + s/^\s*//; + s/\s$//; + my $title = $_; + my $ParentId = ($depth) ? $depthId[$depth - 1] : 0; + my $Id = CheckId($dbh,$title,$ParentId,$decision,$filename); + if (!$Id || $filename) { + next; + } + $depthId[$depth] = $Id; + + } + print STDERR "Всего вопросов: ", + UpdateGroup($dbh,0),"\n"; + if ($REMOVE) { + print STDERR "Removing empty tours."; + $dbh->do("DELETE FROM Tournaments WHERE QuestionsNum=0"); + } + $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]; } - $dbh->disconnect; + + return @Tours; } +