diff options
Diffstat (limited to 'src/fextdata.php')
| -rw-r--r-- | src/fextdata.php | 312 |
1 files changed, 196 insertions, 116 deletions
diff --git a/src/fextdata.php b/src/fextdata.php index 8dfb134..070031a 100644 --- a/src/fextdata.php +++ b/src/fextdata.php @@ -15,7 +15,6 @@ // 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 24/oct/2017 by cassio@ime.usp.br function makeurlhttps($siteurl) { if(substr($siteurl,0,7) == 'http://') @@ -24,10 +23,10 @@ function makeurlhttps($siteurl) { $siteurl = 'https://' . $siteurl; if(substr($siteurl,strlen($siteurl)-1,1) != '/') $siteurl .= '/'; - return $siterul; + return $siteurl; } -function scoretransfer($putname, $localsite, $timeo=5) { +function scoretransfer($putname, $localsite, $timeo=60) { $ds = DIRECTORY_SEPARATOR; if($ds=="") $ds = "/"; $logstr=''; @@ -66,8 +65,10 @@ function scoretransfer($putname, $localsite, $timeo=5) { $tmp = explode(' ',$ct['contestmainsiteurl']); if(count($tmp) >= 3) { $remotesite[count($remotesite)] = $ct['contestmainsiteurl']; - } - } + } else $logstr .= "Main site URL is invalid\n"; + } else $logstr .= "Main site URL not defined\n"; + } else { + $logstr .= "Error to load contest data\n"; } for($i = 0; $i < count($remotesite); $i++) { @@ -81,7 +82,9 @@ function scoretransfer($putname, $localsite, $timeo=5) { // LOGError("url=" .$siteurl . "index.php?getsessionid=1"); $opts = array(); $opts['http']['timeout'] = $timeo; - $context = stream_context_create($opts); + $opts['ssl'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); + $opts['https'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); + $context = stream_context_create($opts); if(($sess = @file_get_contents($siteurl . "index.php?getsessionid=1", 0, $context))===false) { LOGError("scoretransfer: timeout at get session id for $siteurl"); $logstr .= "timeout at get-session-id for $siteurl\n"; @@ -95,14 +98,17 @@ function scoretransfer($putname, $localsite, $timeo=5) { 'http' => array( 'method' => 'GET', 'request_fulluri' => true, - 'header' => 'Cookie: PHPSESSID=' . $sess + 'header' => 'Cookie: PHPSESSID=' . $sess . "\r\n" ) ); if($bocaproxy != "") $opts['http']['proxy'] = $bocaproxy; if($bocaproxypass != "") - $opts['http']['header'] .= "\r\nProxy-Authorization: Basic " . $bocaproxypass; + $opts['http']['header'] .= "Proxy-Authorization: Basic " . $bocaproxypass . "\r\n"; + $opts['http']['header'] .= "Connection: close\r\n"; $opts['http']['timeout'] = $timeo; + $opts['ssl'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); + $opts['https'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); $context = stream_context_create($opts); try { $ok = @file_get_contents($siteurl . "index.php?name=${user}&password=${res}&action=transfer", 0, $context); @@ -138,7 +144,7 @@ function scoretransfer($putname, $localsite, $timeo=5) { @rename($file, $privatedir . $ds . 'remotescores' . $ds . $bn); } $zip->close(); - LOGError("scoretransfer: download OK"); + LOGInfo("scoretransfer: download OK"); $logstr .= "download OK from $siteurl\n"; } else { $logstr .= "reading failed from $siteurl (zip open error)\n"; @@ -164,15 +170,18 @@ function scoretransfer($putname, $localsite, $timeo=5) { 'http' => array( 'method' => 'POST', 'request_fulluri' => true, - 'header' => 'Cookie: PHPSESSID=' . $sess . "\r\nContent-Type: application/x-www-form-urlencoded", + 'header' => 'Cookie: PHPSESSID=' . $sess . "\r\nContent-Type: application/x-www-form-urlencoded\r\n", 'content' => $data_url ) ); if($bocaproxy != "") $opts['http']['proxy'] = $bocaproxy; if($bocaproxypass != "") - $opts['http']['header'] .= "\r\nProxy-Authorization: Basic " . $bocaproxypass; + $opts['http']['header'] .= "Proxy-Authorization: Basic " . $bocaproxypass . "\r\n"; + $opts['http']['header'] .= "Connection: close\r\n"; $opts['http']['timeout'] = $timeo; + $opts['ssl'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); + $opts['https'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); $context = stream_context_create($opts); try { $s = @file_get_contents($siteurl . "site/putfile.php", 0, $context); @@ -184,7 +193,7 @@ function scoretransfer($putname, $localsite, $timeo=5) { $logstr .= "timeout at full upload to $siteurl\n"; } else { if(strpos($s,'SCORE UPLOADED OK') !== false) { - LOGError("scoretransfer: upload OK"); + LOGInfo("scoretransfer: upload OK"); $logstr .= "upload of score to $siteurl OK\n"; } else { LOGError("scoretransfer: upload failed (" . $s . ")"); @@ -200,15 +209,17 @@ function scoretransfer($putname, $localsite, $timeo=5) { 'http' => array( 'method' => 'POST', 'request_fulluri' => true, - 'header' => 'Cookie: PHPSESSID=' . $sess . "\r\nContent-Type: application/x-www-form-urlencoded", + 'header' => 'Cookie: PHPSESSID=' . $sess . "\r\nContent-Type: application/x-www-form-urlencoded\r\n", 'content' => $data_url ) ); if($bocaproxy != "") $opts['http']['proxy'] = $bocaproxy; if($bocaproxypass != "") - $opts['http']['header'] .= "\r\nProxy-Authorization: Basic " . $bocaproxypass; + $opts['http']['header'] .= "Proxy-Authorization: Basic " . $bocaproxypass . "\r\n"; $opts['http']['timeout'] = $timeo; + $opts['ssl'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); + $opts['https'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); $context = stream_context_create($opts); try { $s = @file_get_contents($siteurl . "site/putfilesuper.php", 0, $context); @@ -221,12 +232,12 @@ function scoretransfer($putname, $localsite, $timeo=5) { continue; } else { if(strpos($s,'SCORE UPLOADED OK') !== false) { - LOGError("scoretransfer: upload full OK"); - $logstr .= 'upload of full score to $siteurl OK\n'; + LOGInfo("scoretransfer: upload full OK"); + $logstr .= "upload of full score to $siteurl OK\n"; } else { LOGError("scoretransfer: upload full failed (" . $s . ")"); - $logstr .= 'upload of full score to $siteurl failed (' . $s . ')'; + $logstr .= "upload of full score to $siteurl failed (" . $s . ")\n"; } } } @@ -235,10 +246,11 @@ function scoretransfer($putname, $localsite, $timeo=5) { } -function getMainXML($contest,$timeo=5,$upd=false) { +function getMainXML($contest,$timeo=60,$upd=false) { $ds = DIRECTORY_SEPARATOR; if($ds=="") $ds = "/"; - + $logstr = ''; + // $logstr .= "A: " . now() . "\n" if(is_readable('/etc/boca.conf')) { $pif=parse_ini_file('/etc/boca.conf'); $bocaproxy = @trim($pif['proxy']); @@ -252,28 +264,33 @@ function getMainXML($contest,$timeo=5,$upd=false) { $bocaproxy = ""; $bocaproxypass = ""; } - + // $logstr .= "AA: " . now() . "\n" $privatedir = $_SESSION['locr'] . $ds . "private"; $c = DBConnect(); - if ($c==null) return false; + if ($c==null) { + $logstr .= "local database connection problem\n"; + return $logstr; + } $r = DBExec($c, "select * from contesttable where contestnumber=$contest"); if (DBnLines($r)==0) { - echo "Unable to find the contest $contest in the database.\n"; + $logstr .= "Unable to find the contest $contest in the database.\n"; LOGError("Unable to find the contest $contest in the database."); - return false; + return $logstr; } $ct = DBRow($r,0); $localsite = $ct["contestlocalsite"]; $mainsite = $ct["contestmainsite"]; if(trim($ct['contestmainsiteurl']) == '') { - return false; + $logstr .= "Main site URL not defined\n"; + return $logstr; } $sitedata = explode(' ',$ct['contestmainsiteurl']); if(count($sitedata) < 3) { LOGError("getMainXML: invalid mainsiteurl entry"); - return false; + $logstr .= "Main site URL is invalid\n"; + return $logstr; } if(count($sitedata) == 3 || $upd) { $updatetime=0; @@ -286,17 +303,19 @@ function getMainXML($contest,$timeo=5,$upd=false) { // LOGError("url=" .$siteurl . "index.php?getsessionid=1"); $opts = array(); $opts['http']['timeout'] = $timeo; + $opts['ssl'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); + $opts['https'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); $context = stream_context_create($opts); - echo "Connecting to ". $siteurl . "\n"; + $logstr .= "Connecting to ". $siteurl . " (updatetime=" . $updatetime . ")\n"; try { $sess = @file_get_contents($siteurl . "index.php?getsessionid=1", 0, $context); } catch(Exception $e) { $sess=false; } if($sess===false) { - echo "timeout at connection\n"; + $logstr .= "timeout at connection\n"; LOGError("getMainXML: timeout at get session id for $siteurl"); - return false; + return $logstr; } $user = trim($sitedata[1]); $res = myhash( myhash (trim($sitedata[2])) . $sess); @@ -304,31 +323,39 @@ function getMainXML($contest,$timeo=5,$upd=false) { 'http' => array( 'method' => 'GET', 'request_fulluri' => true, - 'header' => 'Cookie: PHPSESSID=' . $sess + 'header' => 'Cookie: PHPSESSID=' . $sess . "\r\n" ) ); if($bocaproxy != "") $opts['http']['proxy'] = $bocaproxy; if($bocaproxypass != "") - $opts['http']['header'] .= "\r\nProxy-Authorization: Basic " . $bocaproxypass; + $opts['http']['header'] .= "Proxy-Authorization: Basic " . $bocaproxypass . "\r\n"; + $opts['http']['header'] .= "Connection: close\r\n"; $opts['http']['timeout'] = $timeo; + $opts['ssl'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); + $opts['https'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); $context = stream_context_create($opts); - echo "Authorizing\n"; + $logstr .= "Authorizing\n"; try { $ok = @file_get_contents($siteurl . "index.php?name=${user}&password=${res}&action=transfer", 0, $context); } catch(Exception $e) { $ok=false; } if($ok===false) { - echo "timeout at authorization\n"; + $logstr .= "timeout at authorization\n"; LOGError("getMainXML: timeout at login for $siteurl"); - return false; + return $logstr; } + // $logstr .= "AAA: " . now() . "\n" $ti = mytime(); // LOGError("ok=" . $ok); if(substr($ok,strlen($ok)-strlen('TRANSFER OK'),strlen('TRANSFER OK')) == 'TRANSFER OK') { - echo "Generating local data\n"; - $data = encryptData(generateSiteXML($contest, $localsite, $updatetime-30),myhash(trim($sitedata[2]))); + $logstr .= "Generating local data for site [$localsite] at time [$updatetime]\n"; + $data = generateSiteXML($contest, $localsite, $updatetime-30, $localsite); + $logstr .= $data[1]; + // $logstr .= $s; + $data = encryptData($data[0], myhash(trim($sitedata[2])),false); + // $logstr .= "AB: " . now() . "\n" $data_url = http_build_query(array('xml' => $data, 'updatetime' => ($updatetime-30) )); @@ -337,64 +364,75 @@ function getMainXML($contest,$timeo=5,$upd=false) { 'http' => array( 'method' => 'POST', 'request_fulluri' => true, - 'header' => 'Cookie: PHPSESSID=' . $sess . "\r\nContent-Type: application/x-www-form-urlencoded", + 'header' => 'Cookie: PHPSESSID=' . $sess . "\r\nContent-Type: application/x-www-form-urlencoded\r\n", 'content' => $data_url ) ); if($bocaproxy != "") $opts['http']['proxy'] = $bocaproxy; if($bocaproxypass != "") - $opts['http']['header'] .= "\r\nProxy-Authorization: Basic " . $bocaproxypass; + $opts['http']['header'] .= "Proxy-Authorization: Basic " . $bocaproxypass . "\r\n"; + $opts['http']['header'] .= "Connection: close\r\n"; $opts['http']['timeout'] = $timeo; + $opts['ssl'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); + $opts['https'] = array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true); $context = stream_context_create($opts); - echo "Transferring data\n"; + $logstr .= "Transferring data to main server\n"; try { $s = @file_get_contents($siteurl . "site/getsite.php", 0, $context); } catch(Exception $e) { $s=false; } + // $logstr .= "ABB: " . now() . "\n" if($s===false) { - echo "timeout at transferring\n"; + $logstr .= "timeout at transferring\n"; LOGError("getMainXML: timeout at transfer for $siteurl"); - return false; + return $logstr; } - $chstr = "<!-- <OK> -->\n"; + $chstr = "<!-- <OK> --><!-- "; if(strpos($s,$chstr) !== false) { - echo "Transfer succeeded\n"; + $logstr .= "Transfer succeeded\n"; LOGInfo("xmltransfer: OK"); } else { - echo "Transfer error (" . $s . ")\n"; + $logstr .= "Transfer error (" . $s . ")\n"; LOGError("xmltransfer: failed (" . $s . ")"); + $chstr = "<!-- <NOTOK> --><!-- "; } - echo "Processing received data\n"; + $logstr .= "Processing received data from main server\n"; $s = substr($s, strpos($s, $chstr) + strlen($chstr)); + $s = substr($s, 0, strpos($s, " -->")); // LOGError("string: " . substr($s,0,50)); - $s = decryptData($s,myhash (trim($sitedata[2])),'xml from main not ok'); + $s = decryptData($s,myhash(trim($sitedata[2])),'xml from main not ok'); + // $logstr .= "ABBB: " . now() . "\n" if(strtoupper(substr($s,0,5)) != "<XML>") { - echo "Data corrupted\n"; - return false; + $logstr .= "Data corrupted\n"; + return $logstr; } - echo "Importing data to local server\n"; - if(importFromXML($s, $contest, $localsite, false, 1+$ct['updatetime'])) { + $logstr .= "Importing data to local server\n"; + $resp = importFromXML($s, $contest, $localsite, false, 1+$ct['updatetime'], $mainsite); + // $logstr .= "AC: " . now() . "\n" + $logstr .= $resp[1]; + if($resp[0]) { $str = $sitedata[0] . ' ' . $sitedata[1] . ' ' . $sitedata[2] . ' ' . $ti; $ti = 2+$ct['updatetime']; $param = array('contestnumber' => $contest, 'mainsiteurl' => $str, 'updatetime' => $ti); DBUpdateContest ($param, null); - return true; + return $logstr; } else { - echo "Importing error\n"; + $logstr .= "Importing error\n"; LOGError("error importing xml"); } } else { - echo "Transfer error (" . $ok . ")\n"; - LOGError("xmltransfer: failed (" . $ok . ")"); + $logstr .= "Transfer init connection error (" . $ok . ")\n"; + LOGError("xmltransfer: init connection failed (" . $ok . ")"); } - return false; + return $logstr; } -function importFromXML($ar,$contest,$site,$tomain=false,$uptime=0) { +function importFromXML($ar,$contest,$site,$tomain=false,$uptime=0,$mainsite=-1) { LOGInfo("importFromXML: contest $contest site $site tomain $tomain"); + $logstr = ''; if($tomain) $serv='Main'; else $serv='Local'; $data = implode("",explode("\n",$ar)); $parser = xml_parser_create(''); @@ -405,15 +443,15 @@ function importFromXML($ar,$contest,$site,$tomain=false,$uptime=0) { // print_r($tags); // print_r($values); $conn = DBConnect(); - if ($conn==null) return false; - DBExec($conn,"begin work","importFromXML(begin)"); + if ($conn==null) return array(false, $logstr); + //DBExec($conn,"begin work","importFromXML(begin)"); // DBExec($conn,"lock","importFromXML(lock)"); $r = DBExec($conn, "select * from contesttable where contestnumber=$contest"); if (DBnLines($r)==0) { - echo "$serv - error finding contest $contest \n"; + $logstr .= "$serv - error finding contest $contest \n"; LOGError("importFromXML: Unable to find the contest $contest in the database."); // DBExec($conn,"rollback work"); - return false; + return array(false, $logstr); } $ct = DBRow($r,0); @@ -446,105 +484,107 @@ function importFromXML($ar,$contest,$site,$tomain=false,$uptime=0) { if(count($param) < 2) continue; unset($param['number']); - if(!$tomain && $table == "contesttable") { + if($table == "contesttable") { + if($tomain) continue; if($uptime > 0) $param['updatetime']=$uptime; if(($ret=DBUpdateContest ($param, $conn))) { if($ret==2) { - echo "$serv - Contest " . $param["contestnumber"] . " updated\n"; + $logstr .= "$serv - Contest " . $param["contestnumber"] . " updated\n"; LOGInfo("importFromXML: Contest " . $param["contestnumber"] . " updated"); } } else { - echo "$serv - error to update $table ". $param["contestnumber"] . "\n"; + $logstr .= "$serv - error to update $table ". $param["contestnumber"] . "\n"; LOGError("importFromXML: error to update $table ". $param["contestnumber"]); if($conn != null) DBExec($conn,"rollback work"); - return false; + return array(false, $logstr); } + continue; } // LOGInfo("importFromXML: $key params " .print_r( $param,true)); - if(!$tomain && $table == "answertable") { + if($table == "answertable") { + if($tomain) continue; if(($ret=DBNewAnswer ($contest, $param, $conn))) { if($ret==2) { - echo "$serv - Answer " . $param["answernumber"] . " updated\n"; + $logstr .= "$serv - Answer " . $param["answernumber"] . " updated\n"; LOGInfo("importFromXML: Answer " . $param["answernumber"] . " updated"); } } else { - echo "$serv - error to update $table ". $param["answernumber"] . "\n"; + $logstr .= "$serv - error to update $table ". $param["answernumber"] . "\n"; LOGError("importFromXML: error to update $table ". $param["answernumber"]); if($conn != null) DBExec($conn,"rollback work"); - return false; + return array(false, $logstr); } + continue; } - if(!$tomain && $table == "langtable") { + if($table == "langtable") { + if($tomain) continue; if(($ret=DBNewLanguage ($contest,$param, $conn))) { if($ret==2) { - echo "$serv - Language " . $param['langnumber'] ." updated\n"; + $logstr .= "$serv - Language " . $param['langnumber'] ." updated\n"; LOGInfo("importFromXML: Language " . $param['langnumber'] ." updated"); } } else { - echo "$serv - error to update $table ". $param['langnumber'] . "\n"; + $logstr .= "$serv - error to update $table ". $param['langnumber'] . "\n"; LOGError("importFromXML: error to update $table ". $param['langnumber']); if($conn != null) DBExec($conn,"rollback work"); - return false; + return array(false, $logstr); } + continue; } - if(!$tomain && $table == "problemtable") { + if($table == "problemtable") { + if($tomain) continue; if(($ret=DBNewProblem ($contest,$param, $conn))) { if($ret==2) - echo "$serv - Problem " . $param['problemnumber'] ." updated\n"; + $logstr .= "$serv - Problem " . $param['problemnumber'] ." updated\n"; LOGInfo("importFromXML: Problem " . $param['problemnumber'] ." updated"); } else { - echo "$serv - error to update $table ". $param['problemnumber'] . "\n"; + $logstr .= "$serv - error to update $table ". $param['problemnumber'] . "\n"; LOGError("importFromXML: error to update $table " . $param['problemnumber']); if($conn != null) DBExec($conn,"rollback work"); - return false; + return array(false, $logstr); } + continue; } if(isset($param['usersitenumber']) && !isset($param['sitenumber'])) $param['sitenumber']=$param['usersitenumber']; if(isset($param['clarsitenumber']) && !isset($param['sitenumber'])) $param['sitenumber']=$param['clarsitenumber']; if(isset($param['runsitenumber']) && !isset($param['sitenumber'])) $param['sitenumber']=$param['runsitenumber']; - if(!isset($param['sitenumber']) || $param['sitenumber'] != $site) { - echo "$serv - site mismatch $site " . $param['sitenumber'] . "\n"; - LOGError("importFromXML: site mismatch $site " . $param['sitenumber']); + if(!isset($param['sitenumber']) || ($param['sitenumber'] != $site && ($param['sitenumber'] != $mainsite || $tomain))) { + $logstr .= "$serv - site mismatch should be [$site] and is [" . $param['sitenumber'] . "]\n"; + LOGError("importFromXML: site mismatch should be [$site] and is [" . $param['sitenumber'] . "]"); continue; } if($tomain && $table == "sitetable") { - if(!DBNewSite($contest, $conn, $param)) { - echo "$serv - error to update $table \n"; - LOGError("importFromXML: error to update $table"); - if($conn != null) - DBExec($conn,"rollback work"); - return false; - } - if(($ret=DBUpdateSite($param, $conn))) { + DBNewSite($contest, $conn, $param); + if(($ret=DBUpdateSite($param, $conn)) !== false) { if($ret==2) { - echo "$serv - Site " . $param["sitenumber"] . " updated\n"; + $logstr .= "$serv - Site " . $param["sitenumber"] . " updated\n"; LOGInfo("importFromXML: Site " . $param["sitenumber"] . " updated"); } } else { - echo "$serv - error to update $table ". $param["sitenumber"] . "\n"; + $logstr .= "$serv - error to update $table ". $param["sitenumber"] . "\n"; LOGError("importFromXML: error to update $table ". $param["sitenumber"]); if($conn != null) DBExec($conn,"rollback work"); - return false; + return array(false, $logstr); } } if($tomain && $table == "sitetimetable") { if(!DBUpdateSiteTime($contest, $param, $firsttimetime, $conn)) { - echo "$serv - error to update $table \n"; + $logstr .= "$serv - error to update $table \n"; LOGError("importFromXML: error to update $table"); if($conn != null) DBExec($conn,"rollback work"); - return false; + return array(false, $logstr); } else { LOGInfo("importFromXML: SiteTime updated"); } @@ -553,60 +593,60 @@ function importFromXML($ar,$contest,$site,$tomain=false,$uptime=0) { if($table == "usertable") { if(($ret=DBNewUser($param, $conn))) { if($ret==2) { - echo "$serv - User " . $param["usernumber"]."/".$param['sitenumber']. " updated\n"; + $logstr .= "$serv - User " . $param["usernumber"]."/".$param['sitenumber']. " updated\n"; LOGInfo("importFromXML: User " . $param["usernumber"]."/".$param['sitenumber']. " updated"); } } else { - echo "$serv - error to update $table ". $param["usernumber"]."/".$param['sitenumber'] . "\n"; + $logstr .= "$serv - error to update $table ". $param["usernumber"]."/".$param['sitenumber'] . "\n"; LOGError("importFromXML: error to update $table ". $param["usernumber"]."/".$param['sitenumber']); if($conn != null) DBExec($conn,"rollback work"); - return false; + return array(false, $logstr); } } if($table == "tasktable") { if(($ret=DBNewTask ($param, $conn))) { if($ret==2) { - echo "$serv - Task " . $param['tasknumber']."/".$param['sitenumber']." updated\n"; + $logstr .= "$serv - Task " . $param['tasknumber']."/".$param['sitenumber']." updated\n"; LOGInfo("importFromXML: Task " . $param['tasknumber']."/".$param['sitenumber']." updated"); } } else { - echo "$serv - error to update $table " . $param['tasknumber']."/".$param['sitenumber'] . "\n"; + $logstr .= "$serv - error to update $table " . $param['tasknumber']."/".$param['sitenumber'] . "\n"; LOGError("importFromXML: error to update $table " . $param['tasknumber']."/".$param['sitenumber']); if($conn != null) DBExec($conn,"rollback work"); - return false; + return array(false, $logstr); } } if($table == "clartable") { if(($ret=DBNewClar ($param, $conn))) { if($ret==2) { - echo "$serv - Clarification " . $param['clarnumber']."/".$param['sitenumber'] ." updated\n"; + $logstr .= "$serv - Clarification " . $param['clarnumber']."/".$param['sitenumber'] ." updated\n"; LOGInfo("importFromXML: Clarification " . $param['clarnumber']."/".$param['sitenumber'] ." updated"); } } else { - echo "$serv - error to update $table ". $param['clarnumber']."/".$param['sitenumber'] . "\n"; + $logstr .= "$serv - error to update $table ". $param['clarnumber']."/".$param['sitenumber'] . "\n"; LOGError("importFromXML: error to update $table ". $param['clarnumber']."/".$param['sitenumber']); if($conn != null) DBExec($conn,"rollback work"); - return false; + return array(false, $logstr); } } if($table == "runtable") { - if(($ret=DBNewRun ($param, $conn))) { + if(($ret=DBNewRun ($param, $conn, $tomain))) { if($ret==2) { - echo "$serv - Run " . $param['runnumber'] ."/".$param['sitenumber']." updated\n"; + $logstr .= "$serv - Run " . $param['runnumber'] ."/".$param['sitenumber']." updated\n"; LOGInfo("importFromXML: Run " . $param['runnumber'] ."/".$param['sitenumber']." updated"); } } else { - echo "$serv - error to update $table ". $param['runnumber'] ."/".$param['sitenumber'] . "\n"; + $logstr .= "$serv - error to update $table ". $param['runnumber'] ."/".$param['sitenumber'] . "\n"; LOGError("importFromXML: error to update $table ". $param['runnumber'] ."/".$param['sitenumber']); if($conn != null) DBExec($conn,"rollback work"); - return false; + return array(false, $logstr); } } } @@ -615,30 +655,68 @@ function importFromXML($ar,$contest,$site,$tomain=false,$uptime=0) { } if($conn != null) DBExec($conn,"commit work","importFromXML(commit)"); - return true; + return array(true, $logstr); } -function genSQLs($contest, $site, $updatetime) { +function genSQLs($contest, $site, $updatetime, $mainsite=1) { $sql = array(); $sql['contesttable']="select contestnumber, contestname, conteststartdate, contestduration, contestlastmileanswer," . "contestlastmilescore, contestpenalty, contestmaxfilesize, contestmainsite, contestkeys " . "from contesttable where contestnumber=$contest"; // and updatetime >= $updatetime"; - $sql['sitetable']="select * from sitetable where contestnumber=$contest and sitenumber=$site and updatetime >= $updatetime"; - $sql['answertable']="select * from answertable where contestnumber=$contest and fake='f' and updatetime >= $updatetime"; - $sql['langtable']="select * from langtable where contestnumber=$contest and updatetime >= $updatetime"; - $sql['problemtable']="select * from problemtable where contestnumber=$contest and fake='f' and updatetime >= $updatetime"; + $sql['sitetable']="select " . + "contestnumber, " . + "sitenumber, " . + "siteip, " . + "sitename, " . + "siteactive, " . + "sitepermitlogins, " . + "sitelastmileanswer, " . + "sitelastmilescore, " . + "siteduration, " . + "siteautoend, " . + "sitejudging, " . + "sitetasking, " . + "siteglobalscore, " . + "sitescorelevel, " . + "sitemaxtask, " . + "sitechiefname, " . + "siteautojudge, " . + "sitemaxruntime, " . + "sitemaxjudgewaittime, " . + "updatetime " . + " from sitetable where contestnumber=$contest and sitenumber=$site and updatetime >= $updatetime"; + if($site != $mainsite) { + $sql['answertable']="select * from answertable where contestnumber=$contest and fake='f' and updatetime >= $updatetime"; + $sql['langtable']="select * from langtable where contestnumber=$contest and updatetime >= $updatetime"; + $sql['problemtable']="select " . + "contestnumber, " . + "problemnumber, " . + "problemname, " . + "problemfullname, " . + "problembasefilename, " . + "probleminputfilename, " . + "probleminputfile, " . + "probleminputfilehash, " . + "fake, " . + //"problemcolorname, " . + //"problemcolor, " . + "updatetime" . + " from problemtable where contestnumber=$contest and fake='f' and updatetime >= $updatetime"; + $sql['usertable']="select * from usertable where contestnumber=$contest and usersitenumber=$mainsite and updatetime >= $updatetime"; + } else + $sql['usertable']="select * from usertable where contestnumber=$contest and usersitenumber=$site and updatetime >= $updatetime"; $sql['sitetimetable']="select * from sitetimetable where contestnumber=$contest and sitenumber=$site and updatetime >= $updatetime"; - $sql['usertable']="select * from usertable where contestnumber=$contest and usersitenumber=$site and updatetime >= $updatetime"; - $sql['clartable']="select * from clartable where contestnumber=$contest and clarsitenumber=$site and updatetime >= $updatetime"; + $sql['clartable']="select * from clartable where contestnumber=$contest and (clarsitenumber=$site or clarsitenumber=$mainsite) and updatetime >= $updatetime"; $sql['runtable']="select * from runtable where contestnumber=$contest and runsitenumber=$site and updatetime >= $updatetime"; $sql['tasktable']="select * from tasktable where contestnumber=$contest and sitenumber=$site and updatetime >= $updatetime"; return $sql; } -function generateSiteXML($contest,$site,$updatetime) { - $sql = genSQLs($contest, $site, $updatetime); +function generateSiteXML($contest,$site,$updatetime, $mainsite=1) { + $sql = genSQLs($contest, $site, $updatetime, $mainsite); $c = DBConnect(); $str = "<XML>\n"; + $logstr = ''; if ($c==null) return null; DBExec($c, "begin work"); foreach($sql as $kk => $vv) { @@ -646,13 +724,15 @@ function generateSiteXML($contest,$site,$updatetime) { if (!is_array($meta)) return null; $r = DBExec ($c, $vv, "generateSiteXML($kk)"); $n = DBnLines ($r); + if($n > 0) + $logstr .= "$kk has $n records to update\n"; for($i=0; $i<$n; $i++) { $atual = DBRow($r,$i); $str .= "<" . $kk . ">\n"; foreach($atual as $key => $val) { if($meta[$key]['type'] == 'oid' && $val != '') { if (($lo = DB_lo_open ($c, $val, "r")) !== false) { - $str .= " <" . $key . ">" . base64_encode("base64:" . base64_encode(DB_lo_read($contest,$lo))) . "</" . $key . ">\n"; + $str .= " <" . $key . ">" . base64_encode("base64:" . base64_encode(DB_lo_read($contest,$lo,-1,$c))) . "</" . $key . ">\n"; DB_lo_close($lo); } else { LOGError("large object ($key,$val) not readable"); @@ -667,6 +747,6 @@ function generateSiteXML($contest,$site,$updatetime) { $str .= "</XML>\n"; DBExec($c,"commit work","generateSiteXML(commit)"); LOGInfo("xml data generated for contest $contest site $site at time $updatetime"); - return $str; + return array($str,$logstr); } |