--- db/prgsrc/db.cgi 2002/01/25 20:47:29 1.62 +++ db/prgsrc/db.cgi 2002/11/10 16:10:53 1.78 @@ -2,12 +2,12 @@ use DBI; use CGI ':all'; -#use Text::Query; use strict; use Time::Local; use POSIX qw(locale_h); use locale; -open STDERR, ">errors1"; +open STDERR, ">/var/tmp/errors1"; +my $newsurl='http://news.chgk.info/'; my $printqueries=0; my %forbidden=(); my $debug=0; #added by R7 @@ -16,7 +16,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', 'Бескрылка', 'igp', 'Интернет' +); my %searchin; my $rl=qr/[йцукенгшщзхъфывапролджэячсмитьбюё]/; my $RL=qr/[ЙЦУКЕНГШЩЗХЪЭЖДЛОРПАВЫФЯЧСМИТЬБЮЁ]/; @@ -30,7 +33,7 @@ my %metodchar=('rus',1,'old',2); my $thislocale; $searchin{$_}=1 foreach param('searchin'); -my %TypeName=('children'=>'Д', 'game'=>'И', +my %TypeName=('children'=>'Д', 'game'=>'Я', 'igp'=>'И', 'chgk'=>'Ч', 'brain'=>'Б', 'beskrylka'=>'Л','ehruditka'=>'Э'); @@ -39,11 +42,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', @@ -110,7 +113,7 @@ sub GetTourQuestions { my (@arr, @Questions); my ($sth) = $dbh->prepare("SELECT QuestionId FROM Questions - WHERE ParentId=$ParentId"); + WHERE ParentId=$ParentId order by Number"); $sth->execute; @@ -171,7 +174,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','igp','game','ehruditka','beskrylka') unless @df; + my $types=checkbox_group('type',['chgk','brain','igp','game','ehruditka','beskrylka'], [@df], + 'false',\%rusfieldname); my $metod=radio_group(-name=>'metod',-values=>['old','rus'], -default=>(param('metod')||'rus'), -labels=>\%rusfieldname); @@ -189,7 +196,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) ) ) @@ -525,17 +534,19 @@ sub Search { for $i (0 .. $#sar) { $sar[$i] = $dbh->quote("%${sar[$i]}%"); } - + $_.=' ' foreach (@fields); # Это чтобы последнее слово поля + # не сливалось с первым словом + # следующего поля, R7 my($f) = "CONCAT(" . join(',', @fields) . ")"; if (param('all') eq 'yes') { $sstr = join " AND $f LIKE ", @sar; } 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; @@ -548,9 +559,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/аА бБ вВ гГ дД еЕ жЖ зЗ иИ йЙ кК лЛ мМ нН оО пП рР сС тТ уУ фФ хХ цЦ чЧ шШ щЩ ьЬ ыЫ эЭ юЮ яЯ/; @@ -580,10 +605,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,8 +670,8 @@ sub PrintList { print "$nav".br."\n"; for (my $i = $first; $i <= $last; $i++) { - my $output = &PrintQuestion($dbh, $$Questions[$i-1], 1, $i, 1); - if (param('metod') eq 'rus' || param('metod') eq 'proxy') + my $output = &PrintQuestion($dbh, $$Questions[$i-1], 1, 0, 1); + if (param('metod') && (param('metod') eq 'rus' || param('metod') eq 'proxy')) { $output=~s/\b($shablon)\b/\$1\<\/strong\>/gi; } else { @@ -739,12 +764,14 @@ print "$query" if $printqueries; $sstr = '[ \.\,:;]' . $sstr . '[ \.\,:\;]'; } - $sstr =~ s/(.)/&NoCase($1)/ge; +# $sstr =~ s/(.)/&NoCase($1)/ge; my @sar; if ($metod ne 'rus') { - (@sar) = split(' ', $sstr); + my $ss=$sstr; + (@sar) = split(' ', $ss); + s/(\W)/\\$1/g foreach (@sar); $shablon=join "|",@sar; } PrintList($dbh,\@Questions,$shablon,$was); @@ -773,7 +800,7 @@ sub PrintRandom { sub PrintEditor { my $t=shift; #ссылка на Хэш с полями - my $ed=$$t{'Editors'}; + my $ed=$$t{'Editors'}||''; my $edname=($ed=~/\,/ ) ? "Редакторы" : "Редактор" ; return $ed? h4({align=>"center"},"$edname: $ed" ): ''; } @@ -787,6 +814,8 @@ sub PrintTournament { %Tournament = &GetTournament($dbh, $Id) if ($Id); my ($URL) = $Tournament{'URL'}; + $URL=~s/http:\/znatoki\/boris\/reports\//$newsurl/ if url=~/kulichki/; + $URL=~s/\/znatoki\/boris\/reports\//$newsurl/ if url=~/kulichki/;; my ($Info) = $Tournament{'Info'}; my ($Copyright) = $Tournament{'Copyright'}; my $fname=$Tournament{'FileName'}; @@ -798,7 +827,7 @@ sub PrintTournament { /Г/ && do { $output .= h2({align=>"center"}, "Группа: $Tournament{'Title'} ", - "$Tournament{'PlayedAt'}") . p . "\n"; + $Tournament{'PlayedAt'}||'') . p . "\n"; last; }; /Ч/ && do { @@ -821,7 +850,8 @@ sub PrintTournament { } } else { my ($qnum) = GetQNum($dbh); - $output .= h2("Банк Вопросов: $qnum вопросов") . p . "\n"; + $output .= h2("Банк Вопросов: $qnum вопрос".&Suffix($qnum)) + . p . "\n"; } for ($i = 0; $i <= $#Tours; $i++) { @@ -840,6 +870,7 @@ sub PrintTournament { $qnum = ''; } if ($Tournament{'Type'} =~ /Г/) { + $SingleTour=0; $imgsrc = "/icons/folder.gif"; $alt = "[*]"; } else { @@ -872,17 +903,18 @@ 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'}. " ". - $Tournament{'PlayedAt'}) . $qnum); + $Tournament{'PlayedAt'}||'') . $qnum); } } $output .= dl($list); if ($URL) { + if (url=~/zaba\.ru/ && $URL=~/^\//){$URL="http://info.chgk.info$URL"} $output .= p("Дополнительная информация об этом турнире - по адресу " . a({-'href'=>$URL}, $URL)); @@ -947,7 +979,7 @@ sub PrintTour { my ($suffix) = &Suffix($qnum); $output .= h2({align=>"center"}, $Tournament{"Title"}, - $Tournament{'PlayedAt'}, + $Tournament{'PlayedAt'}||'', "
", $Tour{"Title"} . " ($qnum вопрос$suffix)\n") . p; $output .=&PrintEditor(\%Tour); @@ -1025,65 +1057,67 @@ sub PrintQuestion { my ($dbh, $Id, $answer, $qnum, $title, $text) = @_; my ($output, $titles) = ('', ''); my (%Question) = &GetQuestion($dbh, $Id); + $qnum = $Question{'Number'} + if ($qnum == 0); if (!$text) { $output .= hr({width=>"50%"}); if ($title) { my (%Tour) = GetTournament($dbh, $Question{'ParentId'}); my (%Tournament) = GetTournament($dbh, $Tour{'ParentId'}); my $fname=$Tournament{'FileName'}; +return "" if $fname=~/mgp0203/; $fname=~s/\.txt//; $titles .= dd(img({src=>"/icons/folder.open.gif"}) . " " . - a({href=>url . "?tour=$fname"}, $Tournament{'Title'}, $Tournament{'PlayedAt'})); + a({href=>url . "?tour=$fname"}, $Tournament{'Title'}, $Tournament{'PlayedAt'}||'')); $titles .= dl(dd(img({src=>"/icons/folder.open.gif"}) . " " . - a({href=>url . "?tour=$fname.$Tour{Number}"}, $Tour{'Title'}))); + a({href=>url . "?tour=$fname.$Tour{Number}#$qnum"}, $Tour{'Title'}))); } $output .= dl(strong($titles)); } - $qnum = $Question{'Number'} - if ($qnum == 0); + + $output.= ""; $output .= &PrintField("Вопрос $qnum", $Question{'Question'}, $text); - if ($answer) { + if ($answer==1) { $output .= &PrintField("Ответ", $Question{'Answer'}, $text); if ($Question{'Authors'}) { my $q=$Question{'Authors'}; - -# my $sth=$dbh->prepare("select Authors.Id,Name, Surname, Nicks from Authors, A2Q -# where Authors.Id=Author And Question=$Id"); -# $sth->execute; -# my ($AuthorId,$Name, $Surname,$other,$Nicks); - -# while ((($AuthorId,$Name, $Surname,$Nicks)=$sth->fetchrow),$AuthorId) -# { -# my ($firstletter)=$Name=~m/^./g; -# $Name=~s/\./\\\./g; -# my $sha="(?:$Name\\s+$Surname)|(?:$Surname\\s+$Name)|(?:$firstletter\\.\\s*$Surname)|(?:$Surname\\s+$firstletter\\.)|(?:$Surname)|(?:$Name)"; -# if ($Nicks) -# { -# $Nicks=~s/^\|//; -# foreach (split /\|/, $Nicks) -# { -# s/\s+/ /g; -# s/\s+$//; -# s/ /\\s+/g; -# s/\./\\\./g; -# if (s/>$//) {$sha="$sha|(?:$_)"} -# else {$sha="(?:$_)|$sha"} -# } -# } -# $q=~s/($sha)/a({href=>url."?qofauthor=$AuthorId"},$1)/ei; -# } - +###АВТОРА!! + my $sth=$dbh->prepare("select Authors.Id,Name, Surname, Nicks from Authors, A2Q + where Authors.Id=Author And Question=$Id"); + $sth->execute; + my ($AuthorId,$Name, $Surname,$other,$Nicks); + + while ((($AuthorId,$Name, $Surname,$Nicks)=$sth->fetchrow),$AuthorId) + { + my ($firstletter)=$Name=~m/^./g; + $Name=~s/\./\\\./g; + my $sha="(?:$Name\\s+$Surname)|(?:$Surname\\s+$Name)|(?:$firstletter\\.\\s*$Surname)|(?:$Surname\\s+$firstletter\\.)|(?:$Surname)|(?:$Name)"; + if ($Nicks) + { + $Nicks=~s/^\|//; + foreach (split /\|/, $Nicks) + { + s/\s+/ /g; + s/\s+$//; + s/ /\\s+/g; + s/\./\\\./g; + if (s/>$//) {$sha="$sha|(?:$_)"} + else {$sha="(?:$_)|$sha"} + } + } + $q=~s/($sha)/a({href=>url."?qofauthor=$AuthorId"},$1)/ei; + } + $output .= &PrintField("Автор(ы)", $q, $text); -# $output.= &PrintField("Другие вопросы", $other); } if ($Question{'Sources'}) { @@ -1094,8 +1128,40 @@ sub PrintQuestion { $output .= &PrintField("Комментарии", $Question{'Comments'}, $text); } } -# $output.=br.a({href=> url."?metod=proxy&qid=$Id"}, 'Близкие вопросы').p -# if $answer; + elsif ($answer==2) { + my $text=$Question{'Answer'}; + $text=~s/\n/