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";
}
////////////////////////////////////////////////////////////////////////////////
///
/// \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();
$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);
# 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 " Total Reservations: | \n";
print " $totalreservations | \n";
print "
\n";
print " \n";
print " Total Hours Used: | \n";
print " " . (int)$totalhours . " | \n";
print "
\n";
print " \n";
print " \"Now\" Reservations: | \n";
print " $nows | \n";
print "
\n";
print " \n";
print " \"Later\" Reservations: | \n";
print " $futures | \n";
print "
\n";
print " \n";
print " Unavailable: | \n";
print " $notavailable | \n";
print "
\n";
if($viewmode >= ADMIN_FULL) {
print " \n";
print " Load times < 2 minutes: | \n";
print " {$loadtimes['2less']} | \n";
print "
\n";
print " \n";
print " Load times >= 2 minutes: | \n";
print " {$loadtimes['2more']} | \n";
print "
\n";
}
print " \n";
print " Total Unique Users: | \n";
print " " . count($users) . " | \n";
print "
\n";
foreach(array_keys($osusers) as $key) {
print " \n";
print " Unique Users of $key: | \n";
print " " . count($osusers[$key]) . " | \n";
print "
\n";
}
print "
\n";
print "
\n";
print " \n";
print " | \n";
print " Reservations | \n";
print " Unique Users | \n";
print " Hours Used | \n";
if($viewmode >= ADMIN_FULL) {
print " < 2 min load time | \n";
print " >= 2 min load time | \n";
}
print "
\n";
foreach($imagecount as $key => $value) {
print " \n";
print " $key: | \n";
print " $value | \n";
print " " . count($imageusers[$key]) . " | \n";
if(((int)$imagehours[$key]) == 0)
print " 1 | \n";
else
print " " . (int)$imagehours[$key] . " | \n";
if($viewmode >= ADMIN_FULL) {
print " {$imageload2less[$key]} | \n";
print " {$imageload2more[$key]} | \n";
}
print "
\n";
}
print "
\n";
print "
Durations:
\n";
print "
\n";
print " \n";
print " 0 - 30 Min: | \n";
print " " . $lengths["30min"] . " | \n";
print "
\n";
print " \n";
print " 30 Min - 1 Hour: | \n";
print " " . $lengths["1hour"] . " | \n";
print "
\n";
print " \n";
print " 1 Hour - 2 Hours: | \n";
print " " . $lengths["2hours"] . " | \n";
print "
\n";
print " \n";
print " 2 Hours - 4 Hours: | \n";
print " " . $lengths["4hours"] . " | \n";
print "
\n";
print " \n";
print " > 4 Hours: | \n";
print " " . $lengths["4hrsplus"] . " | \n";
print "
\n";
print "
\n";
print "
Ending information:
\n";
print "
\n";
print " \n";
print " Deleted: | \n";
print " " . $ending["deleted"] . " | \n";
print " | \n";
print " (Future reservation deleted before start time reached) | \n";
print "
\n";
print " \n";
print " Released: | \n";
print " " . $ending["released"] . " | \n";
print " (Reservation released before end time reached) | \n";
print "
\n";
print " \n";
print " Not Acknowledged: | \n";
print " " . $ending["noack"] . " | \n";
print " (\"Connect!\" button never clicked) | \n";
print "
\n";
print " \n";
print " No Login: | \n";
print " " . $ending["nologin"] . " | \n";
print " (User never logged in) | \n";
print "
\n";
print " \n";
print " End of Reservation: | \n";
print " " . $ending["EOR"] . " | \n";
print " (End of reservation reached) | \n";
print "
\n";
print " \n";
print " Timed Out: | \n";
print " " . $ending["timeout"] . " | \n";
print " (Disconnect and no reconnection within 15 minutes) | \n";
print "
\n";
print " \n";
print " Failed: | \n";
print " " . $ending["failed"] . " | \n";
print " (Reserved computer failed to get prepared for user) | \n";
print "
\n";
print "
\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;
}
}
?>