--- db/prgsrc/db.cgi 2002/08/01 23:14:00 1.71 +++ db/prgsrc/db.cgi 2002/08/04 11:25:10 1.72 @@ -6,7 +6,7 @@ use strict; use Time::Local; use POSIX qw(locale_h); use locale; -open STDERR, ">>errors1"; +open STDERR, ">/var/tmp/errors1"; my $printqueries=0; my %forbidden=(); my $debug=0; #added by R7 @@ -15,7 +15,10 @@ if (param('debug')) {$debug=1; $printque my %fieldname= (0,'Question', 1, 'Answer', 2, 'Comments', 3, 'Authors', 4, 'Sources'); my %rusfieldname=('Question','Вопрос', 'Answer', 'Ответ', 'Comments', 'Комментарии', 'Authors', 'Автор', - 'Sources', 'Источник','old','Старый','rus','Новый'); + 'Sources', 'Источник','old','Старый','rus','Новый', + 'chgk', 'ЧГК', 'brain', 'Брейн-ринг','game', 'Своя игра', + 'ehruditka', 'Эрудитка', 'beskrylka', 'Бескрылка' +); my %searchin; my $rl=qr/[йцукенгшщзхъфывапролджэячсмитьбюё]/; my $RL=qr/[ЙЦУКЕНГШЩЗХЪЭЖДЛОРПАВЫФЯЧСМИТЬБЮЁ]/; @@ -38,11 +41,11 @@ my $all=param('all'); $all=0 if lc $all eq 'no'; my ($PWD) = `pwd`; chomp $PWD; -my ($SRCPATH) = "$PWD/../dimrub/src"; -my ($ZIP) = "/home/piataev/bin/zip"; +my ($SRCPATH) = "/home/piataev/public_html/dimrub/src"; +my ($ZIP) = "/usr/local/bin/zip"; my $DUMPFILE = "/tmp/chgkdump"; my ($SENDMAIL) = "/usr/sbin/sendmail"; -my ($TMPDIR) = "/tmp"; +my ($TMPDIR) = "/var/tmp"; my ($TMSECS) = 30*24*60*60; my (%RevMonths) = ('Jan', '0', 'Feb', '1', 'Mar', '2', 'Apr', '3', 'May', '4', 'Jun', '5', @@ -170,7 +173,11 @@ sub printform @df=('Question', 'Answer') unless @df; my $fields=checkbox_group('searchin',['Question','Answer','Comments','Authors','Sources'], [@df], 'false',\%rusfieldname); + @df=param('type'); + @df=('chgk','brain','game','ehruditka','beskrylka') unless @df; + my $types=checkbox_group('type',['chgk','brain','game','ehruditka','beskrylka'], [@df], + 'false',\%rusfieldname); my $metod=radio_group(-name=>'metod',-values=>['old','rus'], -default=>(param('metod')||'rus'), -labels=>\%rusfieldname); @@ -188,7 +195,9 @@ table(Tr ( td({-valign=>'TOP'},$inputstring.$submit.p."Метод: $metod".p."Слова: $all"), td({-valign=>'TOP'},(' 'x 8).'Поля:'), - td({-valign=>'TOP'},$fields), td(" "x5), + td({-valign=>'TOP'},$fields), + td({-valign=>'TOP'},(' 'x 1).'Типы:'), + td({-valign=>'TOP'},$types), td(" "x5), td({-valign=>'TOP'},$qnumber) ) ) @@ -531,10 +540,10 @@ sub Search { } else { $sstr = join " OR $f LIKE ", @sar; } - + my $query; $query="SELECT QuestionId FROM Questions - WHERE $f LIKE $sstr ORDER BY QuestionId"; + WHERE ($f LIKE $sstr) AND (".&makewhere.") ORDER BY QuestionId"; print $query if $printqueries; @@ -547,9 +556,23 @@ print $query if $printqueries; } $sth->finish; print "@Questions" if $printqueries; + return @Questions; } +sub makewhere { + my @type=param('type'); + my $type=''; + + $type .= ($_=$TypeName{$_}) foreach @type; + my $where=' 0 '; + foreach (@type) { + $where.= " OR (Type ='$_') OR (Type ='$_Д') "; + } + $where.= "OR (Type='ЧБ')" if ($type=~/Ч|Б/); + return $where; +} + # Substitute every letter by a pair (for case insensitive search). my (@letters) = qw/аА бБ вВ гГ дД еЕ жЖ зЗ иИ йЙ кК лЛ мМ нН оО пП рР сС тТ уУ фФ хХ цЦ чЧ шШ щЩ ьЬ ыЫ эЭ юЮ яЯ/; @@ -579,10 +602,10 @@ sub PrintList { my $qs=query_string; $qs=~s/\;/\&/g; $qs=~s/\&first\=[^\&]+//g; - my $sstr=param('sstr'); + my $sstr=param('sstr')||''; $qs=~s/sstr=[^\&]+/sstr=$sstr/; $qs=~s/\&was=[^\&]+//; - $qs.="&was=$was"; + $qs.="&was=$was"||''; if ($first>$kvo*3+1) { $nav.= @@ -645,7 +668,7 @@ sub PrintList { print "$nav".br."\n"; for (my $i = $first; $i <= $last; $i++) { my $output = &PrintQuestion($dbh, $$Questions[$i-1], 1, 0, 1); - if (param('metod') eq 'rus' || param('metod') eq 'proxy') + if (param('metod') && (param('metod') eq 'rus' || param('metod') eq 'proxy')) { $output=~s/\b($shablon)\b/\$1\<\/strong\>/gi; } else { @@ -873,8 +896,8 @@ sub PrintTournament { "вопросы + ответы") . "]") ); } else { - $list .= dd(#a({href=>url . "?tour=$textid&comp=1"}, - #img({src=>'/icons/compressed.gif', alt=>'[ZIP]', border=>1})). " " . + $list .= dd(a({href=>url . "?tour=$textid&comp=1"}, + img({src=>'/icons/compressed.gif', alt=>'[ZIP]', border=>1})). " " . img({src=>$imgsrc, alt=>$alt}) . " " . a({href=>url . "?tour=$textid&answer=0"}, $Tournament{'Title'}. " ". @@ -1211,7 +1234,6 @@ sub PrintArchive { my (%Tournament) = &GetTournament($dbh, $Id); my (@Tours) = &GetTours($dbh, $Id); - if ($Tournament{'Type'} =~ /Г/ || $Id == 0) { for ($i = 0; $i <= $#Tours; $i++) { push(@list ,&PrintArchive($dbh, $Tours[$i])); @@ -1388,8 +1410,11 @@ a({href=>url."?authors=surname"},"фамили sub WriteFile { my ($dbh,$fname) = @_; + $fname=~s/\s+$//; + $fname=~s/^\s+//; $fname=~s/\.txt$//; $fname=~s/.*\/(\w+)/$1/; + my $query= "SELECT Id, Title, Copyright, Info, URL, Editors, EnteredBy, PlayedAt, CreatedAt from Tournaments where FileName=".$dbh->quote("$fname.txt"); @@ -1400,7 +1425,7 @@ sub WriteFile { $Editors, $EnteredBy, $PlayedAt, $CreatedAt)= $sth->fetchrow; return -1 unless $Id; - open (OUT, ">$TMPDIR/$fname.txt"); + open (OUT, ">$TMPDIR/$fname.txt") || print STDERR "Error in $fname.txt\n"; print OUT "Чемпионат:\n$Title\n\n"; my $date=$PlayedAt; my ($year,$month,$day)=split /-/, $date; @@ -1439,13 +1464,19 @@ sub WriteFile { my $eqauthor=1; my $qnumber=0; my @arr; - while ( @arr=$sth1->fetchrow, $arr[0]) + while ( (@arr=$sth1->fetchrow), $arr[0]) { - my($i, $name) = 0; + my($i, $name); + $i=0; $qnumber++; foreach $name (@{$sth1->{NAME}}) { - $arr[$i]=~s/^(.*?)\s*$/$1/; - $Question{$tourid}[$qnumber]{$name} = $arr[$i++]; + if ($arr[$i]) { + $arr[$i]=~s/^(.*?)\s*$/$1/; + $Question{$tourid}[$qnumber]{$name} = $arr[$i]; + } else { + $Question{$tourid}[$qnumber]{$name} = + ''} + $i++; } if ($vid) { @@ -1575,6 +1606,28 @@ if ((uc 'а') ne 'А') {print "Koi8-r loca } $sth->finish; } + $tour = (param('tour')) ? param('tour') : 0; + my $sth; + if ($tour !~ /^[0-9]*$/) { + if ($tour=~/\./) + { + my ($fname,$n)= split /\./ , $tour; + + $sth = $dbh->prepare( + "SELECT t2.Id FROM Tournaments as t1, + Tournaments as t2 + WHERE t1.FileName = '$fname.txt' + AND t1.Id=t2.ParentId AND t2.Number=$n"); + } + else + { + $sth = $dbh->prepare("SELECT Id FROM Tournaments + WHERE FileName = '$tour.txt'"); + } + $sth->execute; + $tour = ($sth->fetchrow)[0]; + $sth->finish; + } if (param('rand')) { @@ -1631,20 +1684,30 @@ $sstr=~s/[^йцукенгшщзхъфывапролджэячсмит # print &PrintQuestion($dbh,$qid, 1, '!'); &PrintSearch($dbh, $sstr, 'proxy'); } - - elsif (param('all')) { + elsif (param('getfile')){ + print &writefile + } elsif (param('all')) { print &PrintAll($dbh, 0); } elsif (param('from_year') && param('to_year')) { print &PrintDates($dbh); } elsif (param('comp')) { - print header( - -'Content-Type' => 'application/x-zip-compressed; name="db.zip"', - -'Content-Disposition' => 'attachment; filename="db.zip"' - ); - $tour = (param('tour')) ? param('tour') : 0; + print "Content-Type: application/octet-stream\n"; + print "Content-Type: application/force-download\n"; + print "Content-Type: application/download\n"; + print "Content-Type: application/x-zip-compressed; name=db.zip\n"; + print "Content-Disposition: attachment; filename=db.zip \n\n"; +# print header( +# -'Content-Type' => 'application/x-zip-compressed; name="db.zip"', +# -'Content-Type' => 'application/zip', +# -'Content-Disposition' => 'attachment; filename="db.zip"' +# ); + $tour ||= 0; my (@files) = &PrintArchive($dbh, $tour); WriteFile($dbh,$_) foreach @files; - open F, "$ZIP -j - $SRCPATH/COPYRIGHT @files |"; +# open F, "$ZIP -j - $SRCPATH/COPYRIGHT @files |"; + open F, "$ZIP -j - @files |"; + binmode(F); + binmode(STDOUT); print (); close F; $dbh->disconnect; @@ -1661,28 +1724,6 @@ $sstr=~s/[^йцукенгшщзхъфывапролджэячсмит exit; } else { - $tour = (param('tour')) ? param('tour') : 0; - my $sth; - if ($tour !~ /^[0-9]*$/) { - if ($tour=~/\./) - { - my ($fname,$n)= split /\./ , $tour; - - $sth = $dbh->prepare( - "SELECT t2.Id FROM Tournaments as t1, - Tournaments as t2 - WHERE t1.FileName = '$fname.txt' - AND t1.Id=t2.ParentId AND t2.Number=$n"); - } - else - { - $sth = $dbh->prepare("SELECT Id FROM Tournaments - WHERE FileName = '$tour.txt'"); - } - $sth->execute; - $tour = ($sth->fetchrow)[0]; - $sth->finish; - } my $QuestionNumber=0; my $qnum; if ($qnum=param('qnumber')){