function importFromXML($ar, $acr, $contest = 0, $localsite = 0) { $data = implode("", explode("\n", $ar)); $parser = xml_parser_create(); xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 1); xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); xml_parse_into_struct($parser, $data, $values, $tags); xml_parser_free($parser); // print_r($tags); // print_r($values); $orderkeys = array('CONTESTREC', 'SITETIME', 'SITEREC', 'USERREC', 'ANSWERREC', 'LANGUAGEREC', 'PROBLEMREC', 'CLARREC', 'RUNREC', 'TASKREC'); $norderkeys = 10; $nc = 0; unset($sitetime); unset($nsitetime); $conn = DBConnect(); if ($conn == null) { return false; } // DBExec($conn,"begin work","importFromXML(begin)"); // DBExec($conn,"lock","importFromXML(lock)"); if ($contest != 0) { $r = DBExec($conn, "select * from contesttable where contestnumber={$contest}"); if (DBnLines($r) == 0) { echo "Unable to find the contest {$contest} in the database.\n"; DBExec($conn, "rollback work"); return false; } $ct = DBRow($r, 0); if ($localsite == 0) { $localsite = $ct["contestlocalsite"]; } } else { if ($localsite == 0) { $localsite = 1; } } // $mainsite = $ct["contestmainsite"]; DBClose($conn); $conn = null; for ($keyindex = 0; $keyindex < $norderkeys; $keyindex++) { foreach ($tags as $key => $val) { if ($values[$val[0]]['type'] != 'open') { continue; } if ($key == "XML") { continue; } if ($key != $orderkeys[$keyindex]) { continue; } if (isset($acr[$key])) { $ac = $acr[$key]; } else { continue; } foreach ($val as $k => $v) { if ($values[$v]['type'] != 'open') { continue; } if (count($val) > $k + 1) { $param = array(); if (isset($ac['site'])) { for ($i = $v; $i < $val[$k + 1]; $i++) { $p = strtolower($values[$i]["tag"]); if ($p == 'site') { if ($values[$i]["type"] == "complete" && isset($values[$i]["value"])) { $tmp = sanitizeText(trim(implode('', explode('\\n', $values[$i]["value"])))); if (is_array($ac['site']) && in_array($tmp, $ac['site'])) { $param['site'] = $tmp; } else { if ($ac['site'] == -1 || $ac['site'] == -2 && $tmp == $localsite || $ac['site'] == -3 && $tmp != $localsite || $ac['site'] > 0 && $ac['site'] == $tmp) { $param['site'] = $tmp; } } } } } } for ($i = $v; $i < $val[$k + 1]; $i++) { $p = strtolower($values[$i]["tag"]); if (isset($ac[$p]) && $p != 'site') { if ($values[$i]["type"] == "complete" && isset($values[$i]["value"])) { if (is_string($ac[$p])) { $param[$p] = $ac[$p]; } else { $tmp = sanitizeText(trim(implode('', explode('\\n', $values[$i]["value"])))); if (is_array($ac[$p]) && in_array($tmp, $ac[$p])) { $param[$p] = $tmp; } else { if ($ac[$p] == -1 || $ac[$p] == -2 && $tmp == $localsite || $ac[$p] == -3 && $tmp != $localsite || $ac[$p] == 0 && isset($param['site']) || $ac[$p] > 0 && $ac[$p] == $tmp) { $param[$p] = $tmp; } } } } } } // echo "\nKEY KEY KEY\n"; // print_r($key); // echo "\nVAL VAL VAL\n"; // print_r($val); // echo "\n"; // print_r($param); $param['contestnumber'] = $contest; if ($key == "CONTESTREC") { $param['number'] = $contest; if ($contest == 0) { $nc = 1; $contest = DBNewContest($param, $conn); if ($contest > 0) { echo "<br><u>Contest {$contest} created</u> (not active by default)<br>"; } else { echo "<br>Error creating contest<br>"; if ($conn != null) { DBExec($conn, "rollback work"); } return false; } } $param['number'] = $contest; $param['contestnumber'] = $contest; if ($ret = DBUpdateContest($param, $conn)) { if ($ret == 2) { echo "<br>Contest {$contest} updated<br>"; } } else { if ($conn != null) { DBExec($conn, "rollback work"); } return false; } } if (!isset($param['number']) || count($param) < 2) { continue; } if ($key == "SITEREC") { if (!DBNewSite($contest, $conn, $param)) { if ($conn != null) { DBExec($conn, "rollback work"); } return false; } if ($ret = DBUpdateSite($param, $conn)) { if ($ret == 2) { echo "Site " . $param["number"] . " updated<br>"; } } else { if ($conn != null) { DBExec($conn, "rollback work"); } return false; } if (isset($nsitetime[$param["number"]])) { if ($qtd = DBRenewSiteTime($sitetime[$param["number"]], $conn)) { if ($qtd == 2) { echo "Time for site " . $param["number"] . " updated<br>"; } } else { if ($conn != null) { DBExec($conn, "rollback work"); } return false; } } } if ($key == "SITETIME") { if (isset($param['site']) && is_numeric($param['site'])) { $s = $param['site']; if (!isset($nsitetime[$s])) { $nsitetime[$s] = 0; } $sitetime[$s][$nsitetime[$s]] = $param; $nsitetime[$s]++; } } if ($key == "USERREC") { if ($ret = DBNewUser($param, $conn)) { if ($ret == 2) { echo "User " . $param["number"] . "/" . $param['site'] . " updated<br>"; } } else { if ($conn != null) { DBExec($conn, "rollback work"); } return false; } } if ($key == "ANSWERREC") { if ($ret = DBNewAnswer($contest, $param, $conn)) { if ($ret == 2) { echo "Answer " . $param["number"] . " updated<br>"; } } else { if ($conn != null) { DBExec($conn, "rollback work"); } return false; } } if ($key == "LANGUAGEREC") { if ($ret = DBNewLanguage($contest, $param, $conn)) { if ($ret == 2) { echo "Language " . $param['number'] . " updated<br>"; } } else { if ($conn != null) { DBExec($conn, "rollback work"); } return false; } } if ($key == "PROBLEMREC") { if ($ret = DBNewProblem($contest, $param, $conn)) { if ($ret == 2) { echo "Problem " . $param['number'] . " updated<br>"; } } else { if ($conn != null) { DBExec($conn, "rollback work"); } return false; } } if ($key == "TASKREC") { if ($ret = DBNewTask($param, $conn)) { if ($ret == 2) { echo "Task " . $param['number'] . "/" . $param['site'] . " updated<br>"; } } else { if ($conn != null) { DBExec($conn, "rollback work"); } return false; } } if ($key == "CLARREC") { if ($ret = DBNewClar($param, $conn)) { if ($ret == 2) { echo "Clarification " . $param['number'] . "/" . $param['site'] . " updated<br>"; } } else { if ($conn != null) { DBExec($conn, "rollback work"); } return false; } } if ($key == "RUNREC") { if ($ret = DBNewRun($param, $conn)) { if ($ret == 2) { echo "Run " . $param['number'] . "/" . $param['site'] . " updated<br>"; } } else { if ($conn != null) { DBExec($conn, "rollback work"); } return false; } } } } } } // DBExec($conn,"commit work","importFromXML(commit)"); return true; }
} } } MSGError($oklines . ' sites included/updated successfully'); } else { if (strtolower(substr($name, -4)) == ".tab") { $oklines = 0; for ($i = 0; $i < count($ar); $i++) { $x = explode("\t", trim($ar[$i])); if (count($x) == 8) { $param = array(); $param['sitenumber'] = trim($x[0]); $param['sitename'] = trim($x[2]); $param['contest'] = $_SESSION["usertable"]["contestnumber"]; if ($_SESSION["usertable"]["usersitenumber"] == $param['sitenumber'] || $main) { if (DBNewSite($param['contest'], null, $param)) { $oklines++; $param = array(); $param['contest'] = $_SESSION["usertable"]["contestnumber"]; $param['site'] = $ct["contestmainsite"]; $param['username'] = '******' . trim($x[0]); $param['usericpcid'] = trim($x[0]); $param['usernumber'] = trim($x[0]); $param['userfull'] = 'Site connection'; $param['userdesc'] = ''; $param['type'] = 'site'; $param['enabled'] = 't'; $param['multilogin'] = '******'; $userlist[$param['username']] = randstr(10); $param['pass'] = myhash($userlist[$param['username']]); DBNewUser($param);
function DBNewContest($param = array(), $c = null) { $cw = false; if ($c == null) { $cw = true; $c = DBConnect(); DBExec($c, "begin work", "DBNewContest(begin)"); } $a = DBGetRow("select max(contestnumber) as contest from contesttable", 0, $c, "DBNewContest(max(contest))"); if ($a == null) { $n = 1; } else { $n = $a["contest"] + 1; } $ac = array('name', 'startdate', 'duration', 'lastmileanswer', 'lastmilescore', 'penalty', 'updatetime', 'localsite', 'mainsite', 'mainsiteurl', 'keys', 'unlockkey'); //'active' $type['startdate'] = 1; $type['duration'] = 1; $type['lastmileanswer'] = 1; $type['lastmilescore'] = 1; $type['penalty'] = 1; $type['updatetime'] = 1; $type['mainsite'] = 1; $type['localsite'] = 1; $mainsiteurl = ''; $keys = ''; $unlockkey = ''; foreach ($ac as $key) { if (isset($param[$key]) && (!isset($type[$key]) || is_numeric($param[$key]))) { ${$key} = sanitizeText($param[$key]); } else { ${$key} = ""; } } if ($mainsite == "") { $mainsite = 1; } if ($localsite == "") { $localsite = 1; } if ($name == "") { $name = "Contest"; } if ($startdate == "") { $startdate = "EXTRACT(EPOCH FROM now())+600"; } if ($duration == "") { $duration = 300 * 60; } if ($lastmileanswer == "") { $lastmileanswer = 285 * 60; } if ($lastmilescore == "") { $lastmilescore = 240 * 60; } if ($penalty == "") { $penalty = 20 * 60; } //if($active=="") $active = "f"; if ($updatetime == "") { $updatetime = time(); } DBExec($c, "insert into contesttable (contestnumber, contestname, conteststartdate, contestduration, " . "contestlastmileanswer, contestlastmilescore, contestlocalsite, contestpenalty, " . "contestmaxfilesize, contestactive, contestmainsite, contestmainsiteurl,contestkeys,contestunlockkey, updatetime) values ({$n}, '{$name}', " . "{$startdate}, {$duration}, {$lastmileanswer}, " . "{$lastmilescore}, {$localsite}, {$penalty}, 100000, '{$active}', {$mainsite}, '{$mainsiteurl}', '{$keys}','{$unlockkey}',{$updatetime})", "DBNewContest(insert contest)"); DBNewSite($n, $c, $param); insertanswers($n, $c); insertlanguages($n, $c); DBinsertfakeproblem($n, $c); if ($cw) { DBExec($c, "commit work", "DBNewContest(commit)"); } LOGLevel("User " . $_SESSION["usertable"]["username"] . "/" . $_SESSION["usertable"]["usersitenumber"] . " created a new contest ({$n}).", 2); return $n; }
//contestname, startdate, duration, lastmileanswer, lastmilescore, penalty, contestactive $tmp = explode("=", $x, 2); $param[trim($tmp[0])] = trim($tmp[1]); } $nc = DBNewContest($param); echo "<br>Contest {$nc} created<br>"; for (; $i < count($ar) && strpos($ar[$i], "[site]") === false; $i++) { } while (strpos($ar[$i], "[site]") === true) { for ($i++; $i < count($ar) && $ar[$i][0] != "["; $i++) { $x = trim($ar[$i]); // sitenumber, siteip, sitename, scorelevel $tmp = explode("=", $x, 2); $param[trim($tmp[0])] = trim($tmp[1]); } DBNewSite($nc, null, $param); echo "New site created<br>"; } for (; $i < count($ar) && strpos($ar[$i], "[answer]") === false; $i++) { } for ($i++; $i < count($ar) && $ar[$i][0] != "["; $i++) { echo "<br>Searching for answers<br>\n"; $x = trim($ar[$i]); if (strpos($x, "answ") !== false && strpos($x, "answ") == 0) { unset($answnumber); unset($answname); unset($answyes); while (strpos($x, "answ") !== false && strpos($x, "answ") == 0) { $tmp = explode("=", $x, 2); switch (trim($tmp[0])) { case "answernumber":