Statistic Information\n"; if($submitErr) { printSubmitErr(STARTERR); printSubmitErr(ENDERR); printSubmitErr(ORDERERR); $monthkey1 = processInputVar("month1", ARG_NUMERIC); $daykey1 = processInputVar("day1", ARG_NUMERIC); $yearkey1 = processInputVar("year1", ARG_NUMERIC); $monthkey2 = processInputVar("month2", ARG_NUMERIC); $daykey2 = processInputVar("day2", ARG_NUMERIC); $yearkey2 = processInputVar("year2", ARG_NUMERIC); $affilid = processInputVar("affilid", ARG_NUMERIC); } else $affilid = $user['affiliationid']; print "Select a starting date:
\n"; $months = array("", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"); unset($months[0]); $days = array(); for($i = 0; $i < 32; $i++) { array_push($days, $i); } unset($days[0]); $years = array(); for($i = 2004; $i <= $year2; $i++) { $years[$i] = $i; } if(! $submitErr) { $monthkey1 = array_search($month1, $months); $daykey1 = array_search($day1, $days); $yearkey1 = array_search($year1, $years); } print "
\n"; printSelectInput("month1", $months, $monthkey1); printSelectInput("day1", $days, $daykey1); printSelectInput("year1", $years, $yearkey1); print "
\n"; print "Select a ending date:
\n"; if(! $submitErr) { $monthkey2 = array_search($month2, $months); $daykey2 = array_search($day2, $days); $yearkey2 = array_search($year2, $years); } print "\n"; printSelectInput("month2", $months, $monthkey2); printSelectInput("day2", $days, $daykey2); printSelectInput("year2", $years, $yearkey2); print "
\n"; if($viewmode >= ADMIN_FULL) { print "Select an affiliation:
\n"; $affils = getAffiliations(); if(! array_key_exists($affilid, $affils)) $affilid = $user['affiliationid']; $affils = array_reverse($affils, TRUE); $affils[0] = "All"; $affils = array_reverse($affils, TRUE); printSelectInput("affilid", $affils, $affilid); print "
\n"; } $cont = addContinuationsEntry('viewstats'); print "\n"; print "\n"; print "
\n"; } //////////////////////////////////////////////////////////////////////////////// /// /// \fn viewStatistics /// /// \brief prints statistic information /// //////////////////////////////////////////////////////////////////////////////// function viewStatistics() { global $submitErr, $submitErrMsg, $user, $viewmode; define("30MIN", 1800); define("1HOUR", 3600); define("2HOURS", 7200); define("4HOURS", 14400); $month1 = processInputVar("month1", ARG_NUMERIC); $day1 = processInputVar("day1", ARG_NUMERIC); $year1 = processInputVar("year1", ARG_NUMERIC); $month2 = processInputVar("month2", ARG_NUMERIC); $day2 = processInputVar("day2", ARG_NUMERIC); $year2 = processInputVar("year2", ARG_NUMERIC); $affilid = processInputVar("affilid", ARG_NUMERIC, $user['affiliationid']); $affils = getAffiliations(); if($viewmode < ADMIN_FULL || ($affilid != 0 && ! array_key_exists($affilid, $affils))) $affilid = $user['affiliationid']; $start = "$year1-$month1-$day1 00:00:00"; $end = "$year2-$month2-$day2 23:59:59"; if(! checkdate($month1, $day1, $year1)) { $submitErr |= STARTERR; $submitErrMsg[STARTERR] = "The selected start date is not valid. Please " . "select a valid date.
\n"; } if(! checkdate($month2, $day2, $year2)) { $submitErr |= ENDERR; $submitErrMsg[ENDERR] = "The selected end date is not valid. Please " . "select a valid date.
\n"; } if(datetimeToUnix($start) > datetimeToUnix($end)) { $submitErr |= ORDERERR; $submitErrMsg[ORDERERR] = "The selected end date is before the selected " . "start date. Please select an end date equal " . "to or greater than the start date.
\n"; } if($submitErr) { selectStatistics(); return; } $timestart = microtime(1); print "

Statistic Information

\n"; print "

Reservation information between $month1/$day1/$year1 and "; print "$month2/$day2/$year2:\n"; print "

\n"; $reloadid = getUserlistID('vclreload@Local'); $query = "SELECT l.userid, " . "l.nowfuture, " . "UNIX_TIMESTAMP(l.start) AS start, " . "(UNIX_TIMESTAMP(l.loaded) - UNIX_TIMESTAMP(l.start)) AS loadtime, " . "UNIX_TIMESTAMP(l.finalend) AS finalend, " . "l.wasavailable, " . "l.ending, " . "i.prettyname, " . "o.prettyname AS OS " . "FROM log l, " . "image i, " . "user u, " . "OS o " . "WHERE l.start >= '$start' AND " . "l.finalend <= '$end' AND " . "i.id = l.imageid AND " . "i.OSid = o.id AND " . "l.userid != $reloadid AND "; if($affilid != 0) $query .= "u.affiliationid = $affilid AND "; $query .= "l.userid = u.id " . "ORDER BY i.prettyname"; $qh = doQuery($query, 275); $totalreservations = 0; $users = array(); $nows = 0; $futures = 0; $notavailable = 0; $loadtimes = array("2less" => 0, "2more" => 0); $ending = array("deleted" => 0, "released" => 0, "failed" => 0, "noack" => 0, "nologin" => 0, "timeout" => 0, "EOR" => 0, "none" => 0); $imagecount = array(); $imageusers = array(); $imagehours = array(); $imageload2less = array(); $imageload2more = array(); $imagefails = array(); $lengths = array("30min" => 0, "1hour" => 0, "2hours" => 0, "4hours" => 0, "4hrsplus" => 0); $totalhours = 0; $osusers = array(); while($row = mysql_fetch_assoc($qh)) { if(! array_key_exists($row["prettyname"], $imageload2less)) $imageload2less[$row["prettyname"]] = 0; if(! array_key_exists($row["prettyname"], $imageload2more)) $imageload2more[$row["prettyname"]] = 0; # notavailable if($row["wasavailable"] == 0) { $notavailable++; } else { $totalreservations++; # load times if($row['loadtime'] < 120) { $loadtimes['2less']++; # imageload2less $imageload2less[$row['prettyname']]++; } else { $loadtimes['2more']++; # imageload2more $imageload2more[$row['prettyname']]++; } } # users $users[$row['userid']] = 1; # nowfuture if($row["nowfuture"] == "now") $nows++; else $futures++; # ending $ending[$row["ending"]]++; # imagecount if(! array_key_exists($row["prettyname"], $imagecount)) $imagecount[$row["prettyname"]] = 0; $imagecount[$row["prettyname"]]++; # imageusers if(! array_key_exists($row["prettyname"], $imageusers)) $imageusers[$row["prettyname"]] = array(); $imageusers[$row['prettyname']][$row['userid']] = 1; # lengths $length = $row["finalend"] - $row["start"]; if($length <= 1800) $lengths["30min"]++; elseif($length <= 3600) $lengths["1hour"]++; elseif($length <= 7200) $lengths["2hours"]++; elseif($length <= 14400) $lengths["4hours"]++; else $lengths["4hrsplus"]++; # imagehours if(! array_key_exists($row["prettyname"], $imagehours)) $imagehours[$row["prettyname"]] = 0; $imagehours[$row["prettyname"]] += ($length / 3600); # imagefails if(! array_key_exists($row["prettyname"], $imagefails)) $imagefails[$row["prettyname"]] = 0; if($row['ending'] == 'failed') $imagefails[$row["prettyname"]] += 1; # total hours $totalhours += ($length / 3600); # osusers if(! array_key_exists($row["OS"], $osusers)) $osusers[$row["OS"]] = array(); $osusers[$row['OS']][$row['userid']] = 1; } print "
\n"; print "\n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; if($viewmode >= ADMIN_FULL) { print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; } print " \n"; print " \n"; print " \n"; print " \n"; foreach(array_keys($osusers) as $key) { print " \n"; print " \n"; print " \n"; print " \n"; } print "
Total Reservations:$totalreservations
Total Hours Used:" . (int)$totalhours . "
\"Now\" Reservations:$nows
\"Later\" Reservations:$futures
Unavailable:$notavailable
Load times < 2 minutes:{$loadtimes['2less']}
Load times >= 2 minutes:{$loadtimes['2more']}
Total Unique Users:" . count($users) . "
Unique Users of $key:" . count($osusers[$key]) . "
\n"; print "\n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; if($viewmode >= ADMIN_FULL) { print " \n"; print " \n"; print " \n"; } print " \n"; foreach($imagecount as $key => $value) { print " \n"; print " \n"; print " \n"; print " \n"; if(((int)$imagehours[$key]) == 0) print " \n"; else print " \n"; if($viewmode >= ADMIN_FULL) { print " \n"; print " \n"; if($imagefails[$key]) { $percent = $imagefails[$key] * 100 / $value; if($percent < 1) $percent = sprintf('%.1f%%', $percent); else $percent = sprintf('%d%%', $percent); print " \n"; } else print " \n"; } print " \n"; } print "
ReservationsUnique UsersHours Used< 2 min load time>= 2 min load timeFailures
$key:$value" . count($imageusers[$key]) . "1" . (int)$imagehours[$key] . "{$imageload2less[$key]}{$imageload2more[$key]}{$imagefails[$key]} "; print "($percent){$imagefails[$key]}
\n"; print "

Durations:

\n"; print "\n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print "
0 - 30 Min:" . $lengths["30min"] . "
30 Min - 1 Hour:" . $lengths["1hour"] . "
1 Hour - 2 Hours:" . $lengths["2hours"] . "
2 Hours - 4 Hours:" . $lengths["4hours"] . "
> 4 Hours:" . $lengths["4hrsplus"] . "
\n"; print "

Ending information:

\n"; print "\n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; print "
Deleted:" . $ending["deleted"] . "(Future reservation deleted before start time reached)
Released:" . $ending["released"] . "(Reservation released before end time reached)
Not Acknowledged:" . $ending["noack"] . "(\"Connect!\" button never clicked)
No Login:" . $ending["nologin"] . "(User never logged in)
End of Reservation:" . $ending["EOR"] . "(End of reservation reached)
Timed Out:" . $ending["timeout"] . "(Disconnect and no reconnection within 15 minutes)
Failed:" . $ending["failed"] . "(Reserved computer failed to get prepared for user)
\n"; print "
\n"; $unixstart = datetimeToUnix($start); $unixend = datetimeToUnix($end); $start = date('Y-m-d', $unixstart); $end = date('Y-m-d', $unixend); $cdata = array('start' => $start, 'end' => $end, 'affilid' => $affilid); print "

Reservations by Day

\n"; $cont = addContinuationsEntry('statgraphday', $cdata); print ""; print "

Max Concurrent Reservations By Day

\n"; if($unixend - $unixstart > SECINMONTH) print "(this graph only available for up to a month of data)
\n"; else { $cont = addContinuationsEntry('statgraphdayconcuruser', $cdata); print ""; } print "

Max Concurrent Blade Reservations By Day

\n"; if($unixend - $unixstart > SECINMONTH) print "(this graph only available for up to a month of data)
\n"; else { $cont = addContinuationsEntry('statgraphdayconcurblade', $cdata); print ""; } print "

Reservations by Hour

\n"; print "(Averaged over the time period)

\n"; $cont = addContinuationsEntry('statgraphhour', $cdata); print ""; print "
\n"; $endtime = microtime(1); $end = $endtime - $timestart; #print "running time: $endtime - $timestart = $end
\n"; } //////////////////////////////////////////////////////////////////////////////// /// /// \fn sendStatGraphDay() /// /// \brief sends a graph image /// //////////////////////////////////////////////////////////////////////////////// function sendStatGraphDay() { global $xaxislabels, $inContinuation; if(! $inContinuation) return; $start = getContinuationVar("start"); $end = getContinuationVar("end"); $affilid = getContinuationVar("affilid"); $graphdata = getStatGraphDayData($start, $end, $affilid); $count = count($graphdata["labels"]); if($count < 8) $labelinterval = 1; else $labelinterval = $count / 7; $xaxislabels = $graphdata["labels"]; $graph = new Graph(300, 300, "auto"); $graph->SetScale("textlin"); $plot = new BarPlot($graphdata["points"]); $graph->Add($plot); $graph->xaxis->SetLabelFormatCallback('statXaxisDayCallback'); $graph->xaxis->SetLabelAngle(90); $graph->xaxis->SetTextLabelInterval($labelinterval); $graph->yaxis->SetTitle('Reservations with start time on given day', 'high'); $graph->SetMargin(40,40,20,80); $graph->Stroke(); } //////////////////////////////////////////////////////////////////////////////// /// /// \fn getStatGraphDayData($start, $end, $affilid) /// /// \param $start - starting day in YYYY-MM-DD format /// \param $end - ending day in YYYY-MM-DD format /// \param $affilid - affiliationid of data to gather /// /// \return an array whose keys are the days (in YYYY-MM-DD format) between /// $start and $end, inclusive, and whose values are the number of reservations /// on each day /// /// \brief queries the log table to get reservations between $start and $end /// and creates an array with the number of reservations on each day /// //////////////////////////////////////////////////////////////////////////////// function getStatGraphDayData($start, $end, $affilid) { $startunix = datetimeToUnix($start . " 00:00:00"); $endunix = datetimeToUnix($end . " 23:59:59"); $data = array(); $data["points"] = array(); $data["labels"] = array(); $reloadid = getUserlistID('vclreload@Local'); for($i = $startunix; $i < $endunix; $i += SECINDAY) { array_push($data["labels"], date('Y-m-d', $i)); $startdt = unixToDatetime($i); $enddt = unixToDatetime($i + SECINDAY); if($affilid != 0) { $query = "SELECT count(l.id) " . "FROM log l, " . "user u " . "WHERE l.start >= '$startdt' AND " . "l.start < '$enddt' AND " . "l.userid != $reloadid AND " . "l.wasavailable = 1 AND " . "l.userid = u.id AND " . "u.affiliationid = $affilid"; } else { $query = "SELECT count(l.id) " . "FROM log l " . "WHERE l.start >= '$startdt' AND " . "l.start < '$enddt' AND " . "l.userid != $reloadid AND " . "l.wasavailable = 1"; } $qh = doQuery($query, 295); if($row = mysql_fetch_row($qh)) array_push($data["points"], $row[0]); else array_push($data["points"], 0); } return($data); } //////////////////////////////////////////////////////////////////////////////// /// /// \fn statXaxisDayCallback($val) /// /// \param $val - value passed in by SetLabelFormatCallback /// /// \return day of week /// /// \brief formats $val into day of week /// //////////////////////////////////////////////////////////////////////////////// function statXaxisDayCallback($val) { global $xaxislabels; if(array_key_exists((int)$val, $xaxislabels)) { return date('n/d/Y', datetimeToUnix($xaxislabels[$val] . " 00:00:00")) . " "; } else { return $val; } } //////////////////////////////////////////////////////////////////////////////// /// /// \fn sendStatGraphHour() /// /// \brief sends a graph image /// //////////////////////////////////////////////////////////////////////////////// function sendStatGraphHour() { global $xaxislabels, $inContinuation; if(! $inContinuation) return; $start = getContinuationVar("start"); $end = getContinuationVar("end"); $affilid = getContinuationVar("affilid"); $graphdata = getStatGraphHourData($start, $end, $affilid); $graph = new Graph(300, 300, "auto"); $graph->SetScale("textlin"); $plot = new LinePlot($graphdata["points"]); $graph->Add($plot); $graph->xaxis->SetLabelFormatCallback('statXaxisHourCallback'); $graph->xaxis->SetLabelAngle(90); $graph->xaxis->SetTextLabelInterval(2); $graph->yaxis->SetTitle('Active reservations during given hour', 'high'); $graph->SetMargin(40,40,20,80); $graph->Stroke(); } //////////////////////////////////////////////////////////////////////////////// /// /// \fn getStatGraphHourData($start, $end, $affilid) /// /// \param $start - starting day in YYYY-MM-DD format /// \param $end - ending day in YYYY-MM-DD format /// \param $affilid - affiliationid of data to gather /// /// \return an array whose keys are the days (in YYYY-MM-DD format) between /// $start and $end, inclusive, and whose values are the number of reservations /// on each day /// /// \brief queries the log table to get reservations between $start and $end /// and creates an array with the number of reservations on each day /// //////////////////////////////////////////////////////////////////////////////// function getStatGraphHourData($start, $end, $affilid) { $startdt = $start . " 00:00:00"; $enddt = $end . " 23:59:59"; $startunix = datetimeToUnix($startdt); $endunix = datetimeToUnix($enddt) + 1; $enddt = unixToDatetime($endunix); $days = ($endunix - $startunix) / SECINDAY; $data = array(); $data["points"] = array(); for($i = 0; $i < 24; $i++) { $data["points"][$i] = 0; } $reloadid = getUserlistID('vclreload@Local'); if($affilid != 0) { $query = "SELECT DATE_FORMAT(l.start, '%k') AS shour, " . "DATE_FORMAT(l.start, '%i') AS smin, " . "DATE_FORMAT(l.finalend, '%k') AS ehour, " . "DATE_FORMAT(l.finalend, '%i') AS emin " . "FROM log l, " . "user u " . "WHERE l.start < '$enddt' AND " . "l.finalend > '$startdt' AND " . "l.userid != $reloadid AND " . "l.userid = u.id AND " . "l.wasavailable = 1 AND " . "u.affiliationid = $affilid"; } else { $query = "SELECT DATE_FORMAT(l.start, '%k') AS shour, " . "DATE_FORMAT(l.start, '%i') AS smin, " . "DATE_FORMAT(l.finalend, '%k') AS ehour, " . "DATE_FORMAT(l.finalend, '%i') AS emin " . "FROM log l " . "WHERE l.start < '$enddt' AND " . "l.finalend > '$startdt' AND " . "l.userid != $reloadid AND " . "l.wasavailable = 1"; } $qh = doQuery($query, 296); $count = 0; while($row = mysql_fetch_assoc($qh)) { $startmin = ($row['shour'] * 60) + $row['smin']; $endmin = ($row['ehour'] * 60) + $row['emin']; for($binstart = 0, $binend = 60, $binindex = 0; $binend <= 1440; $binstart += 60, $binend += 60, $binindex++) { if($binend <= $startmin) continue; elseif($startmin < $binend && $endmin > $binstart) { $data["points"][$binindex]++; } elseif($binstart >= $endmin) break; } } # comment this to change graph to be aggregate instead of average foreach($data["points"] as $key => $val) $data["points"][$key] = $val / $days; return($data); } //////////////////////////////////////////////////////////////////////////////// /// /// \fn statXaxisHourCallback($val) /// /// \param $val - value passed in by SetLabelFormatCallback /// /// \return day of week /// /// \brief formats $val into day of week /// //////////////////////////////////////////////////////////////////////////////// function statXaxisHourCallback($val) { if($val == 0) { return "12 am "; } elseif($val < 12) { return "$val am "; } elseif($val == 12) { return "$val pm "; } else { return $val - 12 . " pm "; } } //////////////////////////////////////////////////////////////////////////////// /// /// \fn sendStatGraphDayConUsers() /// /// \brief sends a graph image /// //////////////////////////////////////////////////////////////////////////////// function sendStatGraphDayConUsers() { global $xaxislabels, $inContinuation; if(! $inContinuation) return; $start = getContinuationVar("start"); $end = getContinuationVar("end"); $affilid = getContinuationVar("affilid"); $graphdata = getStatGraphDayConUsersData($start, $end, $affilid); $count = count($graphdata["labels"]); if($count < 8) $labelinterval = 1; else $labelinterval = $count / 7; $xaxislabels = $graphdata["labels"]; $graph = new Graph(300, 300, "auto"); $graph->SetScale("textlin"); $plot = new BarPlot($graphdata["points"]); $graph->Add($plot); $graph->xaxis->SetLabelFormatCallback('statXaxisDayConUsersCallback'); $graph->xaxis->SetLabelAngle(90); $graph->xaxis->SetTextLabelInterval($labelinterval); $graph->yaxis->SetTitle('Maximum concurrent reservations per day', 'high'); $graph->SetMargin(40,40,20,80); $graph->Stroke(); } //////////////////////////////////////////////////////////////////////////////// /// /// \fn getStatGraphDayConUsersData($start, $end, $affilid) /// /// \param $start - starting day in YYYY-MM-DD format /// \param $end - ending day in YYYY-MM-DD format /// \param $affilid - affiliationid of data to gather /// /// \return an array whose keys are the days (in YYYY-MM-DD format) between /// $start and $end, inclusive, and whose values are the max concurrent users /// on each day /// /// \brief queries the log table to get reservations between $start and $end /// and creates an array with the max concurrent users per day /// //////////////////////////////////////////////////////////////////////////////// function getStatGraphDayConUsersData($start, $end, $affilid) { $startdt = $start . " 00:00:00"; $enddt = $end . " 23:59:59"; $startunix = datetimeToUnix($startdt); $endunix = datetimeToUnix($enddt) + 1; $days = ($endunix - $startunix) / SECINDAY; $data = array(); $data["points"] = array(); $data["labels"] = array(); $reloadid = getUserlistID('vclreload@Local'); for($daystart = $startunix; $daystart < $endunix; $daystart += SECINDAY) { array_push($data["labels"], date('Y-m-d', $daystart)); $count = array(); for($j = 0; $j < 24; $j++) { $count[$j] = 0; } $startdt = unixToDatetime($daystart); $enddt = unixToDatetime($daystart + SECINDAY); if($affilid != 0) { $query = "SELECT UNIX_TIMESTAMP(l.start) AS start, " . "UNIX_TIMESTAMP(l.finalend) AS end " . "FROM log l, " . "user u " . "WHERE l.start < '$enddt' AND " . "l.finalend > '$startdt' AND " . "l.userid != $reloadid AND " . "l.userid = u.id AND " . "u.affiliationid = $affilid"; } else { $query = "SELECT UNIX_TIMESTAMP(l.start) AS start, " . "UNIX_TIMESTAMP(l.finalend) AS end " . "FROM log l " . "WHERE l.start < '$enddt' AND " . "l.finalend > '$startdt' AND " . "l.userid != $reloadid"; } $qh = doQuery($query, 101); while($row = mysql_fetch_assoc($qh)) { $unixstart = $row["start"]; $unixend = $row["end"]; for($binstart = $daystart, $binend = $daystart + 3600, $binindex = 0; $binstart <= $unixend && $binend <= ($daystart + SECINDAY); $binstart += 3600, $binend += 3600, $binindex++) { if($binend <= $unixstart) { continue; } elseif($unixstart < $binend && $unixend > $binstart) { $count[$binindex]++; } elseif($binstart >= $unixend) { break; } } } rsort($count); array_push($data["points"], $count[0]); } return($data); } //////////////////////////////////////////////////////////////////////////////// /// /// \fn statXaxisDayConUsersCallback($val) /// /// \param $val - value passed in by SetLabelFormatCallback /// /// \return day of week /// /// \brief formats $val into day of week /// //////////////////////////////////////////////////////////////////////////////// function statXaxisDayConUsersCallback($val) { global $xaxislabels; if(array_key_exists((int)$val, $xaxislabels)) { return date('n/d/Y', datetimeToUnix($xaxislabels[$val] . " 00:00:00")) . " "; } else { return $val; } } //////////////////////////////////////////////////////////////////////////////// /// /// \fn sendStatGraphConBladeUser() /// /// \brief sends a graph image of max concurrent users of blades per day /// //////////////////////////////////////////////////////////////////////////////// function sendStatGraphConBladeUser() { global $xaxislabels, $inContinuation; if(! $inContinuation) return; $start = getContinuationVar("start"); $end = getContinuationVar("end"); $affilid = getContinuationVar("affilid"); $graphdata = getStatGraphConBladeUserData($start, $end, $affilid); $count = count($graphdata["labels"]); if($count < 8) $labelinterval = 1; else $labelinterval = $count / 7; $xaxislabels = $graphdata["labels"]; $graph = new Graph(300, 300, "auto"); $graph->SetScale("textlin"); $plot = new BarPlot($graphdata["points"]); $graph->Add($plot); $graph->xaxis->SetLabelFormatCallback('statXaxisDayConUsersCallback'); $graph->xaxis->SetLabelAngle(90); $graph->xaxis->SetTextLabelInterval($labelinterval); $graph->yaxis->SetTitle('Maximum concurrent reservations per day', 'high'); $graph->SetMargin(40,40,20,80); $graph->Stroke(); } //////////////////////////////////////////////////////////////////////////////// /// /// \fn getStatGraphConBladeUserData($start, $end, $affilid) /// /// \param $start - starting day in YYYY-MM-DD format /// \param $end - ending day in YYYY-MM-DD format /// \param $affilid - affiliationid of data to gather /// /// \return an array whose keys are the days (in YYYY-MM-DD format) between /// $start and $end, inclusive, and whose values are the max concurrent users /// of blades on each day /// /// \brief queries the log table to get reservations between $start and $end /// and creates an array with the max concurrent users of blades per day /// //////////////////////////////////////////////////////////////////////////////// function getStatGraphConBladeUserData($start, $end, $affilid) { $startdt = $start . " 00:00:00"; $enddt = $end . " 23:59:59"; $startunix = datetimeToUnix($startdt); $endunix = datetimeToUnix($enddt) + 1; $days = ($endunix - $startunix) / SECINDAY; $data = array(); $data["points"] = array(); $data["labels"] = array(); $reloadid = getUserlistID('vclreload@Local'); for($daystart = $startunix; $daystart < $endunix; $daystart += SECINDAY) { array_push($data["labels"], date('Y-m-d', $daystart)); $count = array(); for($j = 0; $j < 24; $j++) { $count[$j] = 0; } $startdt = unixToDatetime($daystart); $enddt = unixToDatetime($daystart + SECINDAY); if($affilid != 0) { $query = "SELECT l.start AS start, " . "l.finalend AS end " . "FROM log l, " . "sublog s, " . "computer c, " . "user u " . "WHERE l.userid = u.id AND " . "l.start < '$enddt' AND " . "l.finalend > '$startdt' AND " . "s.logid = l.id AND " . "s.computerid = c.id AND " . "l.wasavailable = 1 AND " . "c.type = 'blade' AND " . "l.userid != $reloadid AND " . "u.affiliationid = $affilid"; } else { $query = "SELECT l.start AS start, " . "l.finalend AS end " . "FROM log l, " . "sublog s, " . "computer c " . "WHERE l.start < '$enddt' AND " . "l.finalend > '$startdt' AND " . "s.logid = l.id AND " . "s.computerid = c.id AND " . "l.wasavailable = 1 AND " . "c.type = 'blade' AND " . "l.userid != $reloadid"; } $qh = doQuery($query, 101); while($row = mysql_fetch_assoc($qh)) { $unixstart = datetimeToUnix($row["start"]); $unixend = datetimeToUnix($row["end"]); for($binstart = $daystart, $binend = $daystart + 3600, $binindex = 0; $binstart <= $unixend && $binend <= ($daystart + SECINDAY); $binstart += 3600, $binend += 3600, $binindex++) { if($binend <= $unixstart) { continue; } elseif($unixstart < $binend && $unixend > $binstart) { $count[$binindex]++; } elseif($binstart >= $unixend) { break; } } } rsort($count); array_push($data["points"], $count[0]); } return($data); } //////////////////////////////////////////////////////////////////////////////// /// /// \fn statXaxisConBladeUserCallback($val) /// /// \param $val - value passed in by SetLabelFormatCallback /// /// \return day of week /// /// \brief formats $val into day of week /// //////////////////////////////////////////////////////////////////////////////// function statXaxisConBladeUserCallback($val) { global $xaxislabels; if(array_key_exists((int)$val, $xaxislabels)) { return date('n/d/Y', datetimeToUnix($xaxislabels[$val] . " 00:00:00")) . " "; } else { return $val; } } ?>