"); if(!mysql_select_db($db_name)) { echo "Unable to select database - please try again later"; exit(); } return 0; } function lookup_user_auth($auth) { $result = mysql_query("select * from user where authenticator='$auth'"); if ($result) { $user = mysql_fetch_object($result); mysql_free_result($result); return $user; } else { return 0; } } function join_query_string($s1, $s2) { if ($s1) { if ($s2) { return "$s1&s2"; } else { return $s1; } } else { return $s2; } } // 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 (received_time > now - nsecs) // received_time (> x) // server_state (== x if z nonzero) // outcome (== x if z nonzero) // client_state (== 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() { $this->table = $_GET['table']; //$this->query = $_GET['query']; $this->query = ""; $this->urlquery = ""; } function add($clause) { if (!$this->query) { $this->query .= "where $clause"; } else { $this->query .= " and $clause"; } } function addclause($clause) { if ($clause) { $this->add($clause); $this->urlquery .= "&clauses=".urlencode($clause); } } function addeq($name) { $value = $_GET[$name]; if (strlen($value)) { $this->add("$name = '$value'"); $this->urlquery .= "&$name=".urlencode($value); } } function addeqnz($name) { $value = $_GET[$name]; if (strlen($value) && $value > 0) { $this->add("$name = '$value'"); $this->urlquery .= "&$name=".urlencode($value); } } function addgt($name) { $value = $_GET[$name]; if (strlen($value) && $value > 0) { $this->add("$name > '$value'"); $this->urlquery .= "&$name=".urlencode($value); } } function addsort($name) { $value = $_GET[$name]; if (strlen($value)) { $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) { $s = "db_action.php?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'); if ($_GET['nsecs']) { $_GET['received_time'] = time() - $_GET['nsecs']; } $this->addgt('received_time'); $this->addeqnz('server_state'); $this->addeqnz('outcome'); $this->addeqnz('client_state'); if ($_GET['clauses']) { $this->addclause($_GET['clauses']); } $this->addsort('sort_by'); } } function link_results($n, $mq, $query) { if ($n == '0') { // intentional compare by string return "0"; } else { return "$n"; } } function show_result_summary() { $server_state = array(); $outcome = array(); $client_state = array(); for ($ss=1; $ss<6; $ss++) { $server_state[$ss] = 0; } for ($ro=0; $ro<6; $ro++) { $outcome[$ro] = 0; } for ($cs=1; $cs<6; $cs++) { $client_state[$cs] = 0; } $_GET['table'] = 'result'; $_GET['sort_by'] = ''; // ignore sort $q = new SqlQueryString(); $q->process_form_items(); $main_query = $q->get_select_query(0,0); $urlquery = $q->urlquery; echo "

Query: $main_query

\n"; $result = mysql_query($main_query); $ntotal =0; // TODO: how to count $result? $nvalid = 0; // for SUCCESS results $ninvalid = 0; $nfile_deleted = 0; while ($res = mysql_fetch_object($result)) { $server_state[$res->server_state] += 1; $ntotal += 1; if ($res->server_state == 5) { $outcome[$res->outcome] += 1; if ($res->outcome == 3) { $client_state[$res->client_state] += 1; } if ($res->outcome == 1) { if ($res->validate_state == 1) { $nvalid += 1; } if ($res->validate_state == 2) { $ninvalid += 1; } if ($res->file_delete_state >= 1) { $nfile_deleted +=1; } } } } mysql_free_result($result); echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo "

" . link_results("$ntotal results", $urlquery, '') . "

" . link_results("'Over' results", $urlquery, "server_state=5") . "

" . link_results("'Success' results", $urlquery, "outcome=1") . "

" . link_results("'Client error' results", $urlquery, "outcome=3") . "

\n"; for ($ss=1; $ss<6; $ss++) { row2(server_state_string($ss), link_results($server_state[$ss], $urlquery,"server_state=$ss")); } echo "
Server state# results
\n"; for ($ro=0; $ro<6; $ro++) { c_row2($outcome[$ro]?outcome_color($ro):'', outcome_string($ro), link_results($outcome[$ro], $urlquery, "outcome=$ro") ); } echo "
Outcome# results
\n"; row2("Valid", link_results($nvalid, $urlquery, "validate_state=1")); row2("Invalid", link_results($ninvalid, $urlquery, "validate_state=2")); echo "
Validate state# results
"; echo "\n"; row2("Files deleted", link_results($ninvalid, $urlquery, "file_delete_state= 1 or file_delete_state=2")); echo "
File Delete state# results
\n"; for ($cs=1; $cs<6; $cs++) { row2(client_state_string($cs), link_results($client_state[$cs], $urlquery, "client_state=$cs") ); } echo "
Client state# results
"; } function server_state_select() { echo " \n"; } function outcome_select() { echo " \n"; } function client_state_select() { echo " \n"; } function result_sort_select() { echo " "; } function table_title($table) { switch($table) { case "platform": return "Platforms"; case "app": return "Applications"; case "app_version": return "Application Versions"; case "host": return "Hosts"; case "workunit": return "Workunits"; case "result": return "Results"; case "team": return "Teams"; case "user": return "Users"; default: return "????"; } } function show_platform($platform) { start_table(); row("ID", $platform->id); row("Created", time_str($platform->create_time)); row("Name", $platform->name); row("User friendly name", $platform->user_friendly_name); row("","id>App versions for this platform"); end_table(); } function show_app($app) { start_table(); row("ID", $app->id); row("Created", time_str($app->create_time)); row("Name", $app->name); row("","id>App Versions for this application"); row("","id&detail=low>Workunits for this application"); end_table(); } function show_app_version($app_version) { start_table(); row("ID", $app_version->id); row("Created", time_str($app_version->create_time)); row("Application", "appid>" . app_name_by_id($app_version->appid) . ""); row("Version num", $app_version->version_num); row("Platform", "platformid>" . platform_name_by_id($app_version->platformid) . "" ); row("XML doc", "

".htmlspecialchars($app_version->xml_doc)."
"); row("Min_core_version", $app_version->min_core_version); row("Max_core_version", $app_version->max_core_version); row("Message", $app_version->message); row("Deprecated", $app_version->deprecated); end_table(); } function app_version_short_header() { echo " ID Application Version Platform "; } function show_app_version_short($app_version) { $x = app_name_by_id($app_version->appid); $y = platform_name_by_id($app_version->platformid); echo " id>$app_version->id appid>$x $app_version->version_num platformid>$y "; } function host_short_header() { echo " host ID IP address name CPU OS "; } function show_host_short($host) { echo " id>$host->id $host->last_ip_addr $host->domain_name $host->p_vendor $host->p_model $host->os_name $host->os_version "; } function show_host($host) { start_table(); row("ID", $host->id); row("Created", time_str($host->create_time)); row("User", "userid>$host->userid"); row("Venue", $host->venue); row("Total credit", $host->total_credit); row("Average credit", $host->expavg_credit); row("Average update time", time_str($host->expavg_time)); row("IP address", "$host->last_ip_addr
(same the last $host->nsame_ip_addr times)"); row("Domain name", $host->domain_name); $x = $host->timezone/3600; row("Time zone", "UTC - $x hours"); row("Number of CPUs", $host->p_ncpus); row("CPU", "$host->p_vendor $host->p_model"); row("FP ops/sec", $host->p_fpops); row("Int ops/sec", $host->p_iops); row("memory bandwidth", $host->p_membw); row("Operating System", "$host->os_name $host->os_version"); $x = $host->m_nbytes/(1024*1024); $y = round($x, 2); row("Memory", "$y MB"); $x = $host->m_cache/1024; $y = round($x, 2); row("Cache", "$y KB"); $x = $host->m_swap/(1024*1024); $y = round($x, 2); row("Swap Space", "$y MB"); $x = $host->d_total/(1024*1024*1024); $y = round($x, 2); row("Total Disk Space", "$y GB"); $x = $host->d_free/(1024*1024*1024); $y = round($x, 2); row("Free Disk Space", "$y GB"); row("Avg network bandwidth (upstream)", "$host->n_bwup bytes/sec"); row("Avg network bandwidth (downstream)", "$host->n_bwdown bytes/sec"); row("Number of RPCs", $host->rpc_seqno); row("Last RPC", time_str($host->rpc_time)); row("% of time client on", 100*$host->on_frac." %"); row("% of time host connected", 100*$host->connected_frac." %"); row("% of time user active", 100*$host->active_frac." %"); row("Results", "id&sort_by=sent_time>click here"); end_table(); } function wu_error_mask_str($s) { $x = ""; if ($s & 1) $x = $x."Couldn't send result; "; if ($s & 2) $x = $x."Too many errors (may have bug); "; if ($s & 4) $x = $x."Too many results (may be nondeterministic)"; $x = $x."
"; return $x; } function assimilate_state_str($s) { switch($s) { case 0: return "Initial"; case 1: return "Ready to assimilate"; case 2: return "Assimilated"; } } function file_delete_state_str($s) { switch($s) { case 0: return "Initial"; case 1: return "Ready to delete"; case 2: return "Deleted"; } } function show_workunit($wu) { start_table(); row("Created", time_str($wu->create_time)); row("Name", $wu->name); row("XML doc", "
".htmlspecialchars($wu->xml_doc)."
"); row("Application", "appid>" . app_name_by_id($wu->appid) . ""); row("Batch", $wu->batch); row("Estimated FP Operations", $wu->rsc_fpops_est); row("Max FP Operations", $wu->rsc_fpops_bound); row("Max Memory Usage", $wu->rsc_memory_bound); row("Max Disk Usage", $wu->rsc_disk_bound); row("Need validate?", $wu->need_validate?"yes":"no"); row("Canonical resultid", "canonical_resultid>".$wu->canonical_resultid.""); row("Canonical credit", $wu->canonical_credit); row("Timeout check time", time_str($wu->timeout_check_time)); row("Delay bound", $wu->delay_bound); row("Error mask", wu_error_mask_str($wu->error_mask)); row("File delete state", file_delete_state_str($wu->file_delete_state)); row("Assimilation state", assimilate_state_str($wu->assimilate_state)); // row("","id&detail=low>Show associated results"); row("min quorum", $wu->min_quorum); row("max error results", $wu->max_error_results); row("max total results", $wu->max_total_results); row("max success results", $wu->max_success_results); row("","Grep logs"); row("result template", "
".htmlspecialchars($wu->result_template)."
"); end_table(); $_GET = array('workunitid' => $wu->id); show_result_summary(); echo "

"; } function workunit_short_header() { echo " WU ID canonical result error_mask file delete assimilate "; } function show_workunit_short($wu) { if ($wu->canonical_resultid) { $cr = "canonical_resultid>$wu->canonical_resultid"; } else { $cr = "none"; } $cr = $cr. " id&detail=low>all"; $e = wu_error_mask_str($wu->error_mask); $f = file_delete_state_str($wu->file_delete_state); $a = assimilate_state_str($wu->assimilate_state); echo " $wu->id $cr $e $f $a "; } function server_state_string($s) { switch($s) { case 1: return "Inactive"; case 2: return "Unsent"; case 4: return "In Progress"; case 5: return "Over"; } return "Unknown"; } function outcome_string($s) { switch($s) { case 1: return "Success"; case 2: return "Couldn't send"; case 3: return "Client error"; case 4: return "No reply"; case 5: return "Didn't need"; } return "Unknown"; } function client_state_string($s) { switch($s) { case 0: return "New"; case 1: return "Downloading"; case 2: return "Downloaded"; case 3: return "Computing"; case 4: return "Uploading"; case 5: return "Done"; } return "Unknown"; } function validate_state_str($s) { switch($s) { case 0: return "Initial"; case 1: return "Valid"; case 2: return "Invalid"; case 3: return "Skipped"; } return "Unknown"; } function client_version_string($client_version_num) { if (!$client_version_num) { return '---'; } else { return sprintf("%.2f", $client_version_num/100); } } function host_user_link($hostid) { if (!$hostid) return '----'; $h = "$hostid"; $result = mysql_query("select userid from host where id='$hostid' limit 1"); if (!$result) return $h; $host = mysql_fetch_object($result); mysql_free_result($result); if (!$host->userid) return $h; $result = mysql_query("select * from user where id='$host->userid' limit 1"); if (!$result) return $h; $user = mysql_fetch_object($result); mysql_free_result($result); return "$h
(id>$user->name)"; } function outcome_color($s) { switch($s) { // case 0: return 'eeeeee'; // unknown (server state not over probably) case 1: return '33cc33'; // "Success" case 3: return 'ff3333'; // "Client error" } return ''; } function credit_str($c) { if ($c) { return sprintf("%.3f", $c); } else { return '---'; } } function show_result($result) { $wu_name = wu_name_by_id($result->workunitid); start_table(); row("Created", time_str($result->create_time)); row("Sent", time_str($result->sent_time)); row("Received", time_str($result->received_time)); row("Name", $result->name); row("Workunit", "workunitid>" . wu_name_by_id($result->workunitid) . "" ); row("Server state", server_state_string($result->server_state)); row("Outcome", outcome_string($result->outcome)); row("Client state", client_state_string($result->client_state)); row("Host ID", "hostid>" . host_name_by_id($result->hostid) . ""); row("Report deadline", time_str($result->report_deadline)); row("CPU time", $result->cpu_time); row("XML doc in", "

".htmlspecialchars($result->xml_doc_in)."
"); row("XML doc out", "
".htmlspecialchars($result->xml_doc_out)."
"); row("stderr out", "
".htmlspecialchars($result->stderr_out)."
"); row("Batch", $result->batch); row("File delete state", file_delete_state_str($result->file_delete_state)); row("Validate state", validate_state_str($result->validate_state)); row("claimed credit", $result->claimed_credit); row("Granted credit", $result->granted_credit); row("Client version", client_version_string($result->client_version_num)); row("Random",$result->random); row("","Grep logs"); end_table(); echo "

"; } function result_short_header() { echo " result ID WU ID server state outcome host (user) client ver received CPU hours claimed
credit granted
credit "; } function show_result_short($result) { $ss = server_state_string($result->server_state); $oc = outcome_string($result->outcome); if ($result->outcome == 3) { $cs = client_state_string($result->client_state); $oc = "$oc ($cs)"; } $received = time_str($result->received_time); $version = client_version_string($result->client_version_num); $outcome_color = outcome_color($result->outcome); $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); echo " id>$result->id workunitid>$result->workunitid $ss $oc $host_user $version $received $cpu_hours $claimed_credit $granted_credit "; } function show_user($user) { start_table(); row("ID", $user->id); row("Created", time_str($user->create_time)); row("Name", $user->name); row("Authenticator", $user->authenticator); row("Email address", $user->email_addr); row("Country", $user->country); row("Postal code", $user->postal_code); row("Total credit", $user->total_credit); row("Average credit", $user->expavg_credit); row("Last average time", time_str($user->expavg_time)); row("Default venue", $user->venue); row("Hosts", "id&detail=low>click"); end_table(); } function team_type_string($s) { switch ($s) { case 1: return "Small Company"; case 2: return "Medium Company"; case 3: return "Large Company"; case 4: return "Club"; case 5: return "Primary School"; case 6: return "Secondary School"; case 7: return "Junior College"; case 8: return "University or Department"; case 9: return "Government Agency"; default: return "Unknown"; } } function show_team($team) { start_table(); row("ID", $team->id); row("Team Founder", "userid>" . user_name_by_id($team->userid) . ""); row("Name", $team->name); row("Name (HTML Formatted)", "

" . htmlspecialchars($team->name_html) . "
" ); row("Url", "url>" . $team->url . ""); row("Type", team_type_string($team->type)); row("Description", $team->description); row("", "id>List All Members"); end_table(); } function team_name_by_id($teamid) { $result = mysql_query("select * from team where id = $teamid"); $team = mysql_fetch_object($result); return $team->name; } function user_name_by_id($user_id) { $result = mysql_query("select * from user where id = $user_id"); $user = mysql_fetch_object($result); return $user->name; } function app_name_by_id($appid) { $result = mysql_query("select * from app where id = $appid"); $app = mysql_fetch_object($result); return $app->name; } function wu_name_by_id($workunitid) { $result = mysql_query("select * from workunit where id = $workunitid"); $wu = mysql_fetch_object($result); return $wu->name; } function platform_name_by_id($platformid) { $result = mysql_query("select * from platform where id = $platformid"); $plat = mysql_fetch_object($result); return $plat->name; } function host_name_by_id($hostid) { $result = mysql_query("select * from host where id = $hostid"); $host = mysql_fetch_object($result); if (!strlen($host->domain_name) && !strlen($host->last_ip_addr)) { return "(blank)"; } else { return $host->domain_name . " (" . $host->last_ip_addr . ")"; } } ?>