";
}
function join_query_string($s1, $s2) {
if ($s1) {
if ($s2) {
return "$s1&s2";
} else {
return $s1;
}
} else {
return $s2;
}
}
function append_sql_query($original,$addition,$first) {
if ($first == 1) {
return $original . " where " . $addition;
} else {
return $original . " and " . $addition;
}
}
// SqlQueryString maps a bunch of form items to a SQL query
//
// The items are
// table (name of table)
// id
// platformid
// appid
// workunitid
// hostid
// userid
// teamid
// nsecs (modified_time > now - nsecs)
// received_time (> x)
// server_state (== x if z nonzero)
// outcome (== x if z nonzero)
// client_state (== x if z nonzero)
// exit_status (== x if z nonzero)
// clauses (literals added after the above)
// sort_by (order by x desc added after all else)
//
// Once you've parsed the items (using parse_form_items()):
//
// get_select_query(n, m) returns the SQL query to get items from m to m+n
// get_url() returns the URL-encoded version of everything
// count() returns the number of records satisfying the query
class SqlQueryString {
var $table;
var $query;
var $urlquery;
function SqlQueryString() {
if (isset($_GET['table'])) {
$this->table = $_GET['table'];
} else {
$this->table = "";
}
//$this->query = $_GET['query'];
$this->query = "";
$this->urlquery = "";
}
function add($clause) {
//$clause=boinc_real_escape_string($clause);
if (!$this->query) {
$this->query .= "where $clause";
} else {
$this->query .= " and $clause";
}
}
function addclause($clause) {
if ($clause) {
$c = stripslashes(urldecode($clause));
$this->add("( $c )");
$clause = urlencode(stripslashes($clause));
$this->urlquery .= "&clauses=$clause";
}
}
function addeq($name) {
if (isset($_GET[$name])) {
$value = $_GET[$name];
} else {
$value = "";
}
if (strlen($value)) {
$this->add("$name = '$value'");
$this->urlquery .= "&$name=".urlencode($value);
}
}
function addeq_not_CHOOSE_ALL($name) {
if (isset($_GET[$name])) {
$value = $_GET[$name];
} else {
$value = "";
}
// On the selection menu, the ALL selection criteria sets (for example)
// outcome=='CHOOSE_ALL' rather than a numeric value. This means that
// we enter no condition for this case.
if (strlen($value) && strcmp("CHOOSE_ALL", $value)) {
$this->add("$name = '$value'");
$this->urlquery .= "&$name=".urlencode($value);
}
}
function addgt($name) {
if (isset($_GET[$name])) {
$value = $_GET[$name];
} else {
$value = '';
}
if (strlen($value) && $value > 0) {
$this->add("$name > '$value'");
$this->urlquery .= "&$name=".urlencode($value);
}
}
function addsort($name, $order) {
if (isset($_GET[$name])) {
$value = $_GET[$name];
} else {
$value=null;
}
if (isset($_GET[$order])) {
$order = $_GET[$order];
} else {
$order = null;
}
if (strlen($value)) {
if ($order == 'asc') {
$this->query .= " order by $value asc";
$this->urlquery .= "&sort_by_order=".urlencode($order);
} else {
$this->query .= " order by $value desc";
$this->urlquery .= "&$name=".urlencode($value);
}
}
}
function count() {
$count_query = "select count(*) as cnt from $this->table $this->query";
$result = mysql_query($count_query);
if (!$result) return 0;
$res = mysql_fetch_object($result);
mysql_free_result($result);
return $res->cnt;
}
function get_select_query($entries_to_show, $start_at) {
if ($entries_to_show) {
if ($start_at) {
return "select * from $this->table $this->query limit $start_at,$entries_to_show";
} else {
return "select * from $this->table $this->query limit $entries_to_show";
}
} else {
return "select * from $this->table $this->query";
}
}
function get_url($base = "db_action.php") {
$s = $base . "?table=$this->table$this->urlquery";
return $s;
}
function process_form_items() {
$this->addeq('id');
$this->addeq('platformid');
$this->addeq('appid');
$this->addeq('workunitid');
$this->addeq('hostid');
$this->addeq('userid');
$this->addeq('teamid');
$this->addeq('exit_status');
if (isset($_GET['nsecs'])) {
$_GET['mod_time'] = date("YmdHis",time() - $_GET['nsecs']);
}
$this->addgt('mod_time');
$this->addeq_not_CHOOSE_ALL('server_state');
$this->addeq_not_CHOOSE_ALL('outcome');
$this->addeq_not_CHOOSE_ALL('client_state');
$this->addeq_not_CHOOSE_ALL('validate_state');
if (isset($_GET['clauses'])) {
$clauses = $_GET['clauses'];
} else {
$clauses = null;
}
if ($clauses) {
$this->addclause($clauses);
}
$this->addsort('sort_by', 'sort_by_order');
}
}
function link_results($n, $mq, $query, $clauses) {
if ($n == '0') { // intentional compare by string
return "0";
} else {
if(strlen($clauses)) {
return "$n";
}
else {
return "$n";
}
}
}
// Decode ErrorNumber into human readable, taken from lib/error_numbers.h keep this up to date
// @return String A human readable error message
// @param Integer $x An error number
function result_error_mask_str($x){
switch($x){
case 0: return "";
case -100: return "ERR_SELECT";
case -102: return "ERR_READ";
case -103: return "ERR_WRITE";
case -104: return "ERR_FREAD";
case -105: return "ERR_FWRITE";
case -106: return "ERR_IO";
case -107: return "ERR_CONNECT";
case -108: return "ERR_FOPEN";
case -109: return "ERR_RENAME";
case -110: return "ERR_UNLINK";
case -111: return "ERR_OPENDIR";
case -112: return "ERR_XML_PARSE";
case -113: return "ERR_GETHOSTBYNAME";
case -114: return "ERR_GIVEUP_DOWNLOAD";
case -115: return "ERR_GIVEUP_UPLOAD";
case -116: return "ERR_NULL";
case -117: return "ERR_NEG";
case -118: return "ERR_BUFFER_OVERFLOW";
case -119: return "ERR_MD5_FAILED";
case -120: return "ERR_RSA_FAILED";
case -121: return "ERR_OPEN";
case -122: return "ERR_DUP2";
case -123: return "ERR_NO_SIGNATURE";
case -124: return "ERR_THREAD";
case -125: return "ERR_SIGNAL_CATCH";
case -126: return "ERR_QUIT_REQUEST";
case -127: return "ERR_UPLOAD_TRANSIENT";
case -128: return "ERR_UPLOAD_PERMANENT";
case -129: return "ERR_IDLE_PERIOD";
case -130: return "ERR_ALREADY_ATTACHED";
case -131: return "ERR_FILE_TOO_BIG";
case -132: return "ERR_GETRUSAGE";
case -133: return "ERR_BENCHMARK_FAILED";
case -134: return "ERR_BAD_HEX_FORMAT";
case -135: return "ERR_USER_REJECTED";
case -136: return "ERR_DB_NOT_FOUND";
case -137: return "ERR_DB_NOT_UNIQUE";
case -138: return "ERR_DB_CANT_CONNECT";
case -139: return "ERR_GETS";
case -140: return "ERR_SCANF";
case -141: return "ERR_STRCHR";
case -142: return "ERR_STRSTR";
case -143: return "ERR_READDIR";
case -144: return "ERR_SHMGET";
case -145: return "ERR_SHMCTL";
case -146: return "ERR_SHMAT";
case -147: return "ERR_FORK";
case -148: return "ERR_EXEC";
case -149: return "ERR_NOT_EXITED";
case -150: return "ERR_NOT_IMPLEMENTED";
case -151: return "ERR_GETHOSTNAME";
case -152: return "ERR_NETOPEN";
case -153: return "ERR_SOCKET";
case -154: return "ERR_FCNTL";
case -155: return "ERR_AUTHENTICATOR";
case -156: return "ERR_SCHED_SHMEM";
case -157: return "ERR_ASYNCSELECT";
case -158: return "ERR_BAD_RESULT_STATE";
case -159: return "ERR_DB_CANT_INIT";
case -160: return "ERR_NOT_UNIQUE";
case -161: return "ERR_NOT_FOUND";
case -162: return "ERR_NO_EXIT_STATUS";
case -163: return "ERR_FILE_MISSING";
case -164: return "ERR_NESTED_UNHANDLED_EXCEPTION_DETECTED";
case -165: return "ERR_SEMGET";
case -166: return "ERR_SEMCTL";
case -167: return "ERR_SEMOP";
case -168: return "ERR_FTOK";
case -169: return "ERR_SOCKS_UNKNOWN_FAILURE";
case -170: return "ERR_SOCKS_REQUEST_FAILED";
case -171: return "ERR_SOCKS_BAD_USER_PASS";
case -172: return "ERR_SOCKS_UNKNOWN_SERVER_VERSION";
case -173: return "ERR_SOCKS_UNSUPPORTED";
case -174: return "ERR_SOCKS_CANT_REACH_HOST";
case -175: return "ERR_SOCKS_CONN_REFUSED";
case -176: return "ERR_TIMER_INIT";
case -177: return "ERR_RSC_LIMIT_EXCEEDED";
case -178: return "ERR_INVALID_PARAM";
case -179: return "ERR_SIGNAL_OP";
case -180: return "ERR_BIND";
case -181: return "ERR_LISTEN";
case -182: return "ERR_TIMEOUT";
case -183: return "ERR_PROJECT_DOWN";
case -184: return "ERR_HTTP_ERROR";
case -185: return "ERR_RESULT_START";
case -186: return "ERR_RESULT_DOWNLOAD";
case -187: return "ERR_RESULT_UPLOAD";
case -189: return "ERR_INVALID_URL";
case -190: return "ERR_MAJOR_VERSION";
case -191: return "ERR_NO_OPTION";
case -192: return "ERR_MKDIR";
case -193: return "ERR_INVALID_EVENT";
case -194: return "ERR_ALREADY_RUNNING";
case -195: return "ERR_NO_APP_VERSION";
case -196: return "ERR_WU_USER_RULE";
case -197: return "ERR_ABORTED_VIA_GUI";
default: return "Unknown error number";
}
}
// Determines if in stderr_out is an error reported and prints as human readable String
// @return String A human readable string if error otherwise FALSE
// @param String $stderr_out the stderr_out value to parse
function stderr_error_string($stderr_out){
$y = parse_element($stderr_out, "");
$x = 0;
if ($y) {
$x = (int)$y;
}
if (0<=$x && $x<=9) {
return FALSE;
} else {
return "$x ".result_error_mask_str($x);
}
}
//
function exit_status_string($result) {
$x = $result->exit_status;
if ($x == 0) {
$y = parse_element($result->stderr_out, "");
if ($y) {
$x = (int)$y;
}
}
if (0<=$x && $x<=9) {
return "$x ".result_error_mask_str($x);
} else {
return sprintf("%d (0x%x)", $x, $x). " ".result_error_mask_str($x);
}
}
function show_result_summary() {
$ntotal =0; // TODO: how to count $result?
$nvalid = 0; // for SUCCESS results
$ninvalid = 0;
$nfile_deleted = 0;
$server_state = array();
$outcome = array();
$client_state = array();
for ($ss=1; $ss<6; $ss++) {
$server_state[$ss] = 0;
}
for ($ro=0; $ro<8; $ro++) {
$outcome[$ro] = 0;
}
for ($cs=1; $cs<7; $cs++) {
$client_state[$cs] = 0;
}
for ($fds=0; $fds<4; $fds++) {
$delete_state[$fds] = 0;
}
for ($vs=0; $vsprocess_form_items();
// Important: these need to be kept consistent with db/boinc_db.h and lib/result_state.h
$main_query = "
SELECT COUNT(id) AS nTotal,
SUM(case when server_state = '1' then 1 else 0 end) AS serverstate_inactive,
SUM(case when server_state = '2' then 1 else 0 end) AS serverstate_unset,
SUM(case when server_state = '3' then 1 else 0 end) AS serverstate_unset_seq,
SUM(case when server_state = '4' then 1 else 0 end) AS serverstate_inprogress,
SUM(case when server_state = '5' then 1 else 0 end) AS serverstate_over,
SUM(case when server_state = '5' and outcome = '0' then 1 else 0 end) AS outcome_init,
SUM(case when server_state = '5' and outcome = '1' then 1 else 0 end) AS outcome_success,
SUM(case when server_state = '5' and outcome = '2' then 1 else 0 end) AS outcome_couldntsend,
SUM(case when server_state = '5' and outcome = '3' then 1 else 0 end) AS outcome_failure,
SUM(case when server_state = '5' and outcome = '4' then 1 else 0 end) AS outcome_noreply,
SUM(case when server_state = '5' and outcome = '5' then 1 else 0 end) AS outcome_didntneed,
SUM(case when server_state = '5' and outcome = '6' then 1 else 0 end) AS outcome_validateerror,
SUM(case when server_state = '5' and outcome = '7' then 1 else 0 end) AS outcome_clientdetached,
SUM(case when server_state = '5' and outcome = '1' and validate_state = '0' then 1 else 0 end) AS validate_init,
SUM(case when server_state = '5' and outcome = '1' and validate_state = '1' then 1 else 0 end) AS validate_valid,
SUM(case when server_state = '5' and outcome = '1' and validate_state = '2' then 1 else 0 end) AS validate_invalid,
SUM(case when server_state = '5' and outcome = '1' and validate_state = '3' then 1 else 0 end) AS validate_nocheck,
SUM(case when server_state = '5' and outcome = '1' and validate_state = '4' then 1 else 0 end) AS validate_inconclusive,
SUM(case when server_state = '5' and outcome = '1' and validate_state = '5' then 1 else 0 end) AS validate_too_late,
SUM(case when server_state = '5' and outcome = '1' and file_delete_state = '0' then 1 else 0 end) AS filedeletestate_init,
SUM(case when server_state = '5' and outcome = '1' and file_delete_state = '1' then 1 else 0 end) AS filedeletestate_ready,
SUM(case when server_state = '5' and outcome = '1' and file_delete_state = '2' then 1 else 0 end) AS filedeletestate_done,
SUM(case when server_state = '5' and outcome = '1' and file_delete_state = '3' then 1 else 0 end) AS filedeletestate_error,
SUM(case when server_state = '5' and outcome = '3' and client_state = '0' then 1 else 0 end) AS clientstate_init,
SUM(case when server_state = '5' and outcome = '3' and client_state = '1' then 1 else 0 end) AS clientstate_downloading,
SUM(case when server_state = '5' and outcome = '3' and client_state = '2' then 1 else 0 end) AS clientstate_downloaded,
SUM(case when server_state = '5' and outcome = '3' and client_state = '3' then 1 else 0 end) AS clientstate_computedone,
SUM(case when server_state = '5' and outcome = '3' and client_state = '4' then 1 else 0 end) AS clientstate_uploading,
SUM(case when server_state = '5' and outcome = '3' and client_state = '5' then 1 else 0 end) AS clientstate_uploaded,
SUM(case when server_state = '5' and outcome = '3' and client_state = '6' then 1 else 0 end) AS clientstate_aborted
FROM result WHERE
";
if ($query_appid) {
$main_query .= "appid=$query_appid and ";
}
if ($query_wuid) {
$main_query .= "workunitid=$query_wuid and ";
}
if ($query_mod_time) {
$main_query .= "mod_time > DATE_SUB( NOW(), INTERVAL $query_mod_time SECOND )+0 and ";
}
$main_query .= "1=1";
$urlquery = $q->urlquery;
$result = mysql_query($main_query);
// echo "Main query was $main_query ";
if ($result) {
$res = mysql_fetch_object($result);
$ntotal = $res->nTotal;
$server_state[1] = $res->serverstate_inactive;
$server_state[2] = $res->serverstate_unset;
$server_state[3] = $res->serverstate_unset_seq;
$server_state[4] = $res->serverstate_inprogress;
$server_state[5] = $res->serverstate_over;
$outcome[0] = $res->outcome_init;
$outcome[1] = $res->outcome_success;
$outcome[2] = $res->outcome_couldntsend;
$outcome[3] = $res->outcome_failure;
$outcome[4] = $res->outcome_noreply;
$outcome[5] = $res->outcome_didntneed;
$outcome[6] = $res->outcome_validateerror;
$outcome[7] = $res->outcome_clientdetached;
$client_state[1] = $res->clientstate_downloading;
$client_state[2] = $res->clientstate_downloaded;
$client_state[3] = $res->clientstate_computedone;
$client_state[4] = $res->clientstate_uploading;
$client_state[5] = $res->clientstate_uploaded;
$client_state[6] = $res->clientstate_aborted;
$validate_state[0] = $res->validate_init;
$validate_state[1] = $res->validate_valid;
$validate_state[2] = $res->validate_invalid;
$validate_state[3] = $res->validate_nocheck;
$validate_state[4] = $res->validate_inconclusive;
$validate_state[5] = $res->validate_too_late;
$file_delete[0] = $res->filedeletestate_init;
$file_delete[1] = $res->filedeletestate_ready;
$file_delete[2] = $res->filedeletestate_done;
$file_delete[3] = $res->filedeletestate_error;
$nfile_deleted = $res->filedeletestate_ready + $res->filedeletestate_done + $res->filedeletestate_error;
mysql_free_result($result);
}
echo "
";
}
function show_result_short($result) {
$ss = server_state_string($result->server_state)." [$result->server_state]";
$oc = outcome_string($result->outcome)." [$result->outcome]";
$vs = validate_state_str($result->validate_state)." [$result->validate_state]";
$cs2 = client_state_string($result->client_state)." [$result->client_state]";
if ($result->outcome == 3) {
$cs = client_state_string($result->client_state);
$oc = "$oc ($cs)";
}
if ($result->received_time)
$received = time_str($result->received_time);
else {
// result has not been received yet, so show report deadline either
// in green if in the future or in red if in the past.
$timenow=time();
if ($result->report_deadline==0) {
// not sent -- show create time in purple
$received = "". time_str($result->create_time) . "";
} else if ($result->report_deadline>=$timenow) {
// overdue -- show deadline in red
$received = "". time_str($result->report_deadline) . "";
} else {
// in progress and not overdue -- show deadline in green
$received = "". time_str($result->report_deadline) . "";
}
}
$version = $result->app_version_num;
$outcome_color = outcome_color($result->outcome);
$validate_color = validate_color($result->validate_state);
$host_user = host_user_link($result->hostid);
$cpu_hours = sprintf("%.1f",$result->cpu_time / 3600);
$claimed_credit = credit_str($result->claimed_credit);
$granted_credit = credit_str($result->granted_credit);
$delete_state = file_delete_state_str($result->file_delete_state);
echo "