blob: d950373b51cee6e4ecd53377a115b43d622ad7b3 [file] [log] [blame]
<?php
/* Copyright (c) 2006-2009 Eclipse Foundation, made available under EPL v1.0
* Contributors Ward Cunningham, Bjorn Freeman-Benson, Nick Boldt, Karl Matthias
*
* The common parameter parsing module for the REST web-api
* for retrieving data from the database. This is NOT part
* of the public web-api.
*
* top=x | y | name
* project=x | y | name
* year=x | y | yyyy
* month=x | y | yyyymm
* day=x | y | yyyymmdd
* login=x | y | name
* file=x | y | name
* type=x | y | name
* change=x | y | nnnn
* message=x | y | nnnn
* company=x | y | name
*
* Exactly one "x" and one "y" and any number of other values.
*/
ini_set('display_errors', 1); ini_set('error_reporting', E_ALL);
$debug = isset($_GET["debug"]) ? $_GET["debug"] : 0;
$user="dashboard";
require_once("dbpassword.php");
$database="dashboard";
if (isset($password) && $password)
{
$_dbh = mysql_connect('dashdbhost', $user, $password);
mysql_select_db($database, $_dbh);
}
else
{
$_dbh = null;
}
/* Get X, Y, where as returned array of variables. Assign with list($columnX, $columnY, $where) = getXYWHERE(); */
function getXYWHERE()
{
global $debug;
$param = null;
$columnX = "";
$columnY = "";
$where = "";
$input_patterns = array(
/* regex => array(fieldname => http get variable) */
"#([0-9%]+)#" => array(
"CHANGE_SIZE" => "change",
"MESSAGE_SIZE" => "message",
"YEAR" => "year",
"YEARMONTH" => "month",
"YEARMONTHDAY" => "day",
),
"#([a-zA-Z%_\.-]+)#" => array(
"LOGIN" => "login",
"TOPPROJECT" => "top",
"FILETYPE" => "type",
),
"#([a-zA-Z0-9%_\.-]+)#" => array(
"PROJECT" => "project",
),
"#([a-zA-Z% ,\.-]+)#" => array(
"COMPANY" => "company",
),
"#([a-zA-Z0-9% _\/\$\.-]+)#" => array(
"FILENAME" => "file",
)
);
foreach($input_patterns as $regex => $pairs)
{
foreach ($pairs as $sqlfieldname => $httpfieldname)
{
$param = isset($_GET[$httpfieldname]) ? $_GET[$httpfieldname] : (isset($_GET[$sqlfieldname]) ? $_GET[$sqlfieldname] : null);
if ($debug)
{
print "<pre> [$regex][$sqlfieldname][$httpfieldname] Got \$param = $param </pre>\n";
}
if ($param && strtolower($param) == "x")
{
$columnX = $sqlfieldname; /* use as X column */
}
else if ($param && strtolower($param) == "y")
{
$columnY = $sqlfieldname; /* use as Y column */
}
else if ($param)
{
if (preg_match($regex, $param, $matches))
{
$where .= ($where != "" ? " AND " : "") . $sqlfieldname . " LIKE " .
(is_numeric($matches[1]) ? $matches[1] : "'" . $matches[1] . "'"); /* add to WHERE clause */
}
}
}
}
return array($columnX, $columnY, $where);
}
/* get user-specified fields as CSV string, or fall back to a default list */
function getFields($defaultFields = "")
{
$fieldsOut = "";
$validFields = array("ID", "DATE", "YEAR", "YEARMONTH", "YEARMONTHDAY", "TOPPROJECT", "PROJECT", "FILENAME", "FILETYPE", "REVISION", "CHANGE_SIZE", "MESSAGE_SIZE", "LOGIN", "COMPANY");
if (isset($_GET["fields"]) && preg_match("#([a-zA-Z,_ ]+)#", $_GET["fields"], $matches))
{
$bits = preg_split("#[, ]+#", $matches[1]);
foreach ($bits as $bit)
{
if (in_array(strtoupper($bit), $validFields))
{
$fieldsOut .= ($fieldsOut != "" ? ", " : "") . strtoupper($bit); // if valid field name, collect
}
}
}
// support $defaultFields input as array or CSV string
$defaultFields = $defaultFields && is_array($defaultFields) && sizeof($defaultFields) > 1 ? implode(", ", $defaultFields) : $defaultFields;
// return the input collected values; or, the function's default list; or, the entire list if no default given
return $fieldsOut ? $fieldsOut : ($defaultFields ? $defaultFields : implode(", ", $validFields));
}
// for convenience
function displayQueryAndReturn($_query)
{
return displayQuery($_query, true);
}
// to return an array of queried data, second param true
function displayQuery($_query, $returnArray = false)
{
global $_dbh;
echo( "# " . $_query . "\n" );
$result = mysql_query($_query,$_dbh);
$data = array();
if (!$result) {
echo("# MySQL Error: ".mysql_error() . "\n");
} else {
while($row = mysql_fetch_array($result)){
if ($returnArray)
{
$data[] = $row;
}
for ($i=0; $i<sizeof($row); $i++)
{
print isset($row[$i]) ? $row[$i] . "\t" : "";
}
print "\n";
}
}
return $returnArray ? $data : null;
# Don't put a blank line here. Other code parses this. Thanks.
}
// to return an array of queried data w/o displaying output
function runQuery($_query)
{
global $_dbh;
$result = mysql_query($_query,$_dbh);
$data = array();
if (!$result) {
echo("# MySQL Error: ".mysql_error() . "\n");
} else {
while($row = mysql_fetch_array($result)){
$data[] = $row;
}
}
return $data;
}
/* get user-specified list of queries to run as an array of query names, or fall back to a default list */
function getQueries($defaultQueries = array()) // default queries to show if none requested
{
global $validQueries;
$queriesOut = array();
$validQueryNames = array_keys($validQueries); $validQueryNames[] = "all";
if (isset($_GET["queries"]) && preg_match("#([a-zA-Z0-9,_ ]+)#", $_GET["queries"], $matches))
{
$bits = preg_split("#[, ]+#", $matches[1]);
foreach ($bits as $bit)
{
if (in_array(strtolower($bit), $validQueryNames))
{
$queriesOut[] = strtolower($bit); // if valid query name, collect
}
}
}
// return the input collected values; or, the function's default list; or, the entire list if no default given
return $queriesOut ? $queriesOut : ($defaultQueries && is_array($defaultQueries) && sizeof($defaultQueries) > 0 ? $defaultQueries : $validQueryNames);
}
/* return array of lines from a given host and URL */
function http_file($host, $url, $qs=null)
{
if (ini_get('allow_url_fopen'))
{
return file("http://" . $host . (isset($url) ? $url : '/') . (isset($qs) ? '?' . $qs : ''));
}
else
{
return preg_split("#(\n\r|\r\n|\n|\r)#", http_file_get_contents($host, $url));
}
}
/* return a block of text (including newlines) from a given host and URL */
function http_file_get_contents($host, $url, $qs=null)
{
if (ini_get('allow_url_fopen'))
{
return file_get_contents("http://" . $host . (isset($url) ? $url : '/') . (isset($qs) ? '?' . $qs : ''));
}
else
{
$file_contents = "";
$fp = fsockopen($host, 80, $errno, $errstr, 30);
if (!$fp)
{
return "ERROR connecting to $host: $errstr ($errno)";
}
else
{
fputs($fp, "GET " . (isset($url) ? $url : '/') . (isset($qs) ? '?' . $qs : '') . " HTTP/1.1\r\n");
fputs($fp, "Host: $host\r\nUser-Agent: PHP Script\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: close\r\n\r\n");
while (!feof($fp))
{
$file_contents .= fgets($fp, 128);
}
fclose($fp);
}
return $file_contents;
}
}
/* get year, month, day values, and unset their $_GET variables */
function getYMD()
{
global $debug, $_GET;
$year = isset($_GET["year"]) ? $_GET["year"] : null; print $debug ? "\$year = $year<br/>\n" : ""; unset($_GET["year"]);
$month = isset($_GET["month"]) ? $_GET["month"] : null; print $debug ? "\$month = $month<br/>\n" : ""; unset($_GET["month"]);
$day = isset($_GET["day"]) ? $_GET["day"] : null; print $debug ? "\$day = $day<br/>\n" : ""; unset($_GET["day"]);
// override range with year, month, or day
if (!isset($_GET["range"]) || !$_GET["range"])
{
if ($year)
{
$_GET["range"] = "year";
}
else if ($month)
{
$_GET["range"] = "month";
}
else if ($day)
{
$_GET["range"] = "day";
}
}
else
{
if ($_GET["range"] == "year" && !$year)
{
$year = date("Y");
}
else if ($_GET["range"] == "month" && !$month)
{
$month = date("Ym");
}
else if ($_GET["range"] == "day" && !$day)
{
$day = date("Ymd");
}
}
return array($year, $month, $day);
}
function getValidRanges($fmt = "Ymd", &$YMD)
{
return array(
"1day"=> "YEARMONTHDAY >= " . date($fmt, strtotime("-1 day")) ,
"1wk" => "YEARMONTHDAY >= " . date($fmt, strtotime("-1 week")) ,
"1mo" => "YEARMONTHDAY >= " . date($fmt, strtotime("-1 month")) ,
"3mo" => "YEARMONTHDAY >= " . date($fmt, strtotime("-3 month")) ,
"6mo" => "YEARMONTHDAY >= " . date($fmt, strtotime("-6 month")) ,
"9mo" => "YEARMONTHDAY >= " . date($fmt, strtotime("-9 month")) ,
"12mo"=> "YEARMONTHDAY >= " . date($fmt, strtotime("-12 month")),
"1yr" => "YEARMONTHDAY >= " . date($fmt, strtotime("-12 month")),
"day" => "YEARMONTHDAY = " . ($YMD[2] ? $YMD[2] : date("Ymd")),
"month"=> "YEARMONTH = " . ($YMD[1] ? $YMD[1] : date("Ym")),
"year" => "YEAR = " . ($YMD[0] ? $YMD[0] : date("Y")),
);
}
function getRange($key, $def, $returnSQL = true)
{
global $validRanges;
return isset($key) && $key && array_key_exists($key, $validRanges) ? ($returnSQL ? $validRanges[$key] : $key) : $def;
}
?>