aboutsummaryrefslogtreecommitdiff
path: root/boca-1.5.2/src/fanswer.php
blob: b689a72cb3572b9b2a7e40b194426dc07bbf485d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<?php
////////////////////////////////////////////////////////////////////////////////
//BOCA Online Contest Administrator
//    Copyright (C) 2003-2012 by BOCA Development Team (bocasystem@gmail.com)
//
//    This program is free software: you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation, either version 3 of the License, or
//    (at your option) any later version.
//
//    This program is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//    GNU General Public License for more details.
//    You should have received a copy of the GNU General Public License
//    along with this program.  If not, see <http://www.gnu.org/licenses/>.
////////////////////////////////////////////////////////////////////////////////
// Last modified 05/aug/2012 by cassio@ime.usp.br

function DBDropAnswerTable() { 
	 $c = DBConnect();
	 $r = DBExec($c, "drop table \"answertable\"", "DBDropAnswerTable(drop table)");
}
function DBCreateAnswerTable() { 
	 $c = DBConnect();
	 $conf = globalconf();
	 if($conf["dbuser"]=="") $conf["dbuser"]="bocauser";
	 $r = DBExec($c, "
CREATE TABLE \"answertable\" (
\"contestnumber\" int4 NOT NULL,		-- (id do concurso)
\"answernumber\" int4 NOT NULL,			-- (id da reposta)
\"runanswer\" varchar(50) NOT NULL,		-- (reposta dada no julgamento)
\"yes\" bool DEFAULT 'f' NOT NULL,		-- (flag para indicar se conta ponto)
\"fake\" bool DEFAULT 'f' NOT NULL,		-- (flag para indicar se eh resposta valida)
\"updatetime\" int4 DEFAULT EXTRACT(EPOCH FROM now()) NOT NULL, -- (indica a ultima atualizacao no registro)
-- (tipos possiveis de respostas dos juizes. O flag eh para indicar se a resposta eh YES ou NO.)
CONSTRAINT \"answer_pkey\" PRIMARY KEY (\"contestnumber\", \"answernumber\"),
CONSTRAINT \"contest_fk\" FOREIGN KEY (\"contestnumber\") REFERENCES \"contesttable\" (\"contestnumber\") 
	ON DELETE CASCADE ON UPDATE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE
)", "DBCreateAnswerTable(create table)");
         $r = DBExec($c, "REVOKE ALL ON \"answertable\" FROM PUBLIC", "DBCreateAnswerTable(revoke public)");
	 $r = DBExec($c, "GRANT ALL ON \"answertable\" TO \"".$conf["dbuser"]."\"", "DBCreateAnswerTable(grant bocauser)");
	 $r = DBExec($c, "CREATE UNIQUE INDEX \"answer_index\" ON \"answertable\" USING btree ".
	 	"(\"contestnumber\" int4_ops, \"answernumber\" int4_ops)", "DBCreateAnswerTable(create index)");
}

/////////////////////////////////funcoes de respostas a runs///////////////////////////////////////////
//recebe o numero do contest
//devolve um array, onde cada linha tem os atributos number (numero da resposta) e desc (descricao da resposta)
function DBGetAnswers($contest) {
        $c = DBConnect();
        $r = DBExec($c, "select distinct a.answernumber as number, a.runanswer as desc, a.yes as yes, a.fake as fake ".
	     "from answertable as a where a.contestnumber=$contest and a.runanswer !~ '(DEL)' order by a.answernumber", "DBGetAnswers(get answers)");
        $n = DBnlines($r);
        $a = array();
        for ($i=0;$i<$n;$i++)
                $a[$i] = DBRow($r,$i);
        return $a;
}

//recebe o numero do contest e o numero da resposta e remove-a caso seu tipo nao seja fake
function DBDeleteAnswer($contest,$param,$c=null) {
	$ac=array('number');
	foreach($ac as $key) {
		if(!isset($param[$key])) return false;
		$$key = sanitizeText($param[$key]);
	}

	$cw = false;
	if($c == null) {
		$cw = true;
		$c = DBConnect();
		DBExec($c, "begin work", "DBDeleteAnswer(transaction)");
	}
	$r = DBExec($c, "select * from answertable where contestnumber=$contest and answernumber=$number ".
				"and fake='f' for update", "DBDeleteAnswers(delete)");
	if(DBnlines($r)>0) {
		$a = DBRow($r,0);
		$r = DBExec($c, "update answertable set runanswer='".$a["runanswer"] ."(DEL)', updatetime=".time().
					" where contestnumber=$contest and answernumber=$number ".
					"and fake='f'", "DBDeleteAnswers(update)");
		$r = DBExec($c,"select runnumber as number, runsitenumber as site from runtable where contestnumber=$contest and runanswer=$number for update");
		$n = DBnlines($r);
		for ($i=0;$i<$n;$i++) {
			$a = DBRow($r,$i);
			DBRunDelete($a["number"],$a["site"],$contest,$_SESSION["usertable"]["usernumber"],$_SESSION["usertable"]["usersitenumber"]);
		}
	}
	if($cw) DBExec($c, "commit", "DBDeleteAnswer(commit)");
	LOGLevel("Answer $number deleted from contest $contest (user=".$_SESSION["usertable"]["username"]."/".$_SESSION["usertable"]["usersitenumber"].")", 2);
	return true;
}

//insere nova resposta (ou altera o conteudo se a mesma ja existir)
function DBNewAnswer($contest, $param, $c=null) {
	if(isset($param["action"]) && $param["action"]=="delete") {
		return DBDeleteAnswer($contestnumber, $param, $c);
	}

	$ac=array('number','name','yes');
	$type['number']=1;
	foreach($ac as $key) {
		if(!isset($param[$key])) {
			MSGError("DBNewAnswer param error: $key is not set");
			return false;
		}
		$$key = sanitizeText($param[$key]);
		if(isset($type[$key]) && !is_numeric($param[$key])) {
			MSGError("DBNewAnswer param error: $key is not numeric");
			return false;
		}
	}
	$t = time();
	$updatetime=$t;
	if(isset($param['updatetime']) && is_numeric($param["updatetime"])) $updatetime=$param["updatetime"];

	if($yes!="t") $y = "f";
	else $y = "t";

	$cw = false;
	if($c == null) {
		$cw = true;
		$c = DBConnect();
		DBExec($c, "begin work", "DBNewAnswer(transaction)");
	}
	$r = DBExec($c, "select * from answertable as a where a.contestnumber=$contest and a.answernumber=$number for update",
	       "DBNewAnswer(get answer)");
	$n = DBnlines($r);
	$ret=1;
	if ($n == 0) {
		$ret=2;
	      DBExec($c, "insert into answertable (contestnumber, answernumber, runanswer, yes, updatetime) values " .
			 "($contest, $number, '$name', '$y', $t)", "DBNewAnswer(insert answer)");
	      if($cw) DBExec($c, "commit work", "DBNewAnswer(commit)");
	      LOGLevel("Answer $number inserted (contest=$contest,user=".$_SESSION["usertable"]["username"]."/".$_SESSION["usertable"]["usersitenumber"].")", 2);
	} else {
		$lr = DBRow($r,0);
		if($updatetime > $lr['updatetime']) {
			$ret=2;
			DBExec($c, "update answertable set runanswer='$name', yes='$y', updatetime=". $updatetime . " where ".
				   "contestnumber=$contest and answernumber=$number and fake='f'", "DBNewAnswer(update answer)");
			if($cw) DBExec($c, "commit work", "DBNewAnswer(commit)");
			LOGLevel("Answer $number updated (contest=$contest,user=".$_SESSION["usertable"]["username"]."/".$_SESSION["usertable"]["usersitenumber"].")", 2);
		} else {
			if($cw) DBExec($c, "commit work", "DBNewAnswer(commit)");
		}
	}
	return $ret;
}
// eof
?>