diff options
| author | cassio <cassiopc@gmail.com> | 2013-07-02 05:46:45 +0000 |
|---|---|---|
| committer | cassio <cassiopc@gmail.com> | 2013-07-02 05:46:45 +0000 |
| commit | be2491b093b1f0ca430bede679ecbb670041e483 (patch) | |
| tree | fe2da63d1811cb93e4352a43a113ace37b9f6017 /src/flanguage.php | |
| parent | a9aa438ea0558eb0044cf1e54a9190ddb41b65e5 (diff) | |
| download | boca-be2491b093b1f0ca430bede679ecbb670041e483.tar.gz boca-be2491b093b1f0ca430bede679ecbb670041e483.zip | |
restructuring of boca's git
Diffstat (limited to 'src/flanguage.php')
| -rw-r--r-- | src/flanguage.php | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/src/flanguage.php b/src/flanguage.php new file mode 100644 index 0000000..120fad2 --- /dev/null +++ b/src/flanguage.php @@ -0,0 +1,170 @@ +<?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 DBDropLangTable() { + $c = DBConnect(); + $r = DBExec($c, "drop table \"langtable\"", "DBDropLangTable(drop table)"); +} +function DBCreateLangTable() { + $c = DBConnect(); + $conf = globalconf(); + if($conf["dbuser"]=="") $conf["dbuser"]="bocauser"; + $r = DBExec($c, " +CREATE TABLE \"langtable\" ( + \"contestnumber\" int4 NOT NULL, + \"langnumber\" int4 NOT NULL, + \"langname\" varchar(50) NOT NULL, + \"langextension\" varchar(20) NOT NULL, + \"updatetime\" int4 DEFAULT EXTRACT(EPOCH FROM now()) NOT NULL, -- (indica a ultima atualizacao no registro) + CONSTRAINT \"lang_pkey\" PRIMARY KEY (\"contestnumber\", \"langnumber\"), + CONSTRAINT \"contest_fk\" FOREIGN KEY (\"contestnumber\") REFERENCES \"contesttable\" (\"contestnumber\") + ON DELETE CASCADE ON UPDATE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE +)", "DBCreateLangTable(create table)"); + $r = DBExec($c, "REVOKE ALL ON \"langtable\" FROM PUBLIC", "DBCreateLangTable(revoke public)"); + $r = DBExec($c, "GRANT ALL ON \"langtable\" TO \"".$conf["dbuser"]."\"", "DBCreateLangTable(grant bocauser)"); + $r = DBExec($c, "CREATE INDEX \"lang_index\" ON \"langtable\" USING btree ". + "(\"contestnumber\" int4_ops, \"langnumber\" int4_ops)", "DBCreateLangTable(create lang_index)"); + $r = DBExec($c, "CREATE INDEX \"lang_index2\" ON \"langtable\" USING btree ". + "(\"contestnumber\" int4_ops, \"langname\" varchar_ops)", "DBCreateLangTable(create lang_index2)"); +} + +//recebe o numero do contest +//devolve um array, onde cada linha tem os atributos number (numero da linguagem) e name (nome da linguagem) +function DBGetLanguages($contest) { + $c = DBConnect(); + $r = DBExec($c, "select distinct l.langnumber as number, l.langname as name, l.langextension as extension from langtable as l " . + "where l.contestnumber=$contest and l.langname !~ '(DEL)' order by l.langnumber", "DBGetLanguages(get lang)"); + $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 DBDeleteLanguage($contestnumber, $param, $c=null) { + $ac=array('number'); + foreach($ac as $key) { + if(!isset($param[$key])) { + MSGError("DBDeleteLanguage param error: $key not found"); + return false; + } + $$key = sanitizeText($param[$key]); + } + $cw = false; + if($c == null) { + $cw = true; + $c = DBConnect(); + DBExec($c, "begin work", "DBDeleteLanguage(transaction)"); + } + $sql = "select * from langtable where langnumber=$number and contestnumber=$contestnumber"; + + $r = DBExec($c, $sql . " for update", "DBDeleteLanguage(get lang for update)"); + + if(DBnlines($r)>0) { + $a = DBRow($r,0); + $r = DBExec($c, "update langtable set langname='".$a["langname"] ."(DEL)', updatetime=".time(). + " where contestnumber=$contestnumber and langnumber=$number ". + "", "DBDeleteLanguage(update)"); + $r = DBExec($c,"select runnumber as number, runsitenumber as site from runtable where contestnumber=$contestnumber and runlangnumber=$number for update"); + $n = DBnlines($r); + for ($i=0;$i<$n;$i++) { + $a = DBRow($r,$i); + DBRunDelete($a["number"],$a["site"],$contestnumber,$_SESSION["usertable"]["usernumber"],$_SESSION["usertable"]["usersitenumber"]); + } + } + if($cw) DBExec($c, "commit", "DBDeleteLanguage(commit)"); + LOGLevel("Language $number deleted (user=".$_SESSION["usertable"]["username"]. + "/".$_SESSION["usertable"]["usersitenumber"].")", 2); + return true; +} +function DBNewLanguage($contestnumber, $param, $c=null) { + if(isset($param["action"]) && $param["action"]=="delete") { + return DBDeleteLanguage($contestnumber, $param, $c); + } + $ac=array('number','name'); + $ac1=array('updatetime','extension'); + $type['number']=1; + $type['updatetime']=1; + $extension=''; + foreach($ac as $key) { + if(!isset($param[$key]) || $param[$key]=="") { + MSGError("DBNewLanguage param error: $key not found"); + return false; + } + if(isset($type[$key]) && !is_numeric($param[$key])) { + MSGError("DBNewLanguage param error: $key is not numeric"); + return false; + } + $$key = sanitizeText($param[$key]); + } + $updatetime=-1; + foreach($ac1 as $key) { + if(isset($param[$key])) { + $$key = sanitizeText($param[$key]); + if(isset($type[$key]) && !is_numeric($param[$key])) { + MSGError("DBNewLanguage param error: $key is not numeric"); + return false; + } + } + } + $t = time(); + if($updatetime <= 0) + $updatetime=$t; + + $cw = false; + if($c == null) { + $cw = true; + $c = DBConnect(); + DBExec($c, "begin work", "DBNewLanguage(transaction)"); + } + + $sql2 = "select * from langtable where contestnumber=$contestnumber and langnumber=$number"; + + $r = DBExec ($c, $sql2 . " for update", "DBNewLanguage(get lang)"); + $n = DBnlines($r); + $ret=1; + if ($n == 0) { + DBExec ($c, "insert into langtable (contestnumber,langnumber, langname,langextension) values ". + "($contestnumber, $number, '$name','$extension')", "DBNewLanguage(insert lang)"); + $s = "created"; + } + else { + $lr = DBRow($r,0); + $t = $lr['updatetime']; + if($updatetime > $t) { + if ($name != "") + DBExec ($c, "update langtable set langname='$name', updatetime=$updatetime where contestnumber=$contestnumber ". + "and langnumber=$number", "DBNewLanguage(update lang)"); + if ($extension != "") + DBExec ($c, "update langtable set langextension='$extension', updatetime=$updatetime where contestnumber=$contestnumber ". + "and langnumber=$number", "DBNewLanguage(update lang)"); + } + $s = "updated"; + } + if($cw) + DBExec($c, "commit work", "DBNewLanguage(commit)"); + if($s=="created" || $updatetime > $t) { + LOGLevel ("Language $number updated (user=".$_SESSION["usertable"]["usernumber"]. + ",site=".$_SESSION["usertable"]["usersitenumber"].",contest=$contestnumber)", 2); + $ret=2; + } + return $ret; +} +// eof +?> |