1: #!/usr/local/bin/perl -w
2:
3: =head1 NAME
4:
5: updateindex.pl - a script for creation of new database.
6:
7: =head1 SYNOPSIS
8:
9: updateind.pl [B<-i> I<indexfile>] [B<-y>|B<-n>] [B<-r>]
10:
11:
12: =head1 DESCRIPTION
13:
14: Upadets metainformation in the B<chgk> databse.
15:
16: An example of the index file follows:
17:
18: Авторские вопросы
19: Виктор Байрак
20: bayrak.txt Вопросы В.Байрака
21: Борис Бурда
22: burda.txt Вопросы Бориса Бурды
23: burda1.txt Тренировки Бориса Бурды 1
24: burda10.txt Тренировки Бориса Бурды 10
25: burda11.txt Тренировки Бориса Бурды 11
26: burda12.txt Тренировки Бориса Бурды 12
27:
28:
29: =head1 OPTIONS
30:
31: =over 4
32:
33: =item B<-i> I<indexfile>
34:
35: The index file to read (Standard input by default)
36:
37: =item B<-y>
38:
39: Answer 'yes' to all questions
40:
41: =item B<-n>
42:
43: Answer 'no' to all questions
44:
45: =item B<-r>
46:
47: Remove all entries with zero QuestionNum
48:
49: =head1 BUGS
50:
51: The database, user and password are hardcoded.
52:
53: =head1 SEE ALSO
54:
55: createindex.pl(1)
56:
57: =head1 AUTHOR
58:
59: Boris Veytsman
60:
61: =head1 $Id: updateindex.pl,v 1.11 2006/09/25 00:09:43 roma7 Exp $
62:
63: =cut
64:
65: use strict;
66: use vars qw($opt_i $opt_h $opt_y $opt_n $opt_r);
67:
68: use Getopt::Std;
69: use DBI;
70:
71: MAIN:
72: {
73: my $USAGE="Usage: updateindex.pl [-i indexfile] [-y|-n][-r]\n";
74: my $REMOVE=0;
75: getopts('hi:ynr') or die $USAGE;
76: if ($opt_h) {
77: print $USAGE;
78: exit 0;
79: }
80: my $decision='askuser';
81: if ($opt_y) {
82: $decision = 'yes';
83: }
84: if ($opt_n ) {
85: $decision = 'no';
86: }
87: if ($opt_r) {
88: $REMOVE=1;
89: }
90: my($source) = $opt_i;
91: my $champ;
92: my($depth, @depthId);
93: my $filename;
94: my($dbh) = DBI->connect("DBI:mysql:chgk", "piataev", "")
95: or die "Can't connect to DB chgk\n";
96: if ($dbh->get_info( 18 )=~/^(5|(4.1))/) {$dbh->do("SET NAMES 'koi8r'");}
97: if ($source) {
98: open INFO, $source or die "Can't open input file: $!\n";
99: } else {
100: *INFO=*STDIN;
101: }
102:
103: while (<INFO>) {
104: chomp;
105: s/
//;
106: next if (/^\s*$/);
107: if (s/^(\S+\.txt) *//) { # File found
108: $filename = $1;
109: $depth = -1;
110: $champ=1;
111: } else { # Group found
112: if (s/^(\S+)//)
113: { $filename = $1;}
114: else
115: {$filename = ''}
116: $depth = -2;
117: $champ=0;
118: }
119: s/^(\t*)//;
120: $depth += length($1);
121: if ($depth < 0) {
122: die "Wrong line $_\n";
123: }
124: s/^\s*//;
125: s/\s$//;
126: my $title = $_;
127: my $ParentId = ($depth) ? $depthId[$depth - 1] : 0;
128: my $Id = CheckId($dbh,$title,$ParentId,$decision,$filename);
129: if (!$Id || $champ) {
130: next;
131: }
132: $depthId[$depth] = $Id;
133:
134: }
135: print STDERR "Всего вопросов: ",
136: UpdateGroup($dbh,0),"\n";
137: if ($REMOVE) {
138: print STDERR "Removing empty tours.";
139: $dbh->do("DELETE FROM Tournaments WHERE QuestionsNum=0");
140: }
141: $dbh->do("INSERT INTO Tournaments
142: (Id, Title, ParentId, Type)
143: VALUES
144: (9999, 'Несортированные турниры', 0,'Г')");
145:
146: $dbh->disconnect;
147: }
148:
149:
150: sub CheckId {
151: my ($dbh,$title,$ParentId,$answer,$filename) = @_;
152: my $type;
153: my $key;
154: my $value;
155: my $Id = 0;
156: if ($filename && $filename=~/\.txt/) {
157: $type=$dbh->quote('Ч');
158: } else {$type=$dbh->quote('Г');}
159: if ($filename)
160: {
161: $key = "FileName";
162: $value = $dbh->quote($filename);
163: } else {
164: $key = "Title";
165: $value = $dbh->quote($title);
166: }
167:
168: $title=$dbh->quote($title);
169: my $sth = $dbh->prepare("SELECT Id FROM Tournaments
170: WHERE $key=$value");
171: $sth->execute or die $dbh->errstr;
172: my @arr = $sth->fetchrow;
173: if (scalar @arr) {
174: if ($answer eq 'askuser') {
175: print "$value is already in the DB!\n";
176: print "Заменить новым значением? [y/N]\n";
177: $answer = <STDIN>;
178: }
179: if ($answer !~ /^[yY]/) {
180: print STDERR "Не заменяем $value\n";
181: return 0;
182: } else {
183: print STDERR "Заменяем $value\n";
184: $Id = $arr[0];
185: }
186: }
187: if ($Id) {
188: $sth = $dbh->prepare("UPDATE Tournaments
189: SET Title=$title, ParentId=$ParentId,
190: Type=$type
191: WHERE Id=$Id");
192:
193: } else {
194: $sth = $dbh->prepare("INSERT INTO Tournaments
195: (Title, ParentId, Type)
196: VALUES
197: ($title, $ParentId,$type)");
198: }
199: $sth->execute or die $dbh->errstr;
200: if (!$Id) {
201: $Id = $sth->{'mysql_insertid'};
202: }
203: if ($filename) {
204: $filename=$dbh->quote($filename);
205: $sth = $dbh->prepare("UPDATE Tournaments
206: SET FileName=$filename
207: WHERE Id=$Id");
208: $sth->execute or die $dbh->errstr;
209: }
210: return $Id;
211: }
212:
213: sub UpdateGroup {
214: my ($dbh,$Id) = @_;
215: my $sth = $dbh->prepare("SELECT COUNT(*) FROM Questions
216: WHERE ParentId=$Id");
217: $sth->execute;
218: my @arr=$sth->fetchrow;
219: my $result=$arr[0];
220: my @Tours = GetTours($dbh,$Id);
221: foreach my $TourId (@Tours) {
222: $result += UpdateGroup($dbh,$TourId);
223: }
224: $sth=$dbh->prepare("UPDATE Tournaments SET
225: QuestionsNum=$result
226: WHERE Id=$Id");
227: $sth->execute;
228: return $result;
229: }
230:
231: sub GetTours {
232: my ($dbh, $ParentId) = @_;
233: my (@arr, @Tours);
234:
235: my ($sth) = $dbh->prepare("SELECT Id FROM Tournaments
236: WHERE ParentId=$ParentId ORDER BY Id");
237:
238: $sth->execute;
239:
240: while (@arr = $sth->fetchrow) {
241: push @Tours, $arr[0];
242: }
243:
244: return @Tours;
245: }
246:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>