--- db/prgsrc/db.cgi 2004/03/17 10:26:31 1.132 +++ db/prgsrc/db.cgi 2006/09/24 19:53:59 1.143 @@ -3,6 +3,7 @@ use DBI; use CGI ':all'; #use strict; +my @softfields=("От Олега Степанова"); use Time::Local; my $proxyredirect=1; use POSIX qw(locale_h); @@ -10,8 +11,9 @@ use locale; use vars qw($opt_z); use Getopt::Std; #my ($dbuser,$dbname,$dbpass,$dbhost); -require "dbdefs.pl"; +eval {require "dbdefs.pl";} ; my $url=url||''; +my @used_stop=(); $dbuser||="piataev"; $dbname||="chgk"; $dbpass||=""; @@ -42,13 +44,13 @@ if ($^O =~ /win/i) { $realHTMLDIR="/html/znatoki/baza/"; } else { - $realHTMLDIR="/home/piataev/public_html/dimrub/db/files/"; + $realHTMLDIR="/home/znatoki/chgk-db/public_html/dimrub/db/files/"; } my $usehtml=$opt_z||0; $usehtml=1; -$usehtml=0 if $url=~/zaba/; +$usehtml=0 if $url=~/zaba/ || $url=~/localhost/; my $usewas=0; my $cashednumber=500; @@ -65,7 +67,7 @@ $outputkvo=100 if $outputkvo>100; if (param('debug')) {$debug=1; $printqueries=1} *STDERR=*STDOUT if $debug; -if ($url !~ /db\.chgk\.info/ && $url !~ /localhost/ && $url !~ /bilbo/ && $url !~ /zaba/) { +if ($url !~ /db\.chgk\.info/ && $url !~ /localhost/ && $url !~ /bilbo/ && $url !~ /zaba/ && $url !~ /question\.chgk\.info/ ) { my $u="http://db.chgk.info/cgi-bin/db.cgi?$qs"; Redirect ($u); exit; @@ -92,8 +94,8 @@ POSIX::setlocale( &POSIX::LC_ALL, $thisl if ((uc 'а') ne 'А') {print STDERR "Koi8-r locale not installed!\n"}; -my %fieldname= (0,'Question', 1, 'Answer', 2, 'Comments', 3, 'Authors', 4, 'Sources'); -my %rusfieldname=('Question','Вопрос', 'Answer', 'Ответ', +my %fieldname= (0,'Question', 1, 'Answer', 2, 'PassCriteria', 3, 'Comments', 4, 'Authors', 5, 'Sources'); +my %rusfieldname=('Question','Вопрос', 'Answer', 'Ответ', 'PassCriteria','Зачёт', 'Comments', 'Комментарии', 'Authors', 'Автор', 'Sources', 'Источник','old','Старый','rus','Новый', 'chgk', 'ЧГК', 'brain', 'Брейн-ринг','game', 'Своя игра', @@ -128,8 +130,8 @@ my $all=param('all'); $all=0 if lc $all eq 'no'; my ($PWD) = `pwd` if $^O!~/win/i; chomp $PWD if $PWD; -my ($SRCPATH) = "/home/piataev/public_html/dimrub/src"; -my ($ZIP) = "/usr/local/bin/zip"; +my ($SRCPATH) = "/home/db-chgk/public_html/dimrub/src"; +my ($ZIP) = "/usr/bin/zip"; my $DUMPFILE = "/tmp/chgkdump"; my ($SENDMAIL) = "/usr/sbin/sendmail"; my ($TMPDIR) = "/var/tmp"; @@ -206,12 +208,12 @@ sub GetTournament { sub fetchquestion { my ($sth,$q,$WithTour)=@_; if ($WithTour) { - ($$q{'QuestionId'}, $$q{'Question'},$$q{'Answer'},$$q{'Comments'},$$q{'Authors'},$$q{'Sources'}, + ($$q{'QuestionId'}, $$q{'Question'},$$q{'Answer'},$$q{'PassCriteria'},$$q{'Comments'},$$q{'Authors'},$$q{'Sources'}, $$q{'Number'}, $$q{'Title'}, $$q{'TourTitle'}, $$q{'FileName'},$$q{'PlayedAt'},$$q{'TourNumber'}) = $sth->fetchrow; } else { - ($$q{'QuestionId'}, $$q{'Question'},$$q{'Answer'},$$q{'Comments'},$$q{'Authors'},$$q{'Sources'}, + ($$q{'QuestionId'}, $$q{'Question'},$$q{'Answer'},$$q{'PassCriteria'},$$q{'Comments'},$$q{'Authors'},$$q{'Sources'}, $$q{'Number'})= $sth->fetchrow; } @@ -233,13 +235,13 @@ sub SelectQuestions { my $query; if ($WithTour) { - $query="SELECT QuestionId, Questions.Question, Answer, Comments, Authors, Sources, + $query="SELECT QuestionId, Questions.Question, Answer, PassCriteria, Comments, Authors, Sources, Questions.Number , t2.Title, t1.Title, t2.FileName, t2.PlayedAt,t1.Number from Questions,Tournaments as t1, Tournaments as t2 WHERE $where"; } else { - $query="SELECT QuestionId, Questions.Question, Answer, Comments, Authors, Sources, + $query="SELECT QuestionId, Questions.Question, Answer, PassCriteria, Comments, Authors, Sources, Questions.Number from Questions WHERE $where"; } @@ -357,11 +359,11 @@ sub printform my $sstr=param('sstr'); my @df=keys %searchin; my %checked; - $checked{lc $_}="" foreach ('Question','Answer','Comments','Authors','Sources','old','rus', + $checked{lc $_}="" foreach ('Question','Answer','PassCriteria','Comments','Authors','Sources','old','rus', 'chgk','brain','igp','game','ehruditka','beskrylka'); @df=('Question', 'Answer') unless @df; $checked{lc $_}="checked" foreach @df; - my $fields=checkbox_group('searchin',['Question','Answer','Comments','Authors','Sources'], [@df], + my $fields=checkbox_group('searchin',['Question','Answer','PassCriteria','Comments','Authors','Sources'], [@df], 'false',\%rusfieldname); @df=param('type'); @df=('chgk','brain','igp','game','ehruditka','beskrylka') unless @df; @@ -387,7 +389,7 @@ action="/znatoki/cgi-bin/db.cgi"> -
Вариант поиска: - + Простой (старый)  "Что? Где? Когда?" @@ -405,11 +407,11 @@ action="/znatoki/cgi-bin/db.cgi">  "Бескрылка"
Расширенный (с учетом грамматики, в вопросах всех типов) + Расширенный (с учетом грамматики, в вопросах всех типов)
Искать: - + Все слова Любое слово @@ -421,6 +423,8 @@ action="/znatoki/cgi-bin/db.cgi"> Ответ
+Зачёт
+
Комментарии
Автор
@@ -429,9 +433,9 @@ action="/znatoki/cgi-bin/db.cgi">
-

Если при попытке поиска выдаётся сообщение об ошибке, + EOT @@ -497,19 +501,31 @@ sub russearch { my %relevance; my @blob; my %count; + my %stop_word; POSIX::setlocale( &POSIX::LC_ALL, $thislocale ); $sstr=~tr/йцукенгшщзхъфывапролджэячсмитьбю/ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ/; # @qw=@w =split (' ', uc $sstr); my $ts=uc $sstr; @qw=@w= $ts=~m/(?:(?:${RLrl})+)|(?:[A-Za-z0-9]+)/gom; - + $query="select nf.word from nf where number>=50000"; + $sth=$dbh->prepare($query); + $sth->execute(); + %stop_word=(); + while (@arr = $sth->fetchrow) + { + $stop_word{$arr[0]}=1; + } + $sth->finish; + #----------- foreach $i (0..$#w) # заполняем массив @nf начальных форм # $nf[$i] -- ссылка на массив возможных # начальных форм словоформы $i { + (push @used_stop, uc $w[$i]),next if $stop_word{uc $w[$i]}; $qw= $dbh->quote (uc $w[$i]); + $query=" select distinct w2 from nests where w1=$qw"; $sth=$dbh -> prepare($query); @@ -554,7 +570,7 @@ $sstr=~tr/йцукенгшщзхъфывапролджэячсмить $_= " word2question.word=$_" foreach @arr; $_= " nf.id=".$_. ' ' foreach @arr1; # @arr=(0) unless @arr; - $query="select questions from word2question where (". (join ' OR ', @arr).") AND length(questions)<80000"; + $query="select questions from word2question where (". (join ' OR ', @arr).") "; $sth=$dbh -> prepare($query); $sth->execute; @@ -616,7 +632,12 @@ $sstr=~tr/йцукенгшщзхъфывапролджэячсмить #Ищем пересечение или объединение списков вопросов (значений %tasksof) foreach $sf (keys %tasksof) { - $count{$_}++ foreach keys %{$tasksof{$sf}}; + foreach (keys %{$tasksof{$sf}}) + { + next if $forbidden{$_}; + $count{$_}++ + } + } @tasks= ($all ? (grep {$count{$_}==$kvo} keys %count) : keys %count) ; @@ -704,13 +725,13 @@ sub Search { ###Simple and advanced query processing. Added by R7 if ($metod eq 'simple' || $metod eq 'advanced') { - foreach (qw/Question Answer Sources Authors Comments/) { + foreach (qw/Question Answer PassCriteria Sources Authors Comments/) { if (param($_)) { push @fields, $_; } } - @fields=(qw/Question Answer Sources Authors Comments/) unless scalar @fields; + @fields=(qw/Question Answer PassCriteria Sources Authors Comments/) unless scalar @fields; my $fields=join ",", @fields; my $q=new Text::Query($sstr, -parse => 'Text::Query::'. @@ -728,7 +749,6 @@ sub Search { ###### { -# foreach (qw/Question Answer Sources Authors Comments/) { foreach (param('searchin')) { # if (param($_)) { push @fields, "IFNULL($_, '')"; @@ -884,7 +904,7 @@ sub PrintList { for (my $i = $first; $i <= $last; $i++) { my $q=$q{$$Questions[$i-1]}; my $output; - $output = &PrintQuestion($dbh, $q, 1, 0, 1,0,1 ); + $output = &PrintQuestion($dbh, $q, 1, 0, 1,$text,1 ); # if (param('metod') && (param('metod') eq 'rus' || param('metod') eq 'proxy')) { $output=~s/\b($shablon)\b/\$1\<\/strong\>/gi; @@ -938,6 +958,8 @@ sub PrintSearch { $Output.= p. "Время поиска: " . (time-$t) ." сек.".p; + $_="\"$_\"" foreach @used_stop; + $Output.= p. (join ', ',@used_stop) ." ignored".p if @used_stop; my ($output, $i, $suffix, $hits) = ('', 0, '', $#Questions + 1); my $shablon; @@ -1256,7 +1278,7 @@ sub PrintTour { my $sth=SelectQuestions($dbh,\@Questions,0); for ($q = 0; $q <= $#Questions; $q++) { fetchquestion($sth,\%q,0); - $output .= &PrintQuestion($dbh, \%q, $answer, 0,0,0,1); + $output .= &PrintQuestion($dbh, \%q, $answer, 0,0,$text,1); } $sth->finish; $output .= hr({-'align'=>'center', -'width'=>'80%'}); @@ -1312,6 +1334,11 @@ sub PrintField { if ($text) { $value =~ s/<[\/\w]*?>//sg; } else { + if ($header=~/Комментар/) + { + $value=~s/^\s*$_[\.:]/p."\n".strong("$_").":"/me foreach @softfields; + } + $value =~ s/^\s+/
    /mg; $value =~ s/(\s+)-+(\s+)/$1–$2/mg; $value =~ s/\s+\–/ \–/mg @@ -1324,7 +1351,10 @@ sub PrintField { # $value =~ s/"/”/mg; } - + if ($value=~/^\s*()?\s*"50%"}) if $answer>=0; if ($title) { - my $fname=$Question{'FileName'}; + $fname=$Question{'FileName'}; $fname=~s/\.txt//; $titles .= dd(img({src=>"/icons/folder.open.gif"}) . " " . @@ -1378,6 +1409,10 @@ sub PrintQuestion { if ($answer==1|| $answer==-1) { $output .= &PrintField("Ответ", $Question{'Answer'}, $text); + if ($Question{'PassCriteria'} ) { + $output .= + &PrintField("Зачёт", $Question{'PassCriteria'}, $text); + } if ($Question{'Authors'} ) { my $q=$Question{'Authors'}; @@ -1446,6 +1481,10 @@ EOTT if ($Question{'Authors'}) { $output .= &PrintField("Автор(ы)", $Question{'Authors'}, $text); } + if ($Question{'PassCriteria'}) { + $output .= &PrintField("Зачёт", $Question{'PassCriteria'}, $text); + } + if ($Question{'Sources'}) { $output .= &PrintField("Источник(и)", $Question{'Sources'}, $text); } @@ -1460,8 +1499,13 @@ $output.="" } $output=~s/\(pic: ([^\)]*)\)/

/g unless $text; + $output=~s/⌡/\ï/g; + $output=~s/⌠/\Ï/g; + $paramtour||=param("tour"); - my $qid=$paramtour ? ($paramtour.".$Question{'Number'}" ): ''; + $fname=$fname.".$Question{'TourNumber'}" if $fname && $Question{'TourNumber'}; +$fname||=param('tour'); + my $qid=$fname ? ($fname.".$Question{'Number'}" ): ''; $output.=br.a({href=> $url."?metod=proxy& qid=$qid"}, 'Близкие вопросы').p @@ -1688,7 +1732,7 @@ sub PrintQOfAuthor $suffix = 'я'; } $Output.= printform; - $Output.= p({align=>"center"}, "Автор ".strong("$name $surname. ") + $Output.= p({align=>"center"}, "Автор ".strong("$name $surname ") . " : $hits попадани$suffix."); @@ -1887,6 +1931,7 @@ sub WriteFile { { print OUT "Вопрос $q:\n".$Question{$tour}[$q]{'Question'}."\n\n"; print OUT "Ответ:\n".$Question{$tour}[$q]{'Answer'}."\n\n"; + print OUT "Зачёт:\n".$Question{$tour}[$q]{'PassCriteria'}."\n\n"; print OUT "Автор:\n".$Question{$tour}[$q]{'Authors'}."\n\n" if !$tourauthor && !$eqauthor && $Question{$tour}[$q]{'Authors'}; print OUT "Комментарий:\n".$Question{$tour}[$q]{'Comments'}."\n\n" @@ -1937,7 +1982,7 @@ MAIN: my $texttour=$tour; my ($sth,$dbh); my($dsn) = "DBI:mysql:database=$dbname;host=$dbhost"; - $dbh = DBI->connect($dsn, $dbuser, $dbpass) + $dbh = DBI->connect($dsn, $dbuser, $dbpass) # $dbh = DBI->connect("DBI:mysql:$dbname", $username, $dbpass) or do { print header.h1("Временные проблемы") . "База вопросов временно не @@ -1949,7 +1994,7 @@ MAIN: if (param('qid') && (param('qid')=~/^\d+$/) || $tour && $tour=~/^\d+$/) { - my $destination='http://chgk.zaba.ru/search.html'; +# my $destination='http://chgk.zaba.ru/search.html'; # print header (-'Content-Type' => 'text/html', # -'Location:'=> 'http:\\db.chgk.info'); Redirect($destination); @@ -2097,6 +2142,7 @@ th {font-size: x-small; font-family : sa } + if (param('rand')) { my ($type, $qnum) = ('', 12); $type.=$TypeName{$_} foreach param('type'); @@ -2186,7 +2232,7 @@ EOT $QuestionNumber=($sth->fetchrow)[0]||0; } if ($QuestionNumber) { - $globaloutput.= &PrintQuestion($dbh, $QuestionNumber, $withanswers||0, $qnum, 1,0,0); + $globaloutput.= &PrintQuestion($dbh, $QuestionNumber, $withanswers||0, $qnum, 1,$text,0); # $dbh, $Id, $answer, $qnum, $title, $text } else { $globaloutput.=&PrintTournament($dbh, $tour, $withanswers);