--- db/prgsrc/dbchgk.pm 2001/10/31 03:07:18 1.2 +++ db/prgsrc/dbchgk.pm 2010/04/24 17:21:54 1.13 @@ -1,4 +1,23 @@ #!/usr/bin/perl + +=head1 NAME + +dbchgk.pm - модуль для работы с базой + +=head1 SYNOPSIS + + use chgkfiles.pm + +=head1 DESCRIPTION + + Работа с базой + + +=head1 AUTHOR + +Роман Семизаров +=cut + package dbchgk; use DBI; use Exporter; @@ -6,14 +25,15 @@ use vars qw(@ISA @EXPORT); @ISA=qw(Exporter); @EXPORT = qw(&getbase &getquestions &closebase &getrow $z &in2out &getall &addnf &out2in &mydo - &getequalto &forbidden &getquestion &checktable &addword2task &addnest &getwordkeys &getflag &addword2task &cformula - &updateword2question &knownword &incnf &searchmark &knownnf &getnests - &packword &getnfnumbers &getword2question) ; + &getequalto &forbidden &getquestion &checktable &addword2task &addnest &getwordkeys &getflag &addword2task + &updateword2question &updatew2q &knownword &incnf &searchmark &knownnf &getnests + &packword &getnfnumbers &getword2question &addauthors &addquestions2author &addtours2author &getalltours &tableexists) ; my $z; my $qbase; BEGIN {do "chgk.cnf"; $qbase = DBI -> connect ("DBI:mysql:$base",'piataev',undef); + $qbase->do("SET NAMES koi8r"); }; @@ -64,6 +84,18 @@ sub getbase my $select="select $a FROM Questions WHERE QuestionId<=$qnumber"; print "$select\n" if $debug; $z= $qbase -> prepare($select); + print "prepared\n" if $debug; + $result = $z -> execute; + print "executed\n" if $debug; + return $result; +} + +sub getalltours +{ + my $a=join(", ",@_); + my $select="select $a FROM Tournaments -- WHERE Type='Ч'"; + print "$select\n" if $debug; + $z= $qbase -> prepare($select); $z -> execute; } @@ -94,11 +126,73 @@ sub addword2task $qbase -> do("insert into word2question (word,questions) values ($w1,$w2)"); } +sub authorexists +{ + $textid = shift; + $sql = "select 1 from People Where CharId = ".$qbase->quote($textid); + $z = $qbase ->prepare($sql); + $z->execute; + return $z->rows; +} + +sub addauthor +{ + my ($charid,$name,$surname,$nicks)=@_; + if (authorexists($charid)) { + return; + } else { + $_=$qbase ->quote($_) foreach ($charid,$name,$surname,$nicks); + my $query= + "insert into People (CharId,name,surname,Nicks) + values ($charid,$name,$surname,$nicks)"; + mydo($query); + } +} +sub addquestions2author +{ + my ($charid,$name,$surname,$questions,$nicks,$forbidden)=@_; + + my $kvo=scalar grep {!$$forbidden{$_}} @$questions; + + addauthor($charid, $name, $surname, $nicks); + $qbase->do("UPDATE People SET QNumber=$kvo WHERE CharId=".$qbase->quote($charid)); + foreach my $q (@{$questions}) + { + $query="insert into P2Q (Author,Question) + values (".$qbase->quote($charid).",$q)"; + $qbase -> do($query) ; + } +} + +sub addtours2author +{ + my ($charid,$name,$surname,$tours,$nicks)=@_; + my $kvo= @$tours; + + addauthor($charid, $name, $surname, $nicks); + $qbase->do("UPDATE People SET TNumber=$kvo WHERE CharId=".$qbase->quote($charid)); + foreach my $t (@{$tours}) + { + $query="insert into P2T (Author,Tour) + values (".$qbase->quote($charid).",$t)"; + $qbase -> do($query) ; + } +} + sub packword { my ($fieldnumber,$id,$wordnumber)=@_; die "packword: fieldnumber is $fieldnumber! -- id=$id, word=$wordnumber\n" if $fieldnumber>6; - pack("CSC",$fieldnumber,$id,$wordnumber%256) + $r=pack("CSC",$fieldnumber|(($id >> 16) << 4),$id%65536,$wordnumber%256); +} + + +sub updatew2q { + my ($n,$fieldnumber, $id,$wordnumber)=@_; + my ($z,@a); + $query="replace into w2q (wordId,questionId,fieldNumber,wordNumber) values ($n,$id,$fieldnumber,$wordnumber)"; + print "$query\n" if $debug; + $qbase->do($query); } sub updateword2question @@ -268,23 +362,36 @@ sub forbidden keys %getequalto } +sub tableexists { + $TabName = shift; + return grep(/\`$TabName\`/i, &tablelist); +} + sub checktable # если $param='delete' удаляет существующую таблицу, # если $param='ask' спрашивает, не удалить ли # если $param не определено -- просто удаляет. + # если $param='deletedata' -- удаляет из таблицы данные { +print "!"; my ($TabName,$param) = @_; my ($ans); - if (scalar(grep(/^$TabName$/i, &tablelist))) { +print STDERR "!$TabName!\n"; + if (grep(/\`$TabName$\`/i, &tablelist)) { return 1 unless $param; - if ($param eq 'delete') {$ans='y';} + if ($param =~ /delete/) {$ans='y';} else { print "Table $TabName exists. Do you want to delete it? "; $ans = } if ($ans =~ /[yY]/) { + if ($param eq 'delete') { $qbase->do("DROP TABLE $TabName"); print "deleted table $TabName\n"; - return 0; + } else { + $qbase->do("DELETE FROM $TabName"); + print "Deleted everything from $TabName\n"; + } + return 0; } else { return 1 } @@ -294,7 +401,7 @@ sub checktable # если $param='delete' уд sub tablelist { - $qbase->func( '_ListTables' ); + return $qbase->tables(); } sub in2out