Annotation of db/prgsrc/dbchgk.pm, revision 1.11

1.2       boris       1: #!/usr/bin/perl
1.3       roma7       2: 
                      3: =head1 NAME
                      4: 
1.6       roma7       5: dbchgk.pm - модуль для работы с базой
1.3       roma7       6: 
1.4       roma7       7: =head1 SYNOPSIS
1.5       roma7       8: 
                      9:   use chgkfiles.pm  
1.4       roma7      10: 
                     11: =head1 DESCRIPTION
                     12: 
1.5       roma7      13:   Работа с базой
1.4       roma7      14: 
                     15: 
1.3       roma7      16: =head1 AUTHOR
                     17: 
                     18: Роман Семизаров
1.4       roma7      19: =cut
1.3       roma7      20: 
1.2       boris      21: package dbchgk;
                     22: use DBI;
                     23: use Exporter;
                     24: use vars qw(@ISA @EXPORT);
                     25: @ISA=qw(Exporter);
                     26: 
                     27: @EXPORT = qw(&getbase &getquestions &closebase &getrow $z &in2out &getall &addnf &out2in &mydo
1.8       roma7      28:              &getequalto &forbidden &getquestion &checktable &addword2task &addnest &getwordkeys &getflag &addword2task 
1.2       boris      29:              &updateword2question &knownword &incnf &searchmark &knownnf &getnests 
1.8       roma7      30:              &packword &getnfnumbers &getword2question &addauthors) ;
1.2       boris      31: 
                     32: my $z;
                     33: my $qbase;
                     34: BEGIN {do "chgk.cnf";  
                     35:           $qbase = DBI -> connect ("DBI:mysql:$base",'piataev',undef);
1.11    ! roma7      36:          $qbase->do("SET NAMES koi8r");
1.2       boris      37:       };
                     38: 
                     39: 
                     40: 
                     41: sub searchmark 
                     42: {
                     43:    my $a=$_[0];
                     44:    $qbase->do ("UPDATE Questions SET ProcessedBySearch=1 WHERE QuestionId=$a")
                     45: }
                     46: 
                     47: sub knownword
                     48: {
                     49:         my $a=$qbase ->quote (uc $_[0]);
                     50:         my $select = "select distinct w2 from nests where w1=$a";
                     51:         print "$select\n" if $debug;
                     52:        my $z=  $qbase -> prepare($select);
                     53:        $z -> execute;
                     54:        my @res;
                     55:        while ( my @ar=$z -> fetchrow)
                     56:         {
                     57:           push (@res,$ar[0])
                     58:         }
                     59:         return @res;
                     60: 
                     61: }
                     62: 
                     63: sub knownnf
                     64: {
                     65:         my $a=$qbase ->quote (uc $_[0]);
                     66:         my $select = "select id from nf where word=$a";
                     67:         print "$select\n" if $debug;
                     68:        my $z=  $qbase -> prepare($select);
                     69:        $z -> execute;
                     70:        my @ar=$z -> fetchrow;
                     71:         return $ar[0];
                     72: }
                     73: 
                     74: sub incnf
                     75: {
                     76:    my $a=$_[0];
                     77:    my $b=$_[1]||1;
                     78:    $qbase -> do ("UPDATE nf SET number=number+$b WHERE id=$a")
                     79: }
                     80: 
                     81: sub getbase
                     82: {    
                     83:         my $a=join(", ",@_);
                     84:         my $select="select $a FROM Questions WHERE QuestionId<=$qnumber";
                     85:         print "$select\n" if $debug;
                     86:        $z=  $qbase -> prepare($select);
                     87:        $z -> execute;
                     88: }
                     89: 
                     90: sub getquestions
                     91: {    
                     92:         my $cond=pop @_;
                     93:         my $a=join(", ",@_);
                     94:         my $select="select $a FROM Questions WHERE QuestionId<=$qnumber AND ($cond)";
                     95:         print "$select\n" if $debug;
                     96:        $z=  $qbase -> prepare($select);
                     97:        $z -> execute;
                     98: }
                     99: 
                    100: 
                    101: sub getword2question
                    102: {    
                    103:         my $select='select word, questions FROM word2question';
                    104: print "$select\n";
                    105:        $z=  $qbase -> prepare($select);
                    106:        $z -> execute;
                    107: }
                    108: 
                    109: 
                    110: sub addword2task
                    111: {
                    112:   ($w1,$w2)=@_;
                    113:   $w2=$qbase -> quote ($w2);
                    114:   $qbase -> do("insert into word2question (word,questions) values ($w1,$w2)");
                    115: }
1.8       roma7     116: 
                    117: sub addauthors
                    118: {
                    119:   my ($charid,$name,$surname,$questions,$nicks,$forbidden)=@_;
                    120:   $_=$qbase -> 
                    121:       quote($_)  foreach ($charid,$name,$surname,$nicks);
                    122:   my $kvo=scalar grep {!$$forbidden{$_}} @$questions;
                    123: my $query="insert into Authors (CharId,name,surname,QNumber,Nicks) 
                    124:                 values ($charid,$name,$surname,".$kvo.",$nicks)";
                    125: 
                    126:  print $query if $debug;
                    127: 
                    128:   $qbase -> do($query);
                    129:  $query="select id from Authors where CharId=$charid";
                    130:  print $query if $debug;
                    131:   my $z= $qbase -> prepare($query);
                    132:   $z -> execute;
                    133:   my @ar=$z->fetchrow;
                    134:   my $id=$ar[0];
                    135: 
                    136: 
                    137: 
                    138: foreach my $q (@{$questions})
                    139: {
                    140:   $query="insert into A2Q (Author,Question) 
                    141:                 values ($id,$q)";
                    142:  print $query if $debug;
                    143:   $qbase -> do($query) ;
                    144: }
                    145: }
                    146: 
1.2       boris     147: 
                    148: sub packword
                    149: {
                    150:   my ($fieldnumber,$id,$wordnumber)=@_;
                    151: die "packword: fieldnumber is $fieldnumber! -- id=$id, word=$wordnumber\n" if $fieldnumber>6;
1.9       roma7     152:   $r=pack("CSC",$fieldnumber|(($id >> 16) << 4),$id%65536,$wordnumber%256);
1.2       boris     153: }
                    154: 
                    155: sub updateword2question
                    156: {
                    157:   my ($n,$addstring,$was)=@_;
                    158:   $addstring=$qbase->quote($addstring);
                    159:   my ($z,@a); 
                    160: 
                    161:   if (!(defined $was))
                    162:   {
                    163:     $query="select word from word2question where word=$n";
                    164: print "$query\n" if $debug;
                    165:     $z=$qbase->prepare($query);
                    166:     $z->execute;
                    167:     @a=$z->fetchrow;
                    168:     $was=$a[0];
                    169:   }
                    170:   my $select=$was ? "UPDATE word2question set questions = CONCAT(questions,$addstring)
                    171:                               where word=$n"
                    172:                  :
                    173:                     "insert into word2question (word,questions) values 
                    174:                     ($n,$addstring)";
                    175: print "$select\n" if $debug;
                    176:   $qbase->do ($select);      
                    177: 
                    178: }
                    179: 
                    180: 
                    181: 
                    182: sub addnest
                    183: {
                    184:   my ($w1,$w2)=@_;
                    185:   $w1=$qbase -> quote($w1);
                    186:   my $query="insert into nests (w1,w2) values ($w1,$w2)";
                    187:   print $query if $debug;
                    188:   $qbase -> do($query);
                    189: }
                    190: 
                    191: sub addnf
                    192: {
                    193:   my ($w0,$w1,$w2,$w3)=@_;
                    194:   $w1=$qbase -> quote($w1);
                    195:   $w2=$qbase -> quote($w2);
                    196:   my $query;
                    197:   my $z=  $qbase -> prepare("select flag,id FROM nf WHERE word=$w1");
                    198:   $z -> execute;
                    199:   my @a=$z->fetchrow;
                    200:   my $id;
                    201:   if ($a[0]) 
                    202:   { 
                    203:     $query="update nf set flag=$w2, number=$w3 WHERE word=$w1";
                    204:     print "$query\n" if $debug;
                    205:     $qbase -> do($query); 
                    206:     return $a[1];
                    207:   }
                    208:   else
                    209:   { 
                    210:     if ($w0)
                    211:     {
                    212:        $query="insert into nf (id,word,flag,number) values ($w0,$w1,$w2,$w3)";
                    213:        $qbase -> do($query);
                    214:        return $w0;
                    215:     }
                    216:     else
                    217:     {
                    218:        $query="insert into nf (word,flag,number) values ($w1,$w2,$w3)";
                    219:        $qbase -> do($query);
                    220:        $query="select id from nf where word=$w1";
                    221: print "$query\n" if $debug;
                    222:        $z=$qbase->prepare($query);
                    223:        $z->execute;
                    224:        ($id)=$z->fetchrow;
                    225:        return $id;
                    226:     }
                    227:   } 
                    228: }
                    229: 
                    230: sub getwordkeys
                    231: {
                    232:        $z=  $qbase -> prepare("select word, flag FROM nf");
                    233:        $z -> execute;
                    234:        my %h;
                    235:        while ( my  ($first, $second)=$z -> fetchrow)
                    236:         {
                    237:             $h{$first}=$second;
                    238:         }
                    239:         $z -> finish;
                    240:         %h;
                    241: }
                    242: 
                    243: 
                    244: sub getequalto
                    245: {    
                    246:        $z=  $qbase -> prepare("select first, second FROM equalto");
                    247:        $z -> execute;
                    248:        my %h;
                    249:        while ( my  ($first, $second)=$z -> fetchrow)
                    250:         {
                    251:             $h{$first}=$second;
                    252:         }
                    253:         $z -> finish;
                    254:         %h;
                    255: }
                    256: 
                    257: sub getnfnumbers
                    258: {    
                    259:        $z=  $qbase -> prepare("select word, id FROM nf");
                    260:        $z -> execute;
                    261:        my %h;
                    262:        while ( my  ($first, $second)=$z -> fetchrow)
                    263:         {
                    264:             $h{$first}=$second;
                    265:         }
                    266:         $z -> finish;
                    267:         %h;
                    268: }
                    269: 
                    270: 
                    271: sub getnests
                    272: {    
                    273:        $z=  $qbase -> prepare("select w1, w2 FROM nests");
                    274:        $z -> execute;
                    275:        my %h;
                    276:        while ( my  ($first, $second)=$z -> fetchrow)
                    277:         {
                    278:             $h{$first}.=" $second";
                    279:         }
                    280:         $z -> finish;
                    281:         %h;
                    282: }
                    283: 
                    284: 
                    285: sub getflag
                    286: {
                    287:         $w=$qbase->quote($_[0]);
                    288:        $z=  $qbase -> prepare("select flag, id from nf where word=$w");
                    289:        $z -> execute;
                    290:        @res=$z->fetchrow();
                    291: 
                    292:        @res;
                    293: }
                    294: 
                    295: 
                    296: sub closebase
                    297: {
                    298:     $z -> finish;
                    299:     $qbase -> disconnect;
                    300: }
                    301: 
                    302: sub getrow
                    303: {
                    304:   $z -> fetchrow
                    305: }
                    306: 
                    307: sub mydo
                    308: {
                    309:   $qbase -> do (shift);
                    310: }
                    311: 
                    312: sub getall
                    313: {
                    314:   $z -> fetchall_arrayref;
                    315: }
                    316: 
                    317: sub forbidden
                    318: {
                    319:    keys %getequalto
                    320: }
                    321: 
                    322: sub checktable # если $param='delete' удаляет существующую таблицу,
                    323:                # если $param='ask' спрашивает, не удалить ли
                    324:                # если $param не определено -- просто удаляет.
1.7       boris     325:                # если $param='deletedata' -- удаляет из таблицы данные
1.2       boris     326: {
                    327:        my ($TabName,$param) = @_;
                    328:        my ($ans);
1.10      boris     329:        if (scalar(grep(/\`$TabName$\`/i, &tablelist))) {
1.2       boris     330:                return 1 unless $param;
1.7       boris     331:                if ($param =~ /delete/) {$ans='y';}
1.2       boris     332:                    else {
                    333:                            print "Table $TabName exists. Do you want to delete it? ";
                    334:                            $ans = <STDIN>
                    335:                         }
                    336:                if ($ans =~ /[yY]/) {
1.7       boris     337:                    if ($param eq 'delete') {
1.2       boris     338:                        $qbase->do("DROP TABLE $TabName");
                    339:                        print "deleted table $TabName\n";
1.7       boris     340:                    } else {
                    341:                        $qbase->do("DELETE FROM $TabName");
                    342:                        print "Deleted everything from $TabName\n";
                    343:                    }
                    344:                    return 0;
1.2       boris     345:                } else {
                    346:                        return 1
                    347:                }
                    348:        }
                    349:  0     
                    350: }
                    351: 
                    352: sub tablelist
                    353: {
1.10      boris     354:     return $qbase->func('_ListTables');
1.2       boris     355: }
                    356: 
                    357: sub in2out
                    358: {
                    359:    $qid=shift;
                    360: 
                    361:    my $z=  $qbase -> prepare ( "select t2.Id, t2.Number, t3.FileName 
                    362:                 from Questions AS t1, Tournaments AS t2 ,  Tournaments AS t3
                    363:                 where (t1.QuestionId = $qid)  && (t1.ParentId = t2.Id) && (t2.ParentId = t3.Id) ");
                    364: 
                    365:    $z -> execute;
                    366:   ($tourid, $tourname, $filename)= $z -> fetchrow;
                    367: 
                    368: 
                    369:    $z=  $qbase -> prepare("select QuestionId  from Questions  WHERE ParentId = $tourid");
                    370: 
                    371:     $z -> execute;
                    372:     my $i;
                    373:     for ($i=1;  ($q= $z->fetchrow) && $q!=$qid; $i++){};
                    374: 
                    375:    $_=lc $_;
                    376:    $filename=~s/\.txt$//i;
                    377:    "$filename\.$tourname\.$i";
                    378: }
                    379: 
                    380: 
                    381: 
                    382: sub out2in
                    383: {
                    384:    @q= split(/\./, lc shift);
                    385: 
                    386:    $q[0].='.txt';
                    387: 
                    388: # 
                    389: 
                    390: 
                    391:    $z=  $qbase -> prepare ( "select q.QuestionId  from Questions as q, 
                    392:                 Tournaments as t1, Tournaments as t2
                    393:                 where (t2.FileName= \"$q[0]\")  && 
                    394:                       (t1.ParentId = t2.Id) && 
                    395:                       (q.ParentId = t1.Id)  && 
                    396:                       (t1.Number=\"$q[1]\")
                    397:             ");
                    398: 
                    399:    $z -> execute;
                    400: #   ($tourid)=$z -> fetchrow or die "Bad identifier". join (".", @q);
                    401: 
                    402: #   print "--$tourid--";
                    403: 
                    404: #   $z=  $qbase -> prepare("select QuestionId  from questions  WHERE ParentId = $tourid");
                    405: 
                    406:     my $i;
                    407:     $z -> execute;
                    408:     for ($i=1;  $i <= $q[2]; $i++){@qq= $z->fetchrow};
                    409: 
                    410:     $z -> finish;
                    411:     $qq[0];
                    412: }
                    413: 
                    414: 
                    415: 1;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>