aboutsummaryrefslogtreecommitdiff
path: root/src/db.php
diff options
context:
space:
mode:
authorcassio <cassiopc@gmail.com>2013-07-02 05:46:45 +0000
committercassio <cassiopc@gmail.com>2013-07-02 05:46:45 +0000
commitbe2491b093b1f0ca430bede679ecbb670041e483 (patch)
treefe2da63d1811cb93e4352a43a113ace37b9f6017 /src/db.php
parenta9aa438ea0558eb0044cf1e54a9190ddb41b65e5 (diff)
downloadboca-be2491b093b1f0ca430bede679ecbb670041e483.tar.gz
boca-be2491b093b1f0ca430bede679ecbb670041e483.zip
restructuring of boca's git
Diffstat (limited to 'src/db.php')
-rw-r--r--src/db.php311
1 files changed, 311 insertions, 0 deletions
diff --git a/src/db.php b/src/db.php
new file mode 100644
index 0000000..6d437dc
--- /dev/null
+++ b/src/db.php
@@ -0,0 +1,311 @@
+<?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 21/jul/2012 by cassio@ime.usp.br
+if(isset($_SESSION["locr"]) && isset($_SESSION["loc"]) && !is_readable($_SESSION["locr"] . '/private/conf.php')) {
+ MSGError('Permission problems in ' . $_SESSION["locr"] . '/private/conf.php - the file must be readable to the user running the web server');
+ exit;
+}
+require_once('hex.php');
+require_once('globals.php');
+require_once('private/conf.php');
+
+//para compatibilidade com versoes velhas e novas do php, varias das funcoes foram
+//colocadas aqui para guarantir a portabilidade. Infelizmente algumas trocas de nomes
+//e parametros aconteceram com a versao 4.2.0 do php.
+function DB_lo_open($conn, $file, $mode) {
+ if (strcmp(phpversion(),'4.2.0')<0)
+ return pg_loopen ($conn, $file, $mode);
+ else
+ return pg_lo_open ($conn, $file, $mode);
+}
+function DB_lo_read_tobrowser($contest,$id) {
+ $str = DB_lo_read($contest,$id);
+ echo $str;
+ return true;
+}
+
+function DB_lo_read($contest,$id,$s=-1) {
+ if (strcmp(phpversion(),'4.2.0')<0) {
+ if($s<0) {
+ $str='';
+ while (($buf = pg_loread ($id, 100000)) != false) $str .= $buf;
+ } else
+ $str = pg_loread ($id, $s);
+ }
+ else {
+ if($s<0) {
+ $str='';
+ while (($buf = pg_lo_read ($id, 100000)) != false) $str .= $buf;
+ } else
+ $str = pg_lo_read ($id, $s);
+ }
+ if(($str2 = DB_unlock($contest,$str))===false) return $str;
+ return $str2;
+}
+function DB_unlock($contest,$str,$c=null) {
+ if($contest <= 0) return false;
+ if(($ct = DBContestInfo($contest,$c)) == null) return false;
+ if(strlen($ct['contestunlockkey']) > 1) {
+ $ar=explode(',',$ct['contestkeys']);
+ foreach($ar as $key) {
+ if(substr($key,0,10) == substr($str,0,10)) {
+ $pass=decryptData(substr($key,15),$ct['contestunlockkey'],'db_unlock');
+ if(substr($pass,0,5) != '#####') continue;
+ $str2=decryptData($str,$pass,'db_unlock2');
+ if($str2=='') continue;
+ return $str2;
+ }
+ }
+ }
+ return false;
+}
+
+function DB_lo_import($conn, $file) {
+ if (strcmp(phpversion(),'4.2.0')<0)
+ return pg_loimport ($file, $conn);
+ else
+ return pg_lo_import ($conn, $file);
+}
+function DB_lo_export($contest, $conn, $oid, $file) {
+ if (strcmp(phpversion(),'4.2.0')<0)
+ $stat= pg_loexport ($oid, $file, $conn);
+ else
+ $stat= pg_lo_export ($oid, $file, $conn);
+ if($stat===false) return false;
+ if(!is_readable($file)) return false;
+ if(($str=DB_unlock($contest,file_get_contents($file),$conn))!==false) {
+ file_put_contents($file,$str);
+ return 2;
+ }
+ return 1;
+}
+function DB_lo_close($id) {
+ if (strcmp(phpversion(),'4.2.0')<0)
+ return pg_loclose ($id);
+ else
+ return pg_lo_close ($id);
+}
+function DB_lo_create($conn) {
+ if (strcmp(phpversion(),'4.2.0')<0)
+ return pg_locreate ($conn);
+ else
+ return pg_lo_create ($conn);
+}
+function DB_lo_write($fp, $data) {
+ if (strcmp(phpversion(),'4.2.0')<0)
+ return pg_lowrite ($fp, $data);
+ else
+ return pg_lo_write ($fp, $data);
+}
+function DB_lo_unlink($conn, $data) {
+ if(($fp = DB_lo_open ($conn, $data, "r"))===false) return false;
+ DB_lo_close($fp);
+ if (strcmp(phpversion(),'4.2.0')<0)
+ return pg_lounlink ($conn, $data);
+ else
+ return pg_lo_unlink ($conn, $data);
+}
+function DB_pg_exec($conn, $data) {
+ if (strcmp(phpversion(),'4.2.0')<0)
+ return pg_exec ($conn, $data);
+ else
+ return pg_query ($conn, $data);
+}
+function escape_string($str) {
+ if(strcmp(phpversion(),'4.2.0')<0)
+ return addslashes($str);
+ else
+ return pg_escape_string($str);
+}
+
+//abrir conexao com o banco de dados
+//temos aqui um problema de seguranca. A senha/usuario para acesso ao postgresql
+//fica guardada em texto plano em um arquivo com permissao de acesso para todos com shell
+//na maquina. O melhor a fazer eh configurar o postgres para permitir acesso no banco de
+//dados do boca ao usuario dono desses arquivos php. Esses problemas nao existem quando
+//shell no servidor do boca+postgres eh restrito.
+function DBConnect($forcenew=false) {
+ // procura por arquivo com as configuracao. se nao achar, usa padroes
+ $conf = globalconf();
+ if($conf["dblocal"]=="true") {
+ if($forcenew)
+ $conn = @pg_connect ("connect_timeout=10 dbname=".$conf["dbname"]." user=".$conf["dbuser"].
+ " password=".$conf["dbpass"],PGSQL_CONNECT_FORCE_NEW);
+ else
+ $conn = @pg_connect ("connect_timeout=10 dbname=".$conf["dbname"]." user=".$conf["dbuser"].
+ " password=".$conf["dbpass"]);
+ } else {
+ if($forcenew)
+ $conn = @pg_connect ("connect_timeout=10 host=".$conf["dbhost"]." port=".$conf["dbport"]." dbname=".$conf["dbname"].
+ " user=".$conf["dbuser"]." password=".$conf["dbpass"],PGSQL_CONNECT_FORCE_NEW);
+ else
+ $conn = @pg_connect ("connect_timeout=10 host=".$conf["dbhost"]." port=".$conf["dbport"]." dbname=".$conf["dbname"].
+ " user=".$conf["dbuser"]." password=".$conf["dbpass"]);
+ }
+ if (!$conn) {
+ LOGError("Unable to connect to database (${conf["dbhost"]},${conf["dbname"]},${conf["dbuser"]}).");
+ MSGError("Unable to connect to database (${conf["dbhost"]}:${conf["dbport"]},${conf["dbname"]},${conf["dbuser"]}). ".
+ "Is it running? Is the DB password in conf.php correct?");
+ exit;
+ }
+ if(isset($conf["dbclientenc"]))
+ DBExecNonStop($conn,"SET NAMES '${conf["dbclientenc"]}'","set client encoding");
+ return $conn;
+}
+//fecha a conexao com o banco (isso nao eh realmente necessario, ja que o php/apache cuidam do servico)
+function DBClose($c) {
+ pg_close($c);
+}
+//executar instrucao no banco de dados, sem finalizar a execucao do php
+//em caso de erro (mas com uma chamada para a funcao LOGLevel)
+//$conn eh a conexao com o banco
+//$sql eh a instrucao sql
+//$txt eh um pequeno texto descrevendo o que esta sendo feito no sql
+function DBExecNonStop($conn,$sql,$txt='') {
+ if($txt=='') $txt='unknown at '.getFunctionName();
+ $result = @DB_pg_exec ($conn, $sql);
+ if (!$result) {
+ LOGLevel("Unable to exec SQL in the database ($txt). " .
+ " Error=(" . pg_errormessage($conn) . ")", 2);
+ }
+ return $result;
+}
+//executar instrucao no banco de dados, finalizando a execucao do php
+//em caso de erro (alem da chamada para a funcao LOGLevel e alerta na tela)
+//$conn eh a conexao com o banco
+//$sql eh a instrucao sql
+//$txt eh um pequeno texto descrevendo o que esta sendo feito no sql
+function DBExec($conn,$sql,$txt='') {
+ if($txt=='') $txt='unknown at '.getFunctionName();
+ $result = DB_pg_exec ($conn, $sql);
+ if (!$result) {
+ LOGError("Unable to exec SQL in the database ($txt). " .
+ " SQL=(" . sanitizeText(str_replace("\n", " ",$sql)) . "Error=(" . sanitizeText(str_replace("\n", " ",pg_errormessage($conn))) . ")");
+ MSGError("Unable to exec SQL in the database ($txt). Aborting.");
+ exit;
+ }
+ return $result;
+}
+//executar instrucao no banco de dados, sem finalizar a execucao do php
+//mesmo em caso de erro (apenas uma janela de aviso tentara ser mostrada ao usuario
+//$conn eh a conexao com o banco
+//$sql eh a instrucao sql
+//$txt eh um pequeno texto descrevendo o que esta sendo feito no sql
+function DBExecNoSQLLog($sql,$txt='') {
+ if($txt=='') $txt='unknown at '.getFunctionName();
+ $conn = DBConnect(true);
+ $result = DB_pg_exec ($conn, $sql);
+ pg_close($conn);
+ if (!$result) {
+ MSGError("Unable to exec SQL in the database ($txt).");
+ }
+ return $result;
+}
+//devolve o numero de linhas da consulta
+function DBnlines ($result) {
+ return pg_numrows ($result);
+}
+//pega uma linha da consulta no formato de array
+function DBRow ($r, $i) {
+ return pg_fetch_array ($r, $i, PGSQL_ASSOC);
+}
+//faz a consulta e pega uma linha da consulta no formato de array
+//$sql eh a consulta em sql
+//$i eh a linha desejada, comecando de zero
+//$txt eh uma descricao da consulta sendo feita
+function DBGetRow ($sql,$i,$c=null,$txt='') {
+ if($txt=='') $txt='unknown at '.getFunctionName();
+ if($c==null)
+ $c = DBConnect();
+ $r = DBExec($c,$sql,$txt);
+ if (DBnlines($r) < $i+1) return null;
+ $a = DBRow ($r, $i);
+ if (!$a) {
+ LOGError("Unable to get row $i from a query ($txt). SQL=(" . $sql . ")");
+ MSGError("Unable to get row from query ($txt).");
+ exit;
+ }
+ return $a;
+}
+function DBDropDatabase() {
+ $conf = globalconf();
+ if($conf["dblocal"]=="true")
+ $conn = pg_connect ("connect_timeout=10 dbname=template1 user=".$conf["dbsuperuser"]." password=".$conf["dbsuperpass"]);
+ else
+ $conn = pg_connect ("connect_timeout=10 host=".$conf["dbhost"]." port=".$conf["dbport"]." dbname=template1 user=".$conf["dbsuperuser"].
+ " password=".$conf["dbsuperpass"]);
+ if(!$conn) {
+ MSGError("Unable to connect to template1 as ".$conf["dbsuperuser"]);
+ exit;
+ }
+ $r = DBExecNonStop($conn, "drop database ${conf["dbname"]}", "DBDropDatabase(drop)");
+}
+// pg_connect ("options='--client_encoding=UTF8' dbname=template1 ... ????
+function DBCreateDatabase() {
+ $conf = globalconf();
+ if($conf["dblocal"]=="true")
+ $conn = pg_connect ("connect_timeout=10 dbname=template1 user=".$conf["dbsuperuser"]." password=".$conf["dbsuperpass"]);
+ else
+ $conn = pg_connect ("connect_timeout=10 host=".$conf["dbhost"]." port=".$conf["dbport"]." dbname=template1 user=".$conf["dbsuperuser"].
+ " password=".$conf["dbsuperpass"]);
+
+ if(!$conn) {
+ MSGError("Unable to connect to template1 as ".$conf["dbsuperuser"]);
+ exit;
+ }
+ if(isset($conf["dbencoding"]))
+ $r = DBExec($conn, "create database ${conf["dbname"]} with encoding = '${conf["dbencoding"]}'", "DBCreateDatabase(create)");
+ else
+ $r = DBExec($conn, "create database ${conf["dbname"]} with encoding = 'UTF8'", "DBCreateDatabase(create)");
+}
+
+function DBcrc($contest,$id, $c=null) {
+ $docommit=false;
+ if($c == null) {
+ $docommit=true;
+ $c = DBConnect();
+ DBExec($c, "begin work", "DBcrc(begin)");
+ }
+ if(($f = DB_lo_open($c, $id, "r")) === false) {
+ if($docommit)
+ DBExec($c, "commit work", "DBcrc(commit)");
+ // just to return a unique string that will not match any other...
+ return "no-HASH-" . rand() . "-" . rand() . "-" . time();
+ }
+ $str = DB_lo_read($contest,$f);
+ DB_lo_close($f);
+ if($docommit)
+ DBExec($c, "commit work", "DBcrc(commit)");
+ return myshorthash($str);
+}
+
+require_once('flog.php');
+require_once('fclar.php');
+require_once('frun.php');
+require_once('ftask.php');
+require_once('fproblem.php');
+require_once('flanguage.php');
+require_once('fscore.php');
+require_once('fanswer.php');
+require_once('fcontest.php');
+require_once('fbkp.php');
+require_once('fextdata.php');
+require_once('fzip.php');
+require_once('fballoon.php');
+// eof
+?>