1: #!/usr/bin/perl -w
2:
3: use DBI;
4: use CGI ':all';
5: #use Text::Query;
6: use strict;
7: use Time::Local;
8: use POSIX qw(locale_h);
9: use locale;
10: open STDERR, ">errors1";
11: my $printqueries=0;
12: my %forbidden=();
13: my $debug=0; #added by R7
14: if (param('debug')) {$debug=1; $printqueries=1}
15: my %fieldname= (0,'Question', 1, 'Answer', 2, 'Comments', 3, 'Authors', 4, 'Sources');
16: my %rusfieldname=('Question','Вопрос', 'Answer', 'Ответ',
17: 'Comments', 'Комментарии', 'Authors', 'Автор',
18: 'Sources', 'Источник','old','Старый','rus','Новый');
19: my %searchin;
20: my $rl=qr/[йцукенгшщзхъфывапролджэячсмитьбюё]/;
21: my $RL=qr/[ЙЦУКЕНГШЩЗХЪЭЖДЛОРПАВЫФЯЧСМИТЬБЮЁ]/;
22: my $RLrl=qr/(?:(?:${rl})|(?:${RL}))+/;
23: my $l=qr/(?:(?:${RLrl})|(?:[\w\-]))+/;
24: my $Ll=qr/(?:[A-Z])|(?:${RL})/;
25:
26:
27:
28:
29: my $thislocale;
30:
31: $searchin{$_}=1 foreach param('searchin');
32: #$searchin{'Question'}=param('Question');
33: #$searchin{'Answer'}=param('Answer');
34: #$searchin{'Comments'}=param('Comments');
35: #$searchin{'Authors'}=param('Authors');
36: #$searchin{'Sources'}=param('Sources');
37: my $all=param('all');
38: $all=0 if lc $all eq 'no';
39: my ($PWD) = `pwd`;
40: chomp $PWD;
41: my ($SRCPATH) = "$PWD/../dimrub/src";
42: my ($ZIP) = "/home/piataev/bin/zip";
43: my $DUMPFILE = "/tmp/chgkdump";
44: my ($SENDMAIL) = "/usr/sbin/sendmail";
45: my ($TMSECS) = 30*24*60*60;
46: my (%RevMonths) =
47: ('Jan', '0', 'Feb', '1', 'Mar', '2', 'Apr', '3', 'May', '4', 'Jun', '5',
48: 'Jul', '6', 'Aug', '7', 'Sep', '8', 'Oct', '9', 'Nov', '10',
49: 'Dec', '11',
50: 'Янв', '0', 'Фев', 1, 'Мар', 2, 'Апр', 3, 'Май', '4',
51: 'Июн', '5', 'Июл', 6, 'Авг', '7', 'Сен', '8',
52: 'Окт', '9', 'Ноя', '19', 'Дек', '11');
53:
54: # Determine whether the given time is within 2 months from now.
55: sub NewEnough {
56: my ($a) = @_;
57: my ($year, $month, $day) = split('-', $a);
58:
59: return (time - timelocal(0, 0, 0, $day, $month -1, $year) < $TMSECS);
60: }
61:
62: # Reads one question from the DB. Gets DB handler and Question ID.
63: sub GetTournament {
64: my ($dbh, $Id) = @_;
65: my (%Tournament, $field, @arr);
66:
67: return %Tournament if ($Id == 0);
68:
69: my ($sth) = $dbh->prepare("SELECT * FROM Tournaments WHERE Id=$Id");
70: $sth->execute;
71:
72: @arr = $sth->fetchrow;
73: $sth->finish;
74: my($i, $name) = 0;
75: foreach $name (@{$sth->{NAME}}) {
76: $Tournament{$name} = $arr[$i++];
77: }
78:
79: return %Tournament;
80: }
81:
82: # Reads one question from the DB. Gets DB handler and Question ID.
83: sub GetQuestion {
84: my ($dbh, $QuestionId) = @_;
85: my (%Question, $field, @arr);
86:
87: my($sth) = $dbh->prepare("
88: SELECT * FROM Questions WHERE QuestionId=$QuestionId
89: ");
90:
91: $sth->execute;
92:
93: @arr = $sth->fetchrow;
94: my($i, $name) = 0;
95: foreach $name (@{$sth->{NAME}}) {
96: $Question{$name} = $arr[$i++];
97: }
98:
99: $sth->finish;
100: return %Question;
101: }
102:
103: # Gets numbers of all the questions from the given tour.
104: sub GetTourQuestions {
105: my ($dbh, $ParentId) = @_;
106: my (@arr, @Questions);
107:
108: my ($sth) = $dbh->prepare("SELECT QuestionId FROM Questions
109: WHERE ParentId=$ParentId ORDER BY QuestionId");
110:
111: $sth->execute;
112:
113: while (@arr = $sth->fetchrow) {
114: push @Questions, $arr[0];
115: }
116:
117: $sth->finish;
118: return @Questions;
119: }
120:
121: # Returns list of children of the given tournament.
122: sub GetTours {
123: my ($dbh, $ParentId) = @_;
124: my (@arr, @Tours);
125:
126: my ($sth) = $dbh->prepare("SELECT Id FROM Tournaments
127: WHERE ParentId=$ParentId ORDER BY Id");
128:
129: $sth->execute;
130:
131: while (@arr = $sth->fetchrow) {
132: push @Tours, $arr[0];
133: }
134: $sth->finish;
135: return @Tours;
136: }
137:
138: sub count
139: {
140: my ($dbh,$word)=@_;
141: print "timeb=".time.br if $debug;
142: $word=$dbh->quote(uc $word);
143: my $query="SELECT number from nests,nf where $word=w1 AND w2=nf.id";
144: my $sth=$dbh->prepare($query);
145: $sth->execute;
146: my @a=$sth->fetchrow;
147: print "timee0=".time.br if $debug;
148: $sth->finish;
149: $a[0]||0;
150: }
151:
152:
153: sub printform
154: {
155:
156: my $submit=submit(-value=>'Поиск');
157: my $inputstring=textfield(-name=>'sstr',
158: -default=>param('sstr')||'',
159: -size=>30,
160: -maxlength=>30);
161: my @df=keys %searchin;
162: @df=('Question', 'Answer') unless @df;
163: my $fields=checkbox_group('searchin',['Question','Answer','Comments','Authors','Sources'], [@df],
164: 'false',\%rusfieldname);
165:
166: my $metod=radio_group(-name=>'metod',-values=>['old','rus'],
167: -default=>(param('metod')||'rus'),
168: -labels=>\%rusfieldname);
169: my $all=radio_group(-name=>'all',-values=>['yes','no'],
170: -default=>(param('all')||'no'),
171: -labels=>{'yes'=>'Все','no'=>'Любое'});
172:
173: #################################################
174: return start_form(-method=>'get',
175: -action=>url,
176: -enctype=>
177: "application/x-www-form-urlencoded"
178: ).br.
179: table(Tr
180: (
181: td({-valign=>'TOP'},$inputstring.$submit.p."Метод: $metod".p."Слова: $all"),
182: td({-valign=>'TOP'},(' 'x 8).'Поля:'),
183: td({-valign=>'TOP'},$fields)
184: )
185: )
186:
187: #$fields.
188: #$inputstring.$submit.br.$metod.$all
189: .endform
190: .hr
191:
192: }
193:
194: sub proxy
195: {
196: #print "time0=".time.br if $debug;
197: my ($dbh,$ptext,$allnf)=@_;
198: my $text=$$ptext;
199: $text=~tr/ёЁ/еЕ/;
200: $text=~s/(${RLrl})p(${RLrl})/$1p$2/gom;
201: $text=~s/p(${RLrl})/р$1/gom;
202: $text=~s/(${RLrl})p/$1р/gom;
203: $text=~s/\s+/ /gmo;
204: $text=~s/[^йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮQWERTYUIOPASDFGHJKLZXCVBNM0-9]/ /g;
205: $text=uc $text;
206: my @list= $text=~m/(?:(?:${RLrl})+)|(?:[A-Za-z0-9]+)/gom;
207: my (%c, %good,$sstr);
208: foreach (@list)
209: {
210: $c{$_}=count($dbh,$_)||10000;
211: }
212: my @words=sort {$c{$a}<=> $c{$b}} @list;
213:
214: # $good{$words[$_]}=1 foreach 0..4;
215:
216: foreach (@words)
217: {
218: $good{$_}=1 if $c{$_}<200;
219: }
220:
221: $good{$words[$_]}=0 foreach 16..$#words;
222:
223: # foreach (@list)
224: # {
225: # if ($good{$_})
226: # {
227: # $good{$_}=0;
228: # $sstr.=" $_";
229: # }
230: # }
231: $sstr.=" $_" foreach grep {$good{$_}} @list;
232: print "time05=".time.br if $debug;
233: $$ptext=$sstr;
234: return russearch($dbh,$sstr,0,$allnf);
235: }
236:
237:
238: sub russearch {
239: my ($dbh, $sstr, $all,$allnf)=@_;
240: my (@qw,@w,@tasks,$qw,@arr,$nf,$sth,@nf,$w,$where,$e,@where,%good,$i,%where,$from);
241: my($number,@good,$t,$task,@rho,$rank,%rank,$r2,$r1,$word,$n,@last,$good,@words,%number,$taskid);
242: my ($hi, $lo, $wordnumber,$query,$blob,$field,$sf,$ii);
243: my @frequence;
244: my (@arr1,@ar,@sf,@arr2);
245: my %tasks;
246: my $tasks;
247: my @verybad;
248: my %nf;
249: my %tasksof;
250: my %wordsof;
251: my %relevance;
252: my @blob;
253: my %count;
254:
255: $sstr=~tr/йцукенгшщзхъфывапролджэячсмитьбю/ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ/;
256: @qw=@w =split (' ', uc $sstr);
257:
258: #-----------
259: foreach $i (0..$#w) # заполняем массив @nf начальных форм
260: # $nf[$i] -- ссылка на массив возможных
261: # начальных форм словоформы $i
262: {
263: $qw= $dbh->quote (uc $w[$i]);
264: $query=" select distinct w2 from nests
265: where w1=$qw";
266: print "$query",br if $printqueries;
267: $sth=$dbh -> prepare($query);
268: $sth -> execute;
269: @{$nf[$i]}=();
270: while (@arr = $sth->fetchrow)
271: {
272: push (@{$nf[$i]},$arr[0])
273: }
274: $sth->finish;
275: }
276:
277:
278: my @bad=grep {!@{$nf[$_]}} 0..$#w; # @bad -- номера словоформ,
279: # которых нет в словаре
280:
281: if (@bad) #есть неопознанные словоформы
282: {
283: require "cw.pl";
284: foreach $i(@bad)
285: {
286: if (@arr=checkword($dbh,$w[$i]))
287: {push (@{$nf[$i]}, @arr);}
288: else
289: {push (@verybad,$i);}
290: }
291: }
292: return () if ($all && @verybad);
293:
294:
295: my $kvo=0;
296: push @$allnf, @{$_} foreach @nf;
297: print "nf=@$allnf" if $printqueries;
298:
299: foreach $i (0..$#w) #запросы в базу...
300: {
301: @arr=@{$nf[$i]} if $nf[$i];
302: @arr2=@arr1=@arr;
303:
304:
305:
306:
307: $_= " word2question.word=".$_. ' ' foreach @arr;
308: $_= " nf.id=".$_. ' ' foreach @arr1;
309: # @arr=(0) unless @arr;
310: $query="select questions from word2question where". (join ' OR ', @arr);
311: print STDERR "!$query\n",br if $printqueries;
312:
313: $sth=$dbh -> prepare($query);
314: $sth->execute;
315:
316: @blob=();
317: while (@arr=$sth->fetchrow)
318: {
319: @blob=(@blob,unpack 'C*',$arr[0]);
320: }
321: $sth->finish;
322: $query="select number from nf where ".(join ' OR ', @arr1);
323: print "$query\n",br if $printqueries;
324: $sth=$dbh -> prepare($query);
325: $sth->execute;
326:
327: while (@arr=$sth->fetchrow)
328: {
329: $frequence[$i]+=$arr[0];
330: }
331: $sth->finish;
332:
333:
334: if (@blob < 4)
335: {
336: $tasksof{$i}=undef;
337: } else
338: {
339: $kvo++;
340: $ii=0;
341: while ($ii<$#blob) # создаём хэш %tasksof, ключи которого --
342: # номера искомых словоформ, а значения --
343: # списки вопросов, в которых есть соответствующа
344: # словоформа.
345: # Каждый список в свою очередь также оформлен в
346: # виде хэша, ключи которого -- номера вопросов,
347: # а значения -- списки номеров вхождений. Вот.
348: {
349: ($field,$lo,$hi,$wordnumber)=@blob[$ii..($ii+3)];
350: $ii+=4;
351: $number=$lo+$hi*256;
352: $field=$fieldname{$field};
353: if ($searchin{$field})
354: {
355: push @{$tasksof{$i}{$number}}, $wordnumber;
356: # дополнили в хэше, висящем на
357: # словоформе $i в %tasksof список
358: # вхождений $i в вопрос $number.
359: push @{$wordsof{$number}{$i}}, $wordnumber;
360: # дополнили в хэше, висящем на
361: # вопросе $number в %wordsof список
362: # вхождений $i в вопрос $number.
363:
364:
365: }
366: } #while ($ii<$#blob)
367: }
368: } #foreach $i
369:
370: #print "keys tasksof", join ' ', keys %{$tasksof{0}};
371: #Ищем пересечение или объединение списков вопросов (значений %tasksof)
372: foreach $sf (keys %tasksof)
373: {
374: $count{$_}++ foreach keys %{$tasksof{$sf}};
375: }
376: @tasks= ($all ? (grep {$count{$_}==$kvo} keys %count) :
377: keys %count) ;
378:
379:
380: print "\n\$#tasks=",$#tasks,br if $printqueries;
381: ############ Сортировка найденных вопросов
382:
383: foreach (keys %wordsof)
384: {
385: $relevance{$_}=&relevance($#w,$wordsof{$_},\@frequence) if $_
386: }
387:
388: @tasks=sort {$relevance{$b}<=>$relevance{$a}} @tasks;
389:
390:
391: ############
392:
393: print "tasks=@tasks" if $printqueries;
394:
395: #print "$_ $relevance{$_} | " foreach @tasks;
396: #print br;
397: print "allnf=@$allnf",br if $printqueries;
398: return @tasks;
399: }
400:
401:
402: sub distance {
403: # на входе -- номера словоформ и ссылки на
404: # списки вхождений. На выходе -- расстояние,
405: # вычисляемое по формуле min(|b-a-pb+pa|)
406: # pb,pa
407: # (pb и pa -- позиции слов b и a)
408: my ($a,$b,$lista,$listb)=@_;
409: my ($pa,$pb,$min,$curmin);
410: $min=10000;
411: foreach $pa (@$lista)
412: {
413: foreach $pb (@$listb)
414: {
415: $curmin=abs($b-$a-$pb+$pa);
416: $min= $curmin if $curmin<$min;
417: }
418: }
419: return $min;
420:
421: }
422:
423: sub relevance {
424: # На входе -- количество искомых словоформ -1 и
425: # ссылка на hash, ключи которого --
426: # номера словоформ, а значения -- списки вхождений
427:
428: my ($n,$words,$frequence)=@_;
429: my $relevance=0;
430: my ($first,$second,$d);
431: foreach $first (0..$n)
432: {
433: $relevance+=scalar @{$$words{$first}}+1000+1000/$$frequence[$first]
434: if $$words{$first};
435: foreach $second ($first+1..$n)
436: {
437: $d=&distance($first,$second,$$words{$first},$$words{$second});
438: $relevance+=($d>10?0:10-$d)*10;
439: }
440: }
441: return $relevance;
442: }
443:
444:
445:
446: # Returns list of QuestionId's, that have the search string in them.
447: sub Search {
448: my ($dbh, $s,$metod,$all,$allnf) = @_;
449: my $sstr=$$s;
450: my (@arr, @Questions, @fields);
451: my (@sar, $i, $sth,$where,$query);
452: # my $ip=$ENV{'REMOTE_ADDR'};
453:
454: # $ip=$dbh->quote($ip);
455: # $query=
456: # "INSERT into queries (query,metod,searchin,ip)
457: # values (". $dbh->quote($sstr).', '.
458: # $dbh->quote($metod) . ', ' .
459: # $dbh->quote(join ' ', grep $searchin{$_}, keys %searchin) .
460: # ", $ip)";
461: #print $query if $printqueries;
462: # $dbh -> do ($query);
463: if ($metod eq 'rus')
464: {
465: my @tasks=russearch($dbh,$sstr,$all,$allnf);
466: return @tasks
467: }
468: elsif ($metod eq 'proxy')
469: {
470: # $searchin{'question'}=1;
471: # $searchin{'answer'}=1;
472: my @task=proxy($dbh,$s,$allnf);
473: # $$s=$sstr;
474: return @task
475: }
476:
477:
478:
479: ###Simple and advanced query processing. Added by R7
480: if ($metod eq 'simple' || $metod eq 'advanced')
481: {
482: foreach (qw/Question Answer Sources Authors Comments/) {
483: if (param($_)) {
484: push @fields, $_;
485: }
486: }
487:
488: @fields=(qw/Question Answer Sources Authors Comments/) unless scalar @fields;
489: my $fields=join ",", @fields;
490: my $q=new Text::Query($sstr,
491: -parse => 'Text::Query::'.
492: (($metod eq 'simple') ? 'ParseSimple':'ParseAdvanced'),
493: -solve => 'Text::Query::SolveSQL',
494: -build => 'Text::Query::BuildSQLMySQL',
495: -fields_searched => $fields);
496:
497: $where= $$q{'matchexp'};
498: $query= "SELECT Questionid FROM Questions
499: WHERE $where";
500: print br."Query is: $query".br if $debug;
501:
502: $sth = $dbh->prepare($query);
503: } else
504: ######
505: {
506:
507: # foreach (qw/Question Answer Sources Authors Comments/) {
508: foreach (param('searchin')) {
509: # if (param($_)) {
510: push @fields, "IFNULL($_, '')";
511: # }
512: }
513: @sar = split " ", $sstr;
514: for $i (0 .. $#sar) {
515: $sar[$i] = $dbh->quote("%${sar[$i]}%");
516: }
517:
518: my($f) = "CONCAT(" . join(',', @fields) . ")";
519: if (param('all') eq 'yes') {
520: $sstr = join " AND $f LIKE ", @sar;
521: } else {
522: $sstr = join " OR $f LIKE ", @sar;
523: }
524:
525: my $query;
526: $query="SELECT QuestionId FROM Questions
527: WHERE $f LIKE $sstr ORDER BY QuestionId";
528:
529:
530: print $query if $printqueries;
531: $sth = $dbh->prepare($query)
532: } #else -- processing old-style query (R7)
533:
534: $sth->execute;
535: while (@arr = $sth->fetchrow) {
536: push @Questions, $arr[0] unless $forbidden{$arr[0]};
537: }
538: $sth->finish;
539: print "@Questions" if $printqueries;
540: return @Questions;
541: }
542:
543: # Substitute every letter by a pair (for case insensitive search).
544: my (@letters) = qw/аА бБ вВ гГ дД еЕ жЖ зЗ иИ йЙ кК лЛ мМ нН оО
545: пП рР сС тТ уУ фФ хХ цЦ чЧ шШ щЩ ьЬ ыЫ эЭ юЮ яЯ/;
546:
547: sub NoCase {
548: my ($sstr) = shift;
549: my ($res);
550:
551: if (($res) = grep(/$sstr/, @letters)) {
552: return "[$res]";
553: } else {
554: return $sstr;
555: }
556: }
557:
558: sub PrintList {
559: my ($dbh,$Questions,$shablon)=@_;
560:
561: my $first=param('first') ||1;
562: my $kvo=param('kvo') ||30;
563:
564: $first=$first-($first-1)%$kvo;
565: my $last=$first+$kvo-1;
566: $last=scalar @$Questions if scalar @$Questions <$last;
567: my($f,$l);
568: my $nav='';
569: my $qs=query_string;
570: $qs=~s/\;/\&/g;
571: $qs=~s/\&first\=[^\&]+//g;
572:
573:
574: if ($first>$kvo*3+1)
575: {
576: $nav.=
577: (" "x4).
578: a({href=>url."?".$qs."\&first=1"},"<<").(" "x4).
579: a({href=>(url."?".$qs."\&first=".($first-$kvo))},"<").(" "x4)
580: }
581:
582: else {$nav.=' 'x15;}
583:
584: my ($fprint,$lprint);
585: my $llprint=$#$Questions- ($#$Questions+1)%$kvo+2;
586: if ($#$Questions+1<=$kvo*7)
587: { $fprint=1;
588: $lprint=$llprint;
589: }
590: elsif ($first>$kvo*3 && $#$Questions+1-$first>$kvo*3)
591: {
592: $fprint=$first-$kvo*3;
593: $lprint=$first+$kvo*3;
594: }
595: elsif ($first<=$kvo*3)
596: {
597: $fprint=1; $lprint=6*$kvo+1;
598: }
599: else
600: {
601: $lprint=$llprint;
602: $fprint=$lprint-$kvo*6
603: }
604:
605: # my $fprint=($first>$kvo*3) ? $first-$kvo*3 : 1;
606: # my $lprint=$#$Questions+1-$fprint>$kvo*7 ? $kvo*7 :$#$Questions+1;
607: # if ($lprint-$fprint<$kvo*6 && $fprint>1)
608: # {
609: # $fprint=$lprint-$kvo*6;
610: # $fprint=1 if ($fprint<=0)
611: # }
612:
613:
614:
615: for($f=$fprint; $f<=$lprint; $f+=$kvo)
616: {
617: # next if $first-$f>$kvo*3;
618: $l=$f+$kvo-1;
619: $l=$#$Questions+1 if $l>$#$Questions+1;
620: if ($f==$first) {$nav.="[$f-$l] ";}
621: else {
622: $nav.= "[".a({href=>(url."?".$qs."\&first=$f")},"$f-$l")."] ";}
623: }
624: if ($lprint+$kvo<$#$Questions)
625: {
626: $nav.=
627: (" "x4).
628: a({href=>(url."?".$qs."\&first=".($first+$kvo))},">").(" "x4).
629: a({href=>url."?".$qs."\&first=$llprint"},">>").(" "x4)
630: }
631:
632:
633: print "$nav".br."\n";
634: for (my $i = $first; $i <= $last; $i++) {
635: my $output = &PrintQuestion($dbh, $$Questions[$i-1], 1, $i, 1);
636: if (param('metod') eq 'rus' || param('metod') eq 'proxy')
637: {
638: $output=~s/\b($shablon)\b/\<strong\>$1\<\/strong\>/gi;
639: } else {
640: $output=~s/($shablon)/\<strong\>$1\<\/strong\>/gi;
641: }
642: print $output;
643: }
644:
645:
646: print "$nav".br."\n";
647:
648: }
649:
650: sub PrintSearch {
651: my ($dbh, $sstr, $metod) = @_;
652: print h2("Поиск в базе вопросов");
653: print printform;
654: my @allnf;
655: my (@Questions) = &Search($dbh, \$sstr,$metod,$all,\@allnf);
656: my ($output, $i, $suffix, $hits) = ('', 0, '', $#Questions + 1);
657:
658: my $shablon;
659: $metod='rus' if $metod eq 'proxy';
660: if ($metod eq 'rus')
661: {
662: my $where='0';
663: $where.= " or w2=$_ " foreach @allnf;
664: my $query="select w1 from nests where $where";
665: my $sth=$dbh->prepare($query);
666: print "$query" if $printqueries;
667:
668: $sth->execute;
669: my @shablon;
670: while (my @arr = $sth->fetchrow)
671: {
672: push @shablon,"(?:$arr[0])";
673: }
674: $shablon= join "|", @shablon;
675: $shablon=~s/[её]/\[ЕЁ\]/gi;
676: # $shablon=~s/([йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ])/&NoCase($1)/ge;
677: $shablon=qr/$shablon/i;
678: print "!$shablon!",br if $printqueries;
679: }
680:
681:
682:
683: if ($hits =~ /1.$/ || $hits =~ /[5-90]$/) {
684: $suffix = 'й';
685: } elsif ($hits =~ /1$/) {
686: $suffix = 'е';
687: } else {
688: $suffix = 'я';
689: }
690:
691: print p({align=>"center"}, "Результаты поиска на " . strong($sstr)
692: . " : $hits попадани$suffix.");
693:
694: if (param('word')) {
695: $sstr = '[ \.\,:;]' . $sstr . '[ \.\,:\;]';
696: }
697:
698: $sstr =~ s/(.)/&NoCase($1)/ge;
699:
700: my @sar;
701: if ($metod ne 'rus')
702: {
703: (@sar) = split(' ', $sstr);
704: $shablon=join "|",@sar;
705: }
706: PrintList($dbh,\@Questions,$shablon);
707: }
708:
709: sub PrintRandom {
710: my ($dbh, $type, $num, $text) = @_;
711: my (@Questions) = &Get12Random($dbh, $type, $num);
712: my ($output, $i) = ('', 0);
713:
714: if ($text) {
715: $output .= " $num случайных вопросов.\n\n";
716: } else {
717: $output .=
718: h2({align=>"center"}, "$num случайных вопросов.");
719: }
720:
721: for ($i = 0; $i <= $#Questions; $i++) {
722: # Passing DB handler, question ID, print answer, question
723: # number, print title, print text/html
724: $output .=
725: &PrintQuestion($dbh, $Questions[$i], 1, $i + 1, 0, $text);
726: }
727: return $output;
728: }
729:
730: sub PrintTournament {
731: my ($dbh, $Id, $answer) = @_;
732: my (%Tournament, @Tours, $i, $list, $qnum, $imgsrc, $alt,
733: $SingleTour);
734: my ($output) = '';
735:
736: %Tournament = &GetTournament($dbh, $Id) if ($Id);
737:
738: my ($URL) = $Tournament{'URL'};
739: my ($Info) = $Tournament{'Info'};
740: my ($Copyright) = $Tournament{'Copyright'};
741:
742: @Tours = &GetTours($dbh, $Id);
743:
744: if ($Id) {
745: for ($Tournament{'Type'}) {
746: /Г/ && do {
747: $output .= h2({align=>"center"},
748: "Группа: $Tournament{'Title'} ",
749: "$Tournament{'PlayedAt'}") . p . "\n";
750: last;
751: };
752: /Ч/ && do {
753: return &PrintTour($dbh, $Tours[0], $answer)
754: if ($#Tours == 0);
755:
756: my $title="Пакет: $Tournament{'Title'}";
757: if ($Tournament{'PlayedAt'}) {
758: $title .= " $Tournament{'PlayedAt'}";
759: }
760:
761: $output .= h2({align=>"center"},
762: "$title") . p . "\n";
763: last;
764: };
765: /Т/ && do {
766: return &PrintTour($dbh, $Id, $answer);
767: };
768: }
769: } else {
770: my ($qnum) = GetQNum($dbh);
771: $output .= h2("Банк Вопросов: $qnum вопросов") . p . "\n";
772: }
773:
774: for ($i = 0; $i <= $#Tours; $i++) {
775: %Tournament = &GetTournament($dbh, $Tours[$i]);
776:
777: if ($Tournament{'Type'} =~ /Ч/) {
778: $SingleTour = 0;
779: my (@Tours) = &GetTours($dbh, $Tournament{'Id'});
780: $SingleTour = 1
781: if ($#Tours == 0);
782: }
783: if ($Tournament{'QuestionsNum'} > 0) {
784: $qnum = " ($Tournament{'QuestionsNum'} вопрос" .
785: &Suffix($Tournament{'QuestionsNum'}) . ")\n";
786: } else {
787: $qnum = '';
788: }
789: if ($Tournament{'Type'} =~ /Г/) {
790: $imgsrc = "/icons/folder.gif";
791: $alt = "[*]";
792: } else {
793: $imgsrc = "/icons/folder.gif";
794: $alt = "[-]";
795: }
796:
797: if ($SingleTour or $Tournament{'Type'} =~ /Т/) {
798: $list .= dd(img({src=>$imgsrc, alt=>$alt})
799: . " " . $Tournament{'Title'} . " " .
800: $Tournament{'PlayedAt'} . $qnum) .
801: dl(
802: dd("["
803: . a({href=>url . "?tour=$Tournament{'Id'}&answer=0"},
804: "вопросы") . "] ["
805: . a({href=>url . "?tour=$Tournament{'Id'}&answer=1"},
806: "вопросы + ответы") . "]")
807: );
808: } else {
809: $list .= dd(a({href=>url . "?tour=$Tournament{'Id'}&comp=1"},
810: img({src=>'/icons/compressed.gif', alt=>'[ZIP]', border=>1}))
811: . " " . img({src=>$imgsrc, alt=>$alt})
812: . " " . a({href=>url . "?tour=$Tournament{'Id'}&answer=0"},
813: $Tournament{'Title'}. " ".
814: $Tournament{'PlayedAt'}) . $qnum);
815: }
816: }
817: $output .= dl($list);
818:
819: if ($URL) {
820: $output .=
821: p("Дополнительная информация об этом турнире - по адресу " .
822: a({-'href'=>$URL}, $URL));
823: }
824:
825: if ($Copyright) {
826: $output .= p("Копирайт: " . $Copyright);
827: }
828:
829: if ($Info) {
830: $output .= p($Info);
831: }
832:
833: return $output;
834: }
835:
836: sub Suffix {
837: my ($qnum) = @_;
838: my ($suffix) = 'а' if $qnum =~ /[234]$/;
839: $suffix = '' if $qnum =~ /1$/;
840: $suffix = 'ов' if $qnum =~ /[567890]$/ || $qnum =~ /1.$/;
841: return $suffix;
842: }
843:
844: sub IsTour {
845: my ($dbh, $Id) = @_;
846: my ($sth) = $dbh->prepare("SELECT Type FROM Tournaments
847: WHERE Id=$Id");
848: $sth->execute;
849: return ($sth->fetchrow)[0] =~ /Т/;
850: }
851:
852: # Gets a DB handler (ofcourse) and a tour Id. Prints all the
853: # question of that tour, according to the options.
854: sub PrintTour {
855: my ($dbh, $Id, $answer) = @_;
856: my ($output, $q, $bottom, $field) = ('', 0, '', '');
857:
858: my (%Tour) = &GetTournament($dbh, $Id);
859: my (@Tours) = &GetTours($dbh, $Tour{'ParentId'});
860: my (%Tournament) = &GetTournament($dbh, $Tour{'ParentId'});
861:
862: return 0
863: if ($Tour{'Type'} !~ /Т/);
864:
865: my ($qnum) = $Tour{'QuestionsNum'};
866: my ($suffix) = &Suffix($qnum);
867:
868: $output .= h2({align=>"center"}, $Tournament{"Title"},
869: $Tournament{'PlayedAt'},
870: "<br>", $Tour{"Title"} .
871: " ($qnum вопрос$suffix)\n") . p;
872:
873: my (@Questions) = &GetTourQuestions($dbh, $Id);
874: for ($q = 0; $q <= $#Questions; $q++) {
875: $output .= &PrintQuestion($dbh, $Questions[$q], $answer, 0);
876: }
877:
878: $output .= hr({-'align'=>'center', -'width'=>'80%'});
879:
880: if ($Tournament{'URL'}) {
881: $output .=
882: p("Дополнительная информация об этом турнире - по адресу " .
883: a({-'href'=>$Tournament{'URL'}}, $Tournament{'URL'}));
884: }
885:
886: if ($Tournament{'Copyright'}) {
887: $output .= p("Копирайт: " . $Tournament{'Copyright'});
888: }
889:
890: if ($Tournament{'Info'}) {
891: $output .= p($Tournament{'Info'});
892: }
893:
894:
895: if ($answer == 0) {
896: $bottom .=
897: "[" . a({href=>url . "?tour=$Id&answer=1"}, "ответы") . "] " . br;
898: }
899: if (&IsTour($dbh, $Id - 1)) {
900: $bottom .=
901: "[" . a({href=>url . "?tour=" . ($Id - 1) . "&answer=0"},
902: "предыдущий тур") . "] ";
903: $bottom .=
904: "[" . a({href=>url . "?tour=" . ($Id - 1) . "&answer=1"},
905: "предыдущий тур с ответами") . "] " . br;
906: }
907: if (&IsTour($dbh, $Id + 1)) {
908: $bottom .=
909: "[" . a({href=>url . "?tour=" . ($Id + 1) . "&answer=0"},
910: "следующий тур") . "] ";
911: $bottom .=
912: "[" . a({href=>url . "?tour=" . ($Id + 1) . "&answer=1"},
913: "следующий тур с ответами") . "] ";
914: }
915:
916: $output .=
917: p({align=>"center"}, font({size=>-1}, $bottom));
918:
919: return $output;
920: }
921:
922: sub PrintField {
923: my ($header, $value, $text) = @_;
924: if ($text) {
925: $value =~ s/<[\/\w]*>//sg;
926: } else {
927: $value =~ s/^\s+/<br> /mg;
928: $value =~ s/^\|([^\n]*)/<pre>$1<\/pre>/mg;
929: }
930:
931: return $text ? "$header:\n$value\n\n" :
932: strong("$header: ") . $value . p . "\n";
933: }
934:
935: # Gets a DB handler (ofcourse) and a question Id. Prints
936: # that question, according to the options.
937: sub PrintQuestion {
938: my ($dbh, $Id, $answer, $qnum, $title, $text) = @_;
939: my ($output, $titles) = ('', '');
940: my (%Question) = &GetQuestion($dbh, $Id);
941: if (!$text) {
942: $output .= hr({width=>"50%"});
943: if ($title) {
944: my (%Tour) = GetTournament($dbh, $Question{'ParentId'});
945: my (%Tournament) = GetTournament($dbh, $Tour{'ParentId'});
946: $titles .=
947: dd(img({src=>"/icons/folder.open.gif"}) . " " .
948: a({href=>url . "?tour=$Tournament{'Id'}"}, $Tournament{'Title'}, $Tournament{'PlayedAt'}));
949: $titles .=
950: dl(dd(img({src=>"/icons/folder.open.gif"}) . " " .
951: a({href=>url . "?tour=$Tour{'Id'}"}, $Tour{'Title'})));
952: }
953: $output .= dl(strong($titles));
954: }
955:
956: $qnum = $Question{'Number'}
957: if ($qnum == 0);
958:
959: $output .=
960: &PrintField("Вопрос $qnum", $Question{'Question'}, $text);
961:
962: if ($answer) {
963: $output .=
964: &PrintField("Ответ", $Question{'Answer'}, $text);
965:
966: if ($Question{'Authors'}) {
967: my $q=$Question{'Authors'};
968:
969: # my $sth=$dbh->prepare("select Authors.Id,Name, Surname, Nicks from Authors, A2Q
970: # where Authors.Id=Author And Question=$Id");
971: # $sth->execute;
972: # my ($AuthorId,$Name, $Surname,$other,$Nicks);
973:
974: # while ((($AuthorId,$Name, $Surname,$Nicks)=$sth->fetchrow),$AuthorId)
975: # {
976: # my ($firstletter)=$Name=~m/^./g;
977: # $Name=~s/\./\\\./g;
978: # my $sha="(?:$Name\\s+$Surname)|(?:$Surname\\s+$Name)|(?:$firstletter\\.\\s*$Surname)|(?:$Surname\\s+$firstletter\\.)|(?:$Surname)|(?:$Name)";
979: # if ($Nicks)
980: # {
981: # $Nicks=~s/^\|//;
982: # foreach (split /\|/, $Nicks)
983: # {
984: # s/\s+/ /g;
985: # s/\s+$//;
986: # s/ /\\s+/g;
987: # s/\./\\\./g;
988: # if (s/>$//) {$sha="$sha|(?:$_)"}
989: # else {$sha="(?:$_)|$sha"}
990: # }
991: # }
992: # $q=~s/($sha)/a({href=>url."?qofauthor=$AuthorId"},$1)/ei;
993: # }
994:
995: $output .= &PrintField("Автор(ы)", $q, $text);
996:
997: # $output.= &PrintField("Другие вопросы", $other);
998: }
999:
1000: if ($Question{'Sources'}) {
1001: $output .= &PrintField("Источник(и)", $Question{'Sources'}, $text);
1002: }
1003:
1004: if ($Question{'Comments'}) {
1005: $output .= &PrintField("Комментарии", $Question{'Comments'}, $text);
1006: }
1007: }
1008: # $output.=br.a({href=> url."?metod=proxy&qid=$Id"}, 'Близкие вопросы').p
1009: # if $answer;
1010: return $output;
1011: }
1012:
1013: # Returns the total number of questions currently in the DB.
1014: sub GetQNum {
1015: my ($dbh) = @_;
1016: my ($sth) = $dbh->prepare("SELECT COUNT(*) FROM Questions");
1017: $sth->execute;
1018: return ($sth->fetchrow)[0];
1019: }
1020: sub GetMaxQId {
1021: my ($dbh) = @_;
1022: my ($sth) = $dbh->prepare("SELECT MAX(QuestionId) FROM Questions");
1023: $sth->execute;
1024: return ($sth->fetchrow)[0];
1025: }
1026:
1027: # Returns Id's of 12 random questions
1028: sub Get12Random {
1029: my ($dbh, $type, $num) = @_;
1030: my ($i, @questions, $q, $t, $sth);
1031: my ($qnum) = &GetMaxQId($dbh);
1032: my (%chosen);
1033: srand;
1034:
1035: for ($i = 0; $i < $num; $i++) {
1036: do {
1037: $q = int(rand($qnum));
1038: $sth = $dbh->prepare("SELECT Type FROM Questions
1039: WHERE QuestionId=$q");
1040: $sth->execute;
1041: $t = ($sth->fetchrow)[0];
1042: } until !$chosen{$q} && $t && $type =~ /[$t]/;
1043: $sth->finish;
1044: $chosen{$q} = 'y';
1045: push @questions, $q;
1046: }
1047: return @questions;
1048: }
1049:
1050: sub Include_virtual {
1051: my ($fn, $output) = (@_, '');
1052:
1053: open F , $fn
1054: or return; #die "Can't open the file $fn: $!\n";
1055:
1056: while (<F>) {
1057: if (/<!--#include/o) {
1058: s/<!--#include virtual="\/(.*)" -->/&Include_virtual($1)/e;
1059: }
1060: if (/<!--#exec/o) {
1061: s/<!--#exec.*cmd\s*=\s*"([^"]*)".*-->/`$1`/e;
1062: }
1063: $output .= $_;
1064: }
1065: return $output;
1066: }
1067:
1068: sub PrintArchive {
1069: my($dbh, $Id) = @_;
1070: my ($output, @list, $i);
1071:
1072: my (%Tournament) = &GetTournament($dbh, $Id);
1073: my (@Tours) = &GetTours($dbh, $Id);
1074:
1075: if ($Tournament{'Type'} =~ /Г/ || $Id == 0) {
1076: for ($i = 0; $i <= $#Tours; $i++) {
1077: push(@list ,&PrintArchive($dbh, $Tours[$i]));
1078: }
1079: return @list;
1080: }
1081: return "$SRCPATH/$Tournament{'FileName'} ";
1082: }
1083:
1084: sub PrintAll {
1085: my ($dbh, $Id) = @_;
1086: my ($output, $list, $i);
1087:
1088: my (%Tournament) = &GetTournament($dbh, $Id);
1089: my (@Tours) = &GetTours($dbh, $Id);
1090: my ($New) = ($Id and $Tournament{'Type'} eq 'Ч' and
1091: &NewEnough($Tournament{"CreatedAt"})) ?
1092: img({src=>"/znatoki/dimrub/db/new-sml.gif", alt=>"NEW!"}) : "";
1093:
1094: if ($Id == 0) {
1095: $output = h3("Все турниры");
1096: } else {
1097: $output .= dd(img({src=>"/icons/folder.gif", alt=>"[*]"}) .
1098: " " . a({href=>url . "?tour=$Tournament{'Id'}&answer=0"},
1099: $Tournament{'Title'}) ." " . $Tournament{'PlayedAt'} . " $New");
1100: }
1101: if ($Id == 0 or $Tournament{'Type'} =~ /Г/) {
1102: for ($i = 0; $i <= $#Tours; $i++) {
1103: $list .= &PrintAll($dbh, $Tours[$i]);
1104: }
1105: $output .= dl($list);
1106: }
1107: return $output;
1108: }
1109:
1110: sub PrintDates {
1111: my ($dbh) = @_;
1112: my ($from) = param('from_year') . "-" . param('from_month') .
1113: "-" . param('from_day');
1114: my ($to) = param('to_year') . "-" . param('to_month') . "-" . param('to_day');
1115: $from = $dbh->quote($from);
1116: $to = $dbh->quote($to);
1117: my ($sth) = $dbh->prepare("
1118: SELECT DISTINCT Id
1119: FROM Tournaments
1120: WHERE PlayedAt >= $from AND PlayedAt <= $to
1121: AND Type = 'Ч'
1122: ");
1123: $sth->execute;
1124: my (%Tournament, @array, $output, $list);
1125:
1126: $output = h3("Список турниров, проходивших между $from и $to.");
1127: while (@array = $sth->fetchrow) {
1128: next
1129: if (!$array[0]);
1130: %Tournament = &GetTournament($dbh, $array[0]);
1131: $list .= dd(img({src=>"/icons/folder.gif", alt=>"[*]"}) .
1132: " " . a({href=>url . "?tour=$Tournament{'Id'}&answer=0"},
1133: $Tournament{'Title'}, $Tournament{'PlayedAt'}));
1134: }
1135: $sth->finish;
1136: $output .= dl($list);
1137: return $output;
1138: }
1139:
1140: sub PrintQOfAuthor
1141: {
1142:
1143: my ($dbh, $id) = @_;
1144: $id=$dbh->quote($id);
1145: my $sth = $dbh->prepare("SELECT Name, Surname FROM Authors WHERE Id=$id");
1146: $sth->execute;
1147: my ($name,$surname)=$sth->fetchrow;
1148:
1149: $sth = $dbh->prepare("SELECT Question FROM A2Q WHERE Author=$id");
1150: $sth->execute;
1151: my $q;
1152: my @Questions;
1153: while (($q)=$sth->fetchrow,$q)
1154: {push @Questions,$q unless $forbidden{$q}}
1155: $sth->finish;
1156:
1157: my ($output, $i, $suffix, $hits) = ('', 0, '', $#Questions + 1);
1158:
1159: if ($hits =~ /1.$/ || $hits =~ /[5-90]$/) {
1160: $suffix = 'й';
1161: } elsif ($hits =~ /1$/) {
1162: $suffix = 'е';
1163: } else {
1164: $suffix = 'я';
1165: }
1166: print h2("Поиск в базе вопросов");
1167: print printform;
1168: print p({align=>"center"}, "Автор ".strong("$name $surname. ")
1169: . " : $hits попадани$suffix.");
1170:
1171:
1172: # for ($i = 0; $i <= $#Questions; $i++) {
1173: # $output = &PrintQuestion($dbh, $Questions[$i], 1, $i + 1, 1);
1174: # print $output;
1175: # }
1176: PrintList($dbh,\@Questions,'gdfgdfgdfgdfg');
1177: }
1178:
1179:
1180: sub PrintAuthors
1181: {
1182: my ($dbh,$sort)=@_;
1183: my($output,$out1,@array,$sth);
1184: if ($sort eq 'surname')
1185: {
1186: $sth =
1187: $dbh->prepare("SELECT Id, Name, Surname, QNumber FROM Authors order by Surname, Name");
1188: }
1189: elsif($sort eq 'name')
1190: {
1191: $sth =
1192: $dbh->prepare("SELECT Id, Name, Surname, QNumber FROM Authors order by Name, Surname");
1193: }
1194: else
1195: {
1196: $sth =
1197: $dbh->prepare("SELECT Id, Name, Surname, QNumber FROM Authors Order by QNumber DESC, Surname");
1198: }
1199:
1200: $output.=h2("Авторы вопросов")."\n";
1201: $output.="<TABLE>";
1202:
1203:
1204: $sth->execute;
1205: $output.=Tr(th[a({href=>url."?authors=name"},"Имя")
1206: .", ".
1207: a({href=>url."?authors=surname"},"фамилия")
1208: , a({href=>url."?authors=kvo"},"Количество вопросов")]);
1209:
1210: $out1='';
1211:
1212: my $ar=$sth->fetchall_arrayref;
1213:
1214:
1215:
1216: foreach my $arr(@$ar)
1217: {
1218:
1219: my ($id,$name,$surname,$kvo)=@$arr;
1220: if (!$name || !$surname) {#print "Opanki at $id\n"
1221: } else
1222: {
1223: my $add=Tr(td([a({href=>url."?qofauthor=$id"},"$name $surname"), $kvo]))."\n";
1224: print STDERR $add;
1225: $output.=$add;
1226: }
1227: }
1228: $output.="</TABLE>";
1229: $sth->finish;
1230: return $output;
1231: }
1232:
1233:
1234:
1235: MAIN:
1236: {
1237: setlocale(LC_CTYPE,'russian');
1238: my($i, $tour);
1239: my($text) = (param('text')) ? 1 : 0;
1240:
1241: my($dbh) = DBI->connect("DBI:mysql:chgk", "piataev", "")
1242: or do {
1243: print h1("Временные проблемы") . "База данных временно не
1244: работает. Заходите попозже.";
1245: print &Include_virtual("../dimrub/db/reklama.html");
1246: print end_html;
1247: die "Can't connect to DB chgk\n";
1248: };
1249: if (!param('comp') and !param('sqldump') and !$text) {
1250: print header;
1251: print start_html(-"title"=>'Database of the questions',
1252: -author=>'dimrub@icomverse.com',
1253: -bgcolor=>'#fff0e0',
1254: -vlink=>'#800020');
1255: print &Include_virtual("../dimrub/db/reklama.html");
1256: }
1257:
1258:
1259: if ($^O =~ /win/i) {
1260: $thislocale = "Russian_Russia.20866";
1261: } else {
1262: $thislocale = "ru_RU.KOI8-R";
1263: }
1264: POSIX::setlocale( &POSIX::LC_ALL, $thislocale );
1265:
1266: if ((uc 'а') ne 'А') {print "Koi8-r locale not installed!\n"};
1267:
1268:
1269: if ($text) {
1270: print header('text/plain');
1271: }
1272:
1273: if (param('hideequal')) {
1274: my ($sth)= $dbh -> prepare("select first, second FROM equalto");
1275: $sth -> execute;
1276: while ( my ($first, $second)=$sth -> fetchrow)
1277: {
1278: $forbidden{$first}=1;
1279: }
1280: $sth->finish;
1281: }
1282:
1283:
1284: if (param('rand')) {
1285: my ($type, $qnum) = ('', 12);
1286: $type .= 'Б' if (param('brain'));
1287: $type .= 'Ч' if (param('chgk'));
1288: $qnum = param('qnum') if (param('qnum') =~ /^\d+$/);
1289: $qnum = 0 if (!$type);
1290: if (param('email') && -x $SENDMAIL &&
1291: open(F, "| $SENDMAIL -t -n")) {
1292: my ($Email) = param('email');
1293: my ($mime_type) = $text ? "plain" : "html";
1294: print F <<EOT;
1295: To: $Email
1296: From: olegstemanov\@mail.ru
1297: Subject: Sluchajnij Paket Voprosov "Chto? Gde? Kogda?"
1298: MIME-Version: 1.0
1299: Content-type: text/$mime_type; charset="koi8-r"
1300:
1301: EOT
1302: print F &PrintRandom($dbh, $type, $qnum, $text);
1303: close F;
1304: print "Пакет случайно выбранных вопросов послан. Нажмите
1305: на <B>Reload</B> для получения еще одного пакета";
1306: } else {
1307: print &PrintRandom($dbh, $type, $qnum, $text);
1308: }
1309: }
1310: elsif (param('authors')){
1311: print &PrintAuthors($dbh,param('authors'));
1312: }
1313: elsif (param('qofauthor')){
1314: &PrintQOfAuthor($dbh,param('qofauthor'));
1315: }
1316: elsif (param('sstr')) {
1317: &PrintSearch($dbh, param('sstr'), param('metod'));
1318: }
1319: elsif (param('qid')) {
1320: my $qid=param('qid');
1321: my $query="SELECT Question, Answer from Questions where QuestionId=$qid";
1322: print $query if $printqueries;
1323: my $sth=$dbh->prepare($query);
1324: $sth->execute;
1325: my $sstr= join ' ',$sth->fetchrow;
1326: $sth->finish;
1327: $searchin{'Question'}=1;
1328: $searchin{'Answer'}=1;
1329: $sstr=~tr/ёЁ/еЕ/;
1330: $sstr=~s/[^йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮa-zA-Z0-9]/ /gi;
1331: # print &PrintQuestion($dbh,$qid, 1, '!');
1332: &PrintSearch($dbh, $sstr, 'proxy');
1333: }
1334:
1335: elsif (param('all')) {
1336: print &PrintAll($dbh, 0);
1337: } elsif (param('from_year') && param('to_year')) {
1338: print &PrintDates($dbh);
1339: } elsif (param('comp')) {
1340: print header(
1341: -'Content-Type' => 'application/x-zip-compressed; name="db.zip"',
1342: -'Content-Disposition' => 'attachment; filename="db.zip"'
1343: );
1344: $tour = (param('tour')) ? param('tour') : 0;
1345: my (@files) = &PrintArchive($dbh, $tour);
1346: open F, "$ZIP -j - $SRCPATH/COPYRIGHT @files |";
1347: print (<F>);
1348: close F;
1349: $dbh->disconnect;
1350: exit;
1351: } elsif (param('sqldump')) {
1352: print header(
1353: -'Content-Type' => 'application/x-zip-compressed; name="dump.zip"',
1354: -'Content-Disposition' => 'attachment; filename="dump.zip"'
1355: );
1356: open F, "$ZIP -j - $DUMPFILE |";
1357: print (<F>);
1358: close F;
1359: $dbh->disconnect;
1360: exit;
1361:
1362: } else {
1363: $tour = (param('tour')) ? param('tour') : 0;
1364: if ($tour !~ /^[0-9]*$/) {
1365: my ($sth) = $dbh->prepare("SELECT Id FROM Tournaments
1366: WHERE FileName = '$tour.txt'");
1367: $sth->execute;
1368: $tour = ($sth->fetchrow)[0];
1369: $sth->finish;
1370: }
1371: print &PrintTournament($dbh, $tour, param('answer'));
1372: }
1373: if (!$text) {
1374: print &Include_virtual("../dimrub/db/footer.html");
1375: print end_html;
1376: }
1377: $dbh->disconnect;
1378: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>