--- db/prgsrc/db.cgi 2002/05/10 16:42:40 1.64 +++ db/prgsrc/db.cgi 2002/10/06 08:58:12 1.74 @@ -2,12 +2,11 @@ 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 $printqueries=0; my %forbidden=(); my $debug=0; #added by R7 @@ -16,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/[ЙЦУКЕНГШЩЗХЪЭЖДЛОРПАВЫФЯЧСМИТЬБЮЁ]/; @@ -39,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', @@ -110,7 +112,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 +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); @@ -189,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) ) ) @@ -532,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; @@ -548,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/аА бБ вВ гГ дД еЕ жЖ зЗ иИ йЙ кК лЛ мМ нН оО пП рР сС тТ уУ фФ хХ цЦ чЧ шШ щЩ ьЬ ыЫ эЭ юЮ яЯ/; @@ -580,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.= @@ -646,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 { @@ -739,12 +761,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 +797,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" ): ''; } @@ -798,7 +822,7 @@ sub PrintTournament { /Г/ && do { $output .= h2({align=>"center"}, "Группа: $Tournament{'Title'} ", - "$Tournament{'PlayedAt'}") . p . "\n"; + $Tournament{'PlayedAt'}||'') . p . "\n"; last; }; /Ч/ && do { @@ -821,7 +845,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++) { @@ -873,17 +898,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)); @@ -948,7 +974,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); @@ -1026,6 +1052,8 @@ 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) { @@ -1035,56 +1063,55 @@ sub PrintQuestion { $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'}) { @@ -1095,8 +1122,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/