version 1.3, 2000/10/19 01:06:18
|
version 1.7, 2000/11/11 00:35:39
|
Line 6 updateindex.pl - a script for creation o
|
Line 6 updateindex.pl - a script for creation o
|
|
|
=head1 SYNOPSIS |
=head1 SYNOPSIS |
|
|
updateind.pl [B<-i> I<indexfile>] |
updateind.pl [B<-i> I<indexfile>] [B<-y>|B<-n>] [B<-r>] |
|
|
|
|
=head1 DESCRIPTION |
=head1 DESCRIPTION |
|
|
Upadets metainformation in the B<chgk> databse. Uses file |
Upadets metainformation in the B<chgk> databse. |
L<./index> unless [B<-i>] option is used |
|
|
|
An example of the index file follows: |
An example of the index file follows: |
|
|
Line 27 An example of the index file follows:
|
Line 26 An example of the index file follows:
|
burda12.txt Тренировки Бориса Бурды 12 |
burda12.txt Тренировки Бориса Бурды 12 |
|
|
|
|
|
=head1 OPTIONS |
|
|
|
=over 4 |
|
|
|
=item B<-i> I<indexfile> |
|
|
|
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 |
=head1 BUGS |
|
|
The database, user and password are hardcoded. |
The database, user and password are hardcoded. |
Line 44 Boris Veytsman
|
Line 63 Boris Veytsman
|
=cut |
=cut |
|
|
use strict; |
use strict; |
use vars qw($opt_i $opt_h); |
use vars qw($opt_i $opt_h $opt_y $opt_n $opt_r); |
|
|
use Getopt::Std; |
use Getopt::Std; |
use DBI; |
use DBI; |
|
|
MAIN: |
MAIN: |
{ |
{ |
my $USAGE="Usage: updateindex.pl -i indexfile\n"; |
my $USAGE="Usage: updateindex.pl [-i indexfile] [-y|-n][-r]\n"; |
getopts('hi:') or die $USAGE; |
my $REMOVE=0; |
|
getopts('hi:ynr') or die $USAGE; |
if ($opt_h) { |
if ($opt_h) { |
print $USAGE; |
print $USAGE; |
exit 0; |
exit 0; |
} |
} |
my($source) = $opt_i || 'index'; |
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($depth, @depthId); |
my $filename; |
my $filename; |
my($dbh) = DBI->connect("DBI:mysql:chgk", "piataev", "") |
my($dbh) = DBI->connect("DBI:mysql:chgk", "piataev", "") |
or die "Can't connect to DB chgk\n"; |
or die "Can't connect to DB chgk\n"; |
|
|
open INFD, $source or die "Can't open input file: $!\n"; |
if ($source) { |
while (<INFD>) { |
open INFO, $source or die "Can't open input file: $!\n"; |
|
} else { |
|
*INFO=*STDIN; |
|
} |
|
while (<INFO>) { |
chomp; |
chomp; |
s/
//; |
s/
//; |
next if (/^\s*$/); |
next if (/^\s*$/); |
Line 82 MAIN:
|
Line 116 MAIN:
|
} |
} |
s/^\s*//; |
s/^\s*//; |
s/\s$//; |
s/\s$//; |
my $title = $dbh->quote($_); |
my $title = $_; |
my $ParentId = ($depth) ? $depthId[$depth - 1] : 0; |
my $ParentId = ($depth) ? $depthId[$depth - 1] : 0; |
my $sth; |
my $Id = CheckId($dbh,$title,$ParentId,$decision,$filename); |
my $type; |
if (!$Id || $filename) { |
if ($filename) { |
next; |
$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; |
|
} |
} |
|
$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; |
$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 = <STDIN>; |
|
} |
|
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; |
|
} |
|
|