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