Annotation of db/prgsrc/updatedb.pl, revision 1.1

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: 
        !            25: =head1 $Id: updatem.pl,v 1.2 2000/10/17 01:47:34 boris Exp $
        !            26: 
        !            27: =cut
        !            28: 
        !            29: my (%RevMonths) = 
        !            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:         'Янв', '0', 'Фев', 1, 'Мар', 2, 'Апр', 3, 'Май', '4',
        !            34:         'Июн', '5', 'Июл', 6, 'Авг', '7', 'Сен', '8', 
        !            35:         'Окт', '9', 'Ноя', '19', 'Дек', '11');
        !            36: my ($sth);
        !            37: 
        !            38: use DBI;
        !            39: use strict;
        !            40: 
        !            41: sub UpdateParents {
        !            42:        my ($dbh, $ParentId, $all_qnum) = @_;
        !            43:        if ($ParentId) {
        !            44:                my ($sth1) = $dbh->prepare("
        !            45:                        SELECT QuestionsNum, ParentId FROM Tournaments WHERE Id = $ParentId
        !            46:                ");
        !            47:                $sth1->execute;
        !            48:                my ($q, $p) = ($sth1->fetchrow)[0, 1];
        !            49:                $dbh->do("
        !            50:                        UPDATE Tournaments SET QuestionsNum=$q + $all_qnum WHERE Id =
        !            51:                        $ParentId");
        !            52:                &UpdateParents($dbh, $p, $all_qnum);
        !            53:        }
        !            54: }
        !            55: 
        !            56: sub getField {
        !            57:        my($desc, $dbh) = @_;
        !            58:        my($key);
        !            59:        my($value) = ('');
        !            60:        while (<$desc>) {
        !            61:                s/
//;
        !            62:                if ($key && /^\s*$/) {
        !            63:                        chomp $value;
        !            64:                        chomp $key;
        !            65:                        if ($key eq 'Дата') {
        !            66:                                $value =~ s/^(.*)-(.*)-(.*)$/$3-$2-$1/;
        !            67:                                my($month) = $RevMonths{$2};
        !            68:                                $value =~ s/$2/$month/;
        !            69:                        }
        !            70:                        $value = $dbh->quote($value);
        !            71:                        return ($key, $value);
        !            72:                }
        !            73:                next if (/^\s*$/);
        !            74: 
        !            75:                if (/^(.*):\s*$/ && !$key) {
        !            76:                        $key = $1;
        !            77:                        next;
        !            78:                }
        !            79:                if ($key) {
        !            80:                        $value .= $_;
        !            81:                        next;
        !            82:                }
        !            83:        }
        !            84:        if ($key && $value) {
        !            85:                $value = $dbh->quote($value);
        !            86:                return ($key, $value);
        !            87:        }
        !            88:        return (0, 0);
        !            89: }
        !            90: 
        !            91: sub SelectGroup {
        !            92:        my ($dbh, $TourName, $sth, $ParentId, $i, @arr) = @_;
        !            93: 
        !            94:        $sth = $dbh->prepare("SELECT Id, Title FROM
        !            95:                Tournaments WHERE Type = 'Г'");
        !            96:        $sth->execute;
        !            97:        print "Выберите группу для турнира:\n$TourName\n\n";
        !            98:        for ($i = 0; $i < $sth->numrows; $i++) {
        !            99:                @arr = $sth->fetchrow;
        !           100:                print "[$arr[0]] $arr[1]\n";
        !           101:        }
        !           102:        $ParentId = <STDIN>;
        !           103:        print "Вы выбрали турнир: $ParentId\n";
        !           104:        return $ParentId;
        !           105: }
        !           106: 
        !           107: sub UpdateTournament {
        !           108:        my ($dbh, $TournamentId, $field, $value) = @_;
        !           109:        $dbh->do("UPDATE Tournaments SET $field=$value WHERE Id=$TournamentId")
        !           110:                or die $dbh->errstr;
        !           111: }
        !           112: 
        !           113: sub UpdateQuestion {
        !           114:        my ($dbh, $QuestionId, $field, $value) = @_;
        !           115:        $dbh->do("UPDATE Questions SET $field=$value 
        !           116:                WHERE QuestionId=$QuestionId")
        !           117:                        or die $dbh->errstr;
        !           118: }
        !           119: 
        !           120: MAIN: 
        !           121: {
        !           122:        my($key, $value, $addition);
        !           123: 
        !           124:        my($source);
        !           125: 
        !           126:        my($dbh) = DBI->connect("DBI:mysql:chgk", "piataev", "")
        !           127:                or die "Can't connect to DB chgk\n";
        !           128: 
        !           129:        while ($source = shift) {
        !           130:                my($PlayedAt) = '';
        !           131:                my($QuestionId, $TourId, $TournamentId, $ParentId) = (0, 0, 0, 0);
        !           132:                my($tournum, $qnum, $all_qnum, $qtype) = (0, 0, 0, 'Ч');
        !           133:                my (@d) = (localtime((stat($source))[9]))[5,4,3];
        !           134:                $d[1]++;
        !           135:                my ($CreatedAt) = $dbh->quote( join('-', @d));
        !           136:                print "File created on: $CreatedAt\n";
        !           137:        
        !           138:                open INFD, $source 
        !           139:                        or die "Can't open input file: $!\n";
        !           140:        
        !           141:                $source =~ s/^.*\/([^\/]*)$/$1/;
        !           142:                $source = $dbh->quote($source);
        !           143:                print "Processing file: $source \n";
        !           144: 
        !           145:                while (($key, $value) = getField(\*INFD, $dbh)) {
        !           146:                        last if (!$key);
        !           147:        
        !           148:                        if ($key =~ /Мета/) {
        !           149:                                $value =~ s/[^\d]*//g;
        !           150:                                $sth = $dbh->prepare("SELECT Id FROM Tournaments WHERE
        !           151:                                        MetaId=$value");
        !           152:                                $sth->execute 
        !           153:                                        or die "Invalid Meta field: $value";
        !           154:                                $ParentId = ($sth->fetchrow)[0];
        !           155:                                next;
        !           156:                        }
        !           157:                        if ($key =~ /Чемпионат/) {
        !           158:                                $ParentId = &SelectGroup($dbh, $value)
        !           159:                                        unless ($ParentId);
        !           160:                                $sth = $dbh->prepare("INSERT INTO Tournaments
        !           161:                                        (Title, Type, ParentId, FileName, CreatedAt) 
        !           162:                                        VALUES ($value, 'Ч', $ParentId, $source,
        !           163:                                        $CreatedAt)");
        !           164:                                $sth->execute;
        !           165:                                $TournamentId = $sth->{insertid};
        !           166:                                next;
        !           167:                        }
        !           168:                        if ($key =~ /Тур/) {
        !           169:                                if ($TourId) {
        !           170:                                        $dbh->do("UPDATE Tournaments SET QuestionsNum=$qnum
        !           171:                                                WHERE Id=$TourId");
        !           172:                                }
        !           173:                                $qnum = 0;
        !           174:                                $qtype = "'Ч'";
        !           175:                                $sth = $dbh->prepare("INSERT INTO Tournaments
        !           176:                                        (Title, Type, ParentId, CreatedAt) 
        !           177:                                        VALUES ($value, 'Т', $TournamentId, $CreatedAt)");
        !           178:                                $sth->execute;
        !           179:                                $TourId = $sth->{insertid};
        !           180:                                next;
        !           181:                        }
        !           182:                        if ($key =~ /Вид/) {
        !           183:                                $qtype = $value;
        !           184:                                next;
        !           185:                        }
        !           186:                        if ($key =~ /Вопрос/) {
        !           187:                                $sth = $dbh->prepare("INSERT INTO Questions 
        !           188:                                        (ParentId, Number, Type) 
        !           189:                                        VALUES ($TourId, $qnum+1, $qtype)");
        !           190:                                $sth->execute;
        !           191:                                $QuestionId = $sth->{insertid};
        !           192:                                &UpdateQuestion($dbh, $QuestionId, "Question", $value);
        !           193:                                $qnum++;
        !           194:                                $all_qnum++;
        !           195:                                next;
        !           196:                        }
        !           197:                        &UpdateQuestion($dbh, $QuestionId, "Answer", $value) 
        !           198:                                if ($key =~ /Ответ/);
        !           199:        
        !           200:                        &UpdateQuestion($dbh, $QuestionId, "Authors", $value) 
        !           201:                                if ($key =~ /Автор/);
        !           202:        
        !           203:                        &UpdateQuestion($dbh, $QuestionId, "Sources", $value) 
        !           204:                                if ($key =~ /Источник/);
        !           205:        
        !           206:                        &UpdateQuestion($dbh, $QuestionId, "Comments", $value) 
        !           207:                                if ($key =~ /Комментарий/);
        !           208:        
        !           209:                        &UpdateTournament($dbh, $TournamentId, "URL", $value)
        !           210:                                if ($key =~ /URL/);
        !           211: 
        !           212:                        &UpdateTournament($dbh, $TournamentId, "Copyright", $value)
        !           213:                                if ($key =~ /Копирайт/);
        !           214: 
        !           215:                        &UpdateTournament($dbh, $TournamentId, "Info", $value)
        !           216:                                if ($key =~ /Инфо/);
        !           217: 
        !           218:                        if ($key =~ /Дата/) {
        !           219:                                if ($TourId) {
        !           220:                                        &UpdateTournament($dbh, $TourId, "PlayedAt", $value);
        !           221:                                } else {
        !           222:                                        &UpdateTournament($dbh, $TournamentId, "PlayedAt", $value);
        !           223:                                }
        !           224:                        }
        !           225:                }
        !           226:                $dbh->do("UPDATE Tournaments SET QuestionsNum=$qnum
        !           227:                        WHERE Id=$TourId");
        !           228:                $dbh->do("UPDATE Tournaments SET QuestionsNum=$all_qnum
        !           229:                        WHERE Id=$TournamentId");
        !           230:                &UpdateParents($dbh, $ParentId, $all_qnum);             
        !           231:        }
        !           232:        $dbh->disconnect;
        !           233: }

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