Annotation of db/prgsrc/updatedb.pl, revision 1.5
1.1 boris 1: #!/usr/local/bin/perl
2:
3: =head1 NAME
4:
5: updatedb.pl - a script for creation of new database.
6:
7: =head1 SYNOPSIS
8:
9: updatedb.pl I<file1> I<file2>....
10:
11:
12: =head1 DESCRIPTION
13:
14: Updates information in the B<chgk> databse. Uses file
15:
16:
17: =head1 BUGS
18:
19: The database, user and password are hardcoded.
20:
21: =head1 AUTHOR
22:
23: Dmitry Rubinstein
24:
1.5 ! boris 25: =head1 $Id: updatedb.pl,v 1.4 2000/10/17 16:56:09 boris Exp boris $
1.1 boris 26:
27: =cut
28:
29: my (%RevMonths) =
1.5 ! boris 30: ('Jan', '1', 'Feb', '2', 'Mar', '3', 'Apr', '4', 'May', '5', 'Jun', '6',
! 31: 'Jul', '7', 'Aug', '8', 'Sep', '9', 'Oct', '10', 'Nov', '11',
! 32: 'Dec', '12',
! 33: 'JAN', '1', 'FEB', '2', 'MAR', '3', 'APR', '4', 'MAY', '5', 'JUN', '6',
! 34: 'JUL', '7', 'AUG', '8', 'SEP', '9', 'OCT', '10', 'NOV', '11',
! 35: 'DEC', '12',
! 36: 'Янв', '0', 'Фев', 1, 'Мар', 2, 'Апр', 3, 'Май', '4',
! 37: 'Июн', '5', 'Июл', 6, 'Авг', '7', 'Сен', '8',
! 38: 'Окт', '9', 'Ноя', '19', 'Дек', '11');
1.1 boris 39: my ($sth);
40:
1.3 boris 41: use vars qw($/);
42:
1.4 boris 43:
1.3 boris 44:
1.1 boris 45: use DBI;
46: use strict;
47:
48: sub UpdateParents {
1.5 ! boris 49: my ($dbh, $ParentId, $all_qnum) = @_;
! 50: if ($ParentId) {
! 51: my ($sth1) = $dbh->prepare("SELECT QuestionsNum, ParentId
! 52: FROM Tournaments WHERE Id = $ParentId");
! 53: $sth1->execute;
! 54: my ($q, $p) = ($sth1->fetchrow)[0, 1];
! 55: $dbh->do("UPDATE Tournaments SET
! 56: QuestionsNum=$q + $all_qnum
! 57: WHERE Id = $ParentId");
! 58: &UpdateParents($dbh, $p, $all_qnum);
! 59: }
1.1 boris 60: }
61:
62: sub getField {
1.5 ! boris 63: my($desc, $dbh) = @_;
! 64: my($key);
! 65: my($value) = ('');
! 66: while (<$desc>) {
! 67: s/
//;
! 68: if ($key && /^\s*$/) {
! 69: chomp $value;
! 70: chomp $key;
! 71: if ($key eq 'Дата') {
! 72: $value =~ s/^(.*)-(.*)-(.*)$/$3-$2-$1/;
! 73: my($month) = $RevMonths{$2};
! 74: $value =~ s/$2/$month/;
! 75: }
! 76: $value = $dbh->quote($value);
! 77: return ($key, $value);
! 78: }
! 79: next if (/^\s*$/);
! 80:
! 81: if (/^(.*):\s*$/ && !$key) {
! 82: $key = $1;
! 83: next;
1.1 boris 84: }
1.5 ! boris 85: if ($key) {
! 86: $value .= $_;
! 87: next;
1.1 boris 88: }
1.5 ! boris 89: }
! 90: if ($key && $value) {
! 91: $value = $dbh->quote($value);
! 92: return ($key, $value);
! 93: }
! 94: return (0, 0);
1.1 boris 95: }
96:
97: sub SelectGroup {
1.5 ! boris 98: my ($dbh, $TourName, $sth, $ParentId, $i, @arr) = @_;
! 99:
! 100: $sth = $dbh->prepare("SELECT Id, Title FROM
1.1 boris 101: Tournaments WHERE Type = 'Г'");
1.5 ! boris 102: $sth->execute;
! 103: print "Выберите группу для турнира:\n$TourName\n\n";
! 104: while (@arr=$sth->fetchrow) {
! 105: print "[$arr[0]] $arr[1]\n";
! 106: }
! 107: $ParentId = <STDIN>;
! 108: print "Вы выбрали турнир: $ParentId\n";
! 109: return $ParentId;
1.1 boris 110: }
111:
112: sub UpdateTournament {
1.5 ! boris 113: my ($dbh, $TournamentId, $field, $value) = @_;
! 114: $dbh->do("UPDATE Tournaments SET $field=$value WHERE Id=$TournamentId")
! 115: or die $dbh->errstr;
1.1 boris 116: }
117:
118: sub UpdateQuestion {
1.5 ! boris 119: my ($dbh, $QuestionId, $field, $value) = @_;
! 120: $dbh->do("UPDATE Questions SET $field=$value
1.1 boris 121: WHERE QuestionId=$QuestionId")
1.5 ! boris 122: or die $dbh->errstr;
1.1 boris 123: }
124:
125: MAIN:
126: {
1.5 ! boris 127: my($key, $value, $addition);
! 128:
! 129: my($source);
! 130:
! 131: my($dbh) = DBI->connect("DBI:mysql:chgk", "piataev", "")
! 132: or die "Can't connect to DB chgk\n";
! 133:
! 134: while ($source = shift) {
! 135: my($PlayedAt) = '';
! 136: my($QuestionId, $TourId, $TournamentId, $ParentId) = (0, 0, 0, 0);
! 137: my($tournum, $qnum, $all_qnum, $qtype) = (0, 0, 0, 'Ч');
! 138: my (@d) = (localtime((stat($source))[9]))[5,4,3];
! 139: $d[1]++;
! 140: $d[0]+=1900;
! 141: my ($CreatedAt) = $dbh->quote( join('-', @d));
! 142: print STDERR "File created on: $CreatedAt\n";
! 143:
! 144: open INFD, $source
! 145: or die "Can't open input file: $!\n";
! 146:
! 147: $source =~ s/^.*\/([^\/]*)$/$1/;
! 148: $source = $dbh->quote($source);
! 149: print STDERR "Processing file: $source \n";
! 150:
! 151: while (($key, $value) = getField(\*INFD, $dbh)) {
! 152: last if (!$key);
! 153:
! 154: if ($key =~ /Мета/) {
! 155: $value =~ s/[^\d]*//g;
! 156: $sth = $dbh->prepare("SELECT Id FROM Tournaments WHERE
1.1 boris 157: MetaId=$value");
1.5 ! boris 158: $sth->execute
! 159: or die "Invalid Meta field: $value";
! 160: $ParentId = ($sth->fetchrow)[0];
! 161: next;
! 162: }
! 163: if ($key =~ /Чемпионат/) {
! 164: $ParentId = &SelectGroup($dbh, $value)
! 165: unless ($ParentId);
! 166: $sth = $dbh->prepare("INSERT INTO Tournaments
! 167: (Title, Type, ParentId, FileName,
! 168: CreatedAt)
! 169: VALUES ($value, 'Ч', $ParentId,
! 170: $source, $CreatedAt)");
! 171: $sth->execute;
! 172: $TournamentId = $sth->{mysql_insertid};
! 173: next;
! 174: }
! 175: if ($key =~ /Тур/) {
! 176: if ($TourId) {
! 177: $dbh->do("UPDATE Tournaments SET QuestionsNum=$qnum
! 178: WHERE Id=$TourId");
! 179: }
! 180: $qnum = 0;
! 181: $qtype = 'Ч';
! 182: $sth = $dbh->prepare("INSERT INTO Tournaments
! 183: (Title, Type, ParentId, CreatedAt)
! 184: VALUES ($value, 'Т', $TournamentId,
! 185: $CreatedAt)");
! 186: $sth->execute;
! 187: $TourId = $sth->{mysql_insertid};
! 188: next;
! 189: }
! 190: if ($key =~ /Вид/) {
! 191: $qtype = $value;
! 192: $qtype =~ s/\'//g;
! 193: next;
! 194: }
! 195: if ($key =~ /Вопрос/) {
! 196: my $query = "INSERT INTO Questions
! 197: (ParentId, Number, Type)
! 198: VALUES ($TourId, $qnum+1, \'$qtype\')";
! 199: $sth = $dbh->prepare($query);
! 200: $sth->execute or print $query;;
! 201: $QuestionId = $sth->{mysql_insertid};
! 202: &UpdateQuestion($dbh, $QuestionId, "Question", $value);
! 203: $qnum++;
! 204: $all_qnum++;
! 205: next;
! 206: }
! 207: &UpdateQuestion($dbh, $QuestionId, "Answer", $value)
! 208: if ($key =~ /Ответ/);
! 209:
! 210: &UpdateQuestion($dbh, $QuestionId, "Authors", $value)
! 211: if ($key =~ /Автор/);
! 212:
! 213: &UpdateQuestion($dbh, $QuestionId, "Sources", $value)
! 214: if ($key =~ /Источник/);
! 215:
! 216: &UpdateQuestion($dbh, $QuestionId, "Comments", $value)
! 217: if ($key =~ /Комментарий/);
! 218:
! 219: &UpdateTournament($dbh, $TournamentId, "URL", $value)
! 220: if ($key =~ /URL/);
! 221:
! 222: &UpdateTournament($dbh, $TournamentId, "Copyright", $value)
! 223: if ($key =~ /Копирайт/);
! 224:
! 225: &UpdateTournament($dbh, $TournamentId, "Info", $value)
! 226: if ($key =~ /Инфо/);
! 227:
! 228: &UpdateTournament($dbh, $TournamentId, "Editors", $value)
! 229: if ($key =~ /Редактор/);
! 230:
! 231: &UpdateTournament($dbh, $TournamentId, "EnteredBy", $value)
! 232: if ($key =~ /Обработан/);
! 233:
! 234: if ($key =~ /Дата/) {
! 235: if ($TourId) {
! 236: &UpdateTournament($dbh, $TourId, "PlayedAt", $value);
! 237: } else {
! 238: &UpdateTournament($dbh, $TournamentId, "PlayedAt", $value);
1.1 boris 239: }
1.5 ! boris 240: }
! 241: }
! 242: $dbh->do("UPDATE Tournaments SET QuestionsNum=$qnum
1.1 boris 243: WHERE Id=$TourId");
1.5 ! boris 244: $dbh->do("UPDATE Tournaments SET QuestionsNum=$all_qnum
1.1 boris 245: WHERE Id=$TournamentId");
1.5 ! boris 246: &UpdateParents($dbh, $ParentId, $all_qnum);
! 247: print STDERR "Total number of questions: $all_qnum \n";
! 248: }
! 249: $dbh->disconnect;
1.1 boris 250: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>