blob: df86d5882b5f7c4538fecc5ff0ca5b52d5b30346 [file] [log] [blame]
<?php
/*******************************************************************************
* Copyright (c) 2006-2014 Eclipse Foundation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Denis Roy (Eclipse Foundation)- initial API and implementation
* Karl Matthias (Eclipse Foundation) - Database access management
* Christopher Guindon (Eclipse Foundation)
*******************************************************************************/
class App {
private $APPVERSION = "1.0";
private $APPNAME = "Eclipse.org";
private $DEFAULT_ROW_HEIGHT = 20;
private $POST_MAX_SIZE = 262144; # 256KB Max post
private $OUR_DOWNLOAD_URL = "http://download1.eclipse.org";
private $PUB_DOWNLOAD_URL = "http://download.eclipse.org";
private $DOWNLOAD_BASE_PATH = "/home/data2/httpd/download.eclipse.org";
private $DB_CLASS_PATH = "/home/data/httpd/eclipse-php-classes/system/"; # ends with '/'
private $WWW_PREFIX = ""; # default is relative
private $HTTP_PREFIX = "http"; #default is http
# Additional page-related variables
public $ExtraHtmlHeaders = "";
public $ExtraJSFooter = "";
public $PageRSS = "";
public $PageRSSTitle = "";
public $Promotion = FALSE;
public $CustomPromotionPath = "";
private $THEME_LIST = array("", "Nova", "solstice", "polarsys");
#Open Graph Protocol Variables
private $OGTitle = "";
private $OGDescription = "Eclipse is probably best known as a Java IDE, but it is more: it is an IDE framework, a tools framework, an open source project, a community, an eco-system, and a foundation.";
private $OGImage = "https://www.eclipse.org/eclipse.org-common/themes/Nova/images/eclipse.png";
#Doctype
private $doctype = FALSE;
#Google Analytics Variables
private $projectGoogleAnalyticsCode = "";
private $googleJavaScript = "";
#jQuery Variables
private $jQueryVersion = FALSE;
# Twitter Follow Widget Variables
private $twitterScriptInserted = FALSE;
# Variables for theme customization (Solstice and up).
private $theme_variables = array();
# Set to TRUE to disable all database operations
private $DB_READ_ONLY = FALSE;
# Database config and handle cache
private $databases;
# Flag to determine whether the "deprecated" theme should be loaded.
private $OutDated = false;
# Deprecated theme message.
private $OutDatedMsg = "";
# Flag to determine whether this is development mode or not (for databases)
public $devmode = false;
# Flag to log SQL even on production systems
public $logsql = false;
# Arbitrary storage hash
private $hash;
# SQL Backtrace storage
public $query_btrace;
# Messages variable
private $Messages = NULL;
# Default constructor
function App() {
# Set value for WWW_PREFIX
$valid_domains = array(
'www.eclipse.org',
'eclipse.org',
'staging.eclipse.org',
'eclipse.local',
'www.eclipse.local'
);
$http_protocol = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') ? 'https://' : 'http://';
// Force http://www.eclipse.org if the serve_name is not whitelisted.
if (in_array($_SERVER['SERVER_NAME'], $valid_domains)) {
$this->WWW_PREFIX = $http_protocol;
$this->WWW_PREFIX .= isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : getenv('HTTP_HOST');
}
else {
$this->WWW_PREFIX = $http_protocol . 'www.eclipse.org';
}
$this->databases = array();
# Figure out if we're in devmode by whether the classes are installed or not
if(!file_exists($this->DB_CLASS_PATH)) {
$this->devmode = true;
}
# Configure databases (not connected)
$this->configureDatabases();
# Make it easy to override database and other settings (don't check app-config.php in to CVS!)
if($this->devmode) {
if(file_exists(getcwd() . '/app-config.php')) {
include_once(getcwd() . '/app-config.php');
# We call a function inside app-config.php and pass it a reference to ourselves because
# this class is still in the constructor and might not be available externally by name.
# File just contains a function called app_config() which is called. Nothing more is needed.
app_config($this);
}
else if(file_exists($_SERVER['DOCUMENT_ROOT'] . '/eclipse.org-common/system/app-config.php'))
{
include_once($_SERVER['DOCUMENT_ROOT'] . '/eclipse.org-common/system/app-config.php');
app_config($this);
}
}
# Initialize backtrace storage
$this->query_btrace = array();
# Set server timezone
date_default_timezone_set("America/Montreal");
}
/**
* This function returns the Webmaster object
* @return object
* */
public function getWebmaster($action = '') {
switch ($action) {
case "webmaster":
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/webmaster/webmaster.class.php");
return new Webmaster($this);
break;
case "mirrors":
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/webmaster/mirrors.class.php");
return new Mirrors($this);
break;
case "jobs":
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/webmaster/jobs.class.php");
return new Jobs($this);
break;
case "committers":
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/webmaster/committers.class.php");
return new Committers($this);
break;
case "firewall":
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/webmaster/firewall.class.php");
return new Firewall($this);
break;
case "mailinglists":
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/webmaster/mailinglists.class.php");
return new MailingLists($this);
break;
}
}
/**
* This function returns the Subscriptions object
* @return object
* */
public function getSubscriptions() {
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/subscriptions/subscriptions.class.php");
return new Subscriptions($this);
}
/**
* This function returns the CLA object
* @return object
* */
public function getCla() {
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/users/cla.class.php");
return new Cla($this);
}
/**
* This function sets System Messages
* @param $name - string containing the name of the message
* @param $msg - string containing the message itself
* @param $type - string containing the type of the message
* */
public function setSystemMessage($name, $msg, $type) {
if (get_class($this->Messages) !== 'Messages') {
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/messages.class.php");
$this->Messages = new Messages();
}
$this->Messages->setMessages($name, $msg, $type);
}
/**
* this function returns messages
* @return array
* */
public function getSystemMessage() {
if (get_class($this->Messages) !== 'Messages') {
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/messages.class.php");
$this->Messages = new Messages();
}
return $this->Messages->getMessages();
}
function getAppVersion() {
return $this->APPVERSION;
}
function getHeaderPath($_theme) {
return $_SERVER["DOCUMENT_ROOT"] . "/eclipse.org-common/themes/" . $_theme . "/header.php";
}
function getMenuPath($_theme) {
return $_SERVER["DOCUMENT_ROOT"] . "/eclipse.org-common/themes/" . $_theme . "/menu.php";
}
function getNavPath($_theme) {
return $_SERVER["DOCUMENT_ROOT"] . "/eclipse.org-common/themes/" . $_theme . "/nav.php";
}
function getFooterPath($_theme) {
return $_SERVER["DOCUMENT_ROOT"] . "/eclipse.org-common/themes/" . $_theme . "/footer.php";
}
function getPromotionPath($_theme) {
return $_SERVER["DOCUMENT_ROOT"] . "/home/promotions/promotion.php";
}
/**
* Get eclipse.org cookie domain and prefix based off the current environment
*
* @return array
*/
public function getEclipseDomain(){
$server['dev'] = array(
'cookie' => '.eclipse.local',
'domain' => 'www.eclipse.local:50243',
'dev_domain' => 'dev.eclipse.local:51143',
'allowed_hosts' => array(
'eclipse.local',
'www.eclipse.local',
'dev.eclipse.local',
'docker.local'
),
);
$server['staging'] = array(
'cookie' => '.eclipse.org',
'domain' => 'staging.eclipse.org',
// We currently dont have a staging server for dev.eclipse.org
'dev_domain' => 'dev.eclipse.org',
'allowed_hosts' => array(
'staging.eclipse.org'
),
);
$server['prod'] = array(
'cookie' => '.eclipse.org',
'domain' => 'www.eclipse.org',
'dev_domain' => 'dev.eclipse.org',
'allowed_hosts' => array(
// Empty, since it's the default.
),
);
// It should not matter if we are on http or https here.
$host = parse_url('http://' . $_SERVER['HTTP_HOST'], PHP_URL_HOST);
if (!empty($host)) {
foreach ($server as $type) {
if (in_array($host, $type['allowed_hosts'])) {
return $type;
}
}
}
return $server['prod'];
}
function getAppName() {
return $this->APPNAME;
}
function getPostMaxSize() {
return $this->POST_MAX_SIZE;
}
function getDefaultRowHeight() {
return $this->DEFAULT_ROW_HEIGHT;
}
function getDBReadOnly() {
return $this->DB_READ_ONLY;
}
function sendXMLHeader() {
header("Content-type: text/xml");
}
function getOurDownloadServerUrl() {
return $this->OUR_DOWNLOAD_URL;
}
function getDownloadBasePath() {
return $this->DOWNLOAD_BASE_PATH;
}
function getPubDownloadServerUrl() {
return $this->PUB_DOWNLOAD_URL;
}
function getWWWPrefix() {
return $this->WWW_PREFIX;
}
/**
* @return: a string
*
* return https if $_SERVER['HTTPS'] exist otherwise this function returns http
*/
function getHTTPPrefix() {
$protocol = $this->HTTP_PREFIX;
if(isset($_SERVER['HTTPS'])) {
if($_SERVER['HTTPS']){
$protocol = "https";
}
}
$this->HTTP_PREFIX = $protocol;
return $this->HTTP_PREFIX ;
}
function getUserLanguage() {
/* @return: String
*
* Check the browser's default language and return
*
* 2006-06-28: droy
*
*/
$validLanguages = array('en', 'de', 'fr');
$defaultLanguage = "en";
# get the default browser language (first one reported)
$language = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
if(array_search($language, $validLanguages)) {
return $language;
}
else {
return $defaultLanguage;
}
}
function getLocalizedContentFilename() {
/* @return: String
*
* return the content/xx_filename.php filename, according to availability of the file
*
* 2006-06-28: droy
*
*/
$language = $this->getUserLanguage();
$filename = "content/" . $language . "_" . $this->getScriptName();
if(!file_exists($filename)) {
$filename = "content/en_" . $this->getScriptName();
}
return $filename;
}
function getScriptName() {
# returns only the filename portion of a script
return substr($_SERVER['SCRIPT_NAME'], strrpos($_SERVER['SCRIPT_NAME'], "/") + 1);
}
function getProjectCommon() {
/** @return: String
*
* Walk up the directory structure to find the closest _projectCommon.php file
*
* 2005-12-06: droy
* - created basic code to walk up all the way to the DocumentRoot
*
*/
$currentScript = $_SERVER['SCRIPT_FILENAME'];
$strLen = strlen($currentScript);
$found = false;
$antiLooper = 0;
# default to /home/_projectCommon.php
$rValue = $_SERVER['DOCUMENT_ROOT'] . "/home/_projectCommon.php";
while($strLen > 1 && ! $found) {
$currentScript = substr($_SERVER['SCRIPT_FILENAME'], 0, strrpos($currentScript, "/"));
$testPath = $currentScript . "/_projectCommon.php";
if(file_exists($testPath)) {
$found = true;
$rValue = $testPath;
}
$strLen = strlen($currentScript);
# break free from endless loops
$antiLooper++;
if($antiLooper > 20) {
$found = true;
}
}
return $rValue;
}
/**
* Getting the IP address of the user
* @param string
* */
function getRemoteIPAddress() {
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
return $_SERVER['HTTP_CLIENT_IP'];
} else if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
return $_SERVER['HTTP_X_FORWARDED_FOR'];
}
return $_SERVER['REMOTE_ADDR'];
}
/**
* Getting the subnet the user is in right now.
* @param string
* */
function getSubnet(){
$ip_address = $this->getRemoteIPAddress();
$subnet = preg_replace('~(\d+)\.(\d+)\.(\d+)\.(\d+)~', "$1.$2.$3", $ip_address);
return $subnet;
}
/**
* This function look for the word staging in the URL
* @return boolean
* */
function is_staging() {
if(strpos($_SERVER['HTTP_HOST'], 'staging')){
return TRUE;
}
return FALSE;
}
/**
* Sets the headers to prevent caching for the different browsers.
*
* *** Deprecated function ***
* Please use preventCaching() instead.
*/
function runStdWebAppCacheable() {
$this->preventCaching();
}
/**
* Sets the headers to prevent caching for the different browsers.
*/
function preventCaching() {
session_start();
header("Cache-Control: no-store, no-cache, private, must-revalidate, max-age=0, max-stale=0");
header("Cache-Control: post-check=0, pre-check=0", FALSE);
header("Pragma: no-cache");
header("Expires: 0");
}
function getAlphaCode($_NumChars)
{
# Accept: int - number of chars
# return: string - random alphanumeric code
# Generate alpha code
$addstring = "";
for ($i = 1; $i <= $_NumChars; $i++) {
if(rand(0,1) == 1) {
# generate character
$addstring = $addstring . chr(rand(0,5) + 97);
}
else {
$addstring = $addstring . rand(0,9);
}
}
return $addstring;
}
function getCURDATE() {
return date("Y-m-d");
}
function addOrIfNotNull($_String) {
# Accept: String - String to be AND'ed
# return: string - AND'ed String
if($_String != "") {
$_String = $_String . " OR ";
}
return $_String;
}
function addAndIfNotNull($_String) {
# Accept: String - String to be AND'ed
# return: string - AND'ed String
if($_String != "") {
$_String = $_String . " AND ";
}
return $_String;
}
function getNumCode($_NumChars)
{
# Accept: int - number of chars
# return: int - random numeric code
# Generate code
$addstring = "";
for ($i = 1; $i <= $_NumChars; $i++) {
if($i > 1) {
# generate first digit
$addstring = $addstring . rand(1,9);
}
else {
$addstring = $addstring . rand(0,9);
}
}
return $addstring;
}
function str_replace_count($find, $replace,$subject, $count) {
# Replaces $find with $replace in $subnect $count times only
$nC = 0;
$subjectnew = $subject;
$pos = strpos($subject, $find);
if ($pos !== FALSE) {
while ($pos !== FALSE) {
$nC++;
$temp = substr($subjectnew, $pos+strlen($find));
$subjectnew = substr($subjectnew, 0, $pos) . $replace . $temp;
if ($nC >= $count) {
break;
}
$pos = strpos($subjectnew, $find);
}
}
return $subjectnew;
}
function returnQuotedString($_String)
{
# Accept: String - String to be quoted
# return: string - Quoted String
// replace " with '
# $_String = str_replace('"', "'", $_String);
# https://bugs.eclipse.org/bugs/show_bug.cgi?id=299682#c1
$_String = addslashes($_String);
return "\"" . $_String . "\"";
}
function returnHTMLSafeString($_String)
{
# Accept: String - String to be HTMLSafified
# return: string
// replace " with '
$_String = str_replace('<', "&lt;", $_String);
$_String = str_replace('<', "&gt;", $_String);
$_String = str_replace("\n", "<br />", $_String);
return $_String;
}
function returnJSSAfeString($_String)
{
# Accept: String - String to be quoted
# return: string - Quoted String
// replace " with '
$_String = str_replace("'", "\\'", $_String);
return $_String;
}
function replaceEnterWithBR($_String) {
return str_replace("\n", "<br />", $_String);
}
function generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html, $Breadcrumb = NULL) {
# Strip html tags from the page title.
$pageTitle = strip_tags($pageTitle);
# Breadcrumbs for the new solstice theme.
if ($Breadcrumb == NULL || !is_object($Breadcrumb)) {
require_once('breadcrumbs.class.php');
$Breadcrumb = new Breadcrumb();
}
if ($theme != "solstice" && $theme != "Nova" && $theme != "polarsys" ) {
$theme = "solstice";
}
if($pageTitle == "") {
$pageTitle = "eclipse.org page";
}
# page-specific RSS feed
if($this->PageRSS != "") {
if ($this->PageRSSTitle != "") {
$this->PageRSSTitle = "Eclipse RSS Feed";
}
$this->ExtraHtmlHeaders .= '<link rel="alternate" title="' . $this->PageRSSTitle . '" href="' . $this->PageRSS . '" type="application/rss+xml"/>';
}
$extraHtmlHeaders = $this->ExtraHtmlHeaders;
include($this->getHeaderPath($theme));
if ($Menu != NULL)
include($this->getMenuPath($theme));
if ($Nav != NULL)
include($this->getNavPath($theme));
echo $html;
$gaCode = $this->projectGoogleAnalyticsCode;
if (!is_null($gaCode)) {
$gaCode = ($gaCode == "") ? 'UA-910670-2' : $gaCode;
#first lets insert the sitewide Analytics
$this->googleJavaScript = <<<EOHTML
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', '$gaCode']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
EOHTML;
}
if ($theme != "solstice") {
echo $this->googleJavaScript;
}
$google_javascript = $this->googleJavaScript;
include($this->getFooterPath($theme));
}
function AddExtraHtmlHeader( $string ) {
$this->ExtraHtmlHeaders .= $string;
}
function AddExtraJSFooter( $string ) {
$this->ExtraJSFooter.= $string;
}
function getThemeURL($_theme) {
if ($_theme != "solstice" || $_theme != "Nova" || $_theme != "polarsys" ) {
$theme = "solstice";
}
return "/eclipse.org-common/themes/" . $_theme;
}
function getHTTPParameter($_param_name, $_method="") {
/** @author droy
* @since version - Oct 19, 2006
* @param String _param_name name of the HTTP GET/POST parameter
* @param String _method GET or POST, or the empty string for POST,GET order
* @return String HTTP GET/POST parameter value, or the empty string
*
* Fetch the HTTP parameter
*
*/
$rValue = "";
$_method = strtoupper($_method);
# Always fetch the GET VALUE, override with POST unless a GET was specifically requested
if(isset($_GET[$_param_name])) {
$rValue = $_GET[$_param_name];
}
if(isset($_FILES[$_param_name]) && $_method == "FILES") {
$rValue = $_FILES[$_param_name];
}
if((isset($_POST[$_param_name])) && ($_method != "GET" || $_method != "FILES")) {
$rValue = $_POST[$_param_name];
}
return $rValue;
}
function getClientOS() {
$UserAgent = $_SERVER['HTTP_USER_AGENT'];
$regex_windows = '/([^dar]win[dows]*)[\s]?([0-9a-z]*)[\w\s]?([a-z0-9.]*)/i';
$regex_mac = '/(68[k0]{1,3})|(mac os x)|(darwin)/i';
$regex_os2 = '/os\/2|ibm-webexplorer/i';
$regex_sunos = '/(sun|i86)[os\s]*([0-9]*)/i';
$regex_irix = '/(irix)[\s]*([0-9]*)/i';
$regex_hpux = '/(hp-ux)[\s]*([0-9]*)/i';
$regex_aix = '/aix([0-9]*)/i';
$regex_dec = '/dec|osfl|alphaserver|ultrix|alphastation/i';
$regex_vms = '/vax|openvms/i';
$regex_sco = '/sco|unix_sv/i';
$regex_linux = '/x11|inux/i';
$regex_bsd = '/(free)?(bsd)/i';
$regex_amiga = '/amiga[os]?/i';
$regex_ppc = '/ppc/i';
$regex_x86_64 = "/x86_64/i";
// look for Windows Box
if(preg_match_all($regex_windows,$UserAgent,$match)) {
$v = $match[2][count($match[0])-1];
$v2 = $match[3][count($match[0])-1];
// Establish NT 6.0 as Vista
if(stristr($v,'NT') && $v2 == 6.0) $v = 'win32';
// Establish NT 5.1 as Windows XP
elseif(stristr($v,'NT') && $v2 == 5.1) $v = 'win32';
// Establish NT 5.0 and Windows 2000 as win2k
elseif($v == '2000') $v = '2k';
elseif(stristr($v,'NT') && $v2 == 5.0) $v = 'win32';
// Establish 9x 4.90 as Windows 98
elseif(stristr($v,'9x') && $v2 == 4.9) $v = 'win32';
// See if we're running windows 3.1
elseif($v.$v2 == '16bit') $v = 'win16';
// otherwise display as is (31,95,98,NT,ME,XP)
else $v .= $v2;
// update browser info container array
if(empty($v)) $v = 'win32';
return (strtolower($v));
}
// look for amiga OS
elseif(preg_match($regex_amiga,$UserAgent,$match)) {
if(stristr($UserAgent,'morphos')) {
// checking for MorphOS
return ('morphos');
}
}
elseif(stristr($UserAgent,'mc680x0')) {
// checking for MC680x0
return ('mc680x0');
}
elseif(preg_match('/(AmigaOS [\.1-9]?)/i',$UserAgent,$match)) {
// checking for AmigaOS version string
return ($match[1]);
}
// look for OS2
elseif( preg_match($regex_os2,$UserAgent)) {
return ('os2');
}
// look for mac
// sets: platform = mac ; os = 68k or ppc
elseif( preg_match($regex_mac,$UserAgent,$match) )
{
$os = !empty($match[1]) ? 'mac68k' : '';
$os = !empty($match[2]) ? 'macosx' : $os;
$os = !empty($match[3]) ? 'macppc' : $os;
$os = !empty($match[4]) ? 'macosx' : $os;
return ('macosx');
}
// look for *nix boxes
// sunos sets: platform = *nix ; os = sun|sun4|sun5|suni86
elseif(preg_match($regex_sunos,$UserAgent,$match))
{
if(!stristr('sun',$match[1])) $match[1] = 'sun'.$match[1];
return ('solaris');
}
// irix sets: platform = *nix ; os = irix|irix5|irix6|...
elseif(preg_match($regex_irix,$UserAgent,$match))
{
return ($match[1].$match[2]);
}
// hp-ux sets: platform = *nix ; os = hpux9|hpux10|...
elseif(preg_match($regex_hpux,$UserAgent,$match))
{
$match[1] = str_replace('-','',$match[1]);
$match[2] = (int) $match[2];
return ('hpux');
}
// aix sets: platform = *nix ; os = aix|aix1|aix2|aix3|...
elseif(preg_match($regex_aix,$UserAgent,$match))
{
return ('aix');
}
// dec sets: platform = *nix ; os = dec
elseif(preg_match($regex_dec,$UserAgent,$match))
{
return ('dec');
}
// vms sets: platform = *nix ; os = vms
elseif(preg_match($regex_vms,$UserAgent,$match))
{
return ('vms');
}
// dec sets: platform = *nix ; os = dec
elseif(preg_match($regex_dec,$UserAgent,$match))
{
return ('dec');
}
// vms sets: platform = *nix ; os = vms
elseif(preg_match($regex_vms,$UserAgent,$match))
{
return ('vms');
}
// sco sets: platform = *nix ; os = sco
elseif(preg_match($regex_sco,$UserAgent,$match))
{
return ('sco');
}
// unixware sets: platform = *nix ; os = unixware
elseif(stristr($UserAgent,'unix_system_v'))
{
return ('unixware');
}
// mpras sets: platform = *nix ; os = mpras
elseif(stristr($UserAgent,'ncr'))
{
return ('mpras');
}
// reliant sets: platform = *nix ; os = reliant
elseif(stristr($UserAgent,'reliantunix'))
{
return ('reliant');
}
// sinix sets: platform = *nix ; os = sinix
elseif(stristr($UserAgent,'sinix'))
{
return ('sinix');
}
// bsd sets: platform = *nix ; os = bsd|freebsd
elseif(preg_match($regex_bsd,$UserAgent,$match))
{
return ($match[1].$match[2]);
}
// last one to look for
// linux sets: platform = *nix ; os = linux
elseif(preg_match($regex_linux,$UserAgent,$match))
{
if(preg_match($regex_x86_64,$UserAgent,$match)) {
return "linux-x64";
}
elseif(preg_match($regex_ppc,$UserAgent,$match)) {
return "linux-ppc";
}
else {
return ('linux');
}
}
}
function isValidTheme($_theme) {
/* @return: bool
*
* returns true if supplied theme is in the array of valid themes
*
* 2005-12-07: droy
*
*/
return array_search($_theme, $this->THEME_LIST);
}
function getUserPreferedTheme() {
/* @return: String
*
* returns theme name in a browser cookie, or the Empty String
*
* 2005-12-07: droy
*
*/
if(isset($_COOKIE["theme"])) {
$theme = $_COOKIE["theme"];
if($this->isValidTheme($theme)) {
return $theme;
}
else {
return "";
}
}
}
/**
* @param layout string Button layout (standard, condensed)
* @param showfaces bool
* @author droy
* @since 2011-05-18
* @return: HTML string for facebook like
* Generate HTML string for facebook like button
*/
function getFacebookLikeButtonHTML($_layout="standard", $_showfaces=false) {
$width = 450;
$height = 22;
if($_layout == "condensed") {
$width = 90;
$_layout = "button_count";
}
else {
$_layout = "standard";
}
if($_showfaces) {
$height = 82;
}
$str = "<iframe src='//www.facebook.com/plugins/like.php?href=" . $this->getCurrentURL() . "&layout=" . $_layout . "&" . ($_showfaces ? "show_faces=true" : "") . "&width=$width&action=like' style='border: medium none; overflow: hidden; width: " . $width . "px; height: " . $height . "px;' frameborder='0' scrolling='no'></iframe>";
return $str;
}
/**
* @author droy
* @since 2011-05-18
* @return URL of the current PHP page
* Construct and return URL of the current script
*/
function getCurrentURL() {
return "http" . ((empty($_SERVER['HTTPS']) && $_SERVER['SERVER_PORT']!=443) ? "" : "s") . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
}
function usePolls() {
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/polls/poll.php");
}
function useJSON() {
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/json/JSON.php");
}
/**
* Returns a new REST client
* @return RestClient
* @since 2015-06-24
* @author droy
*/
function RESTClient() {
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/rest/restclient.class.php");
return new RestClient();
}
function useProjectInfo() {
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/projects/projectInfoList.class.php");
}
/*
* This function applies standard formatting to a date.
*
* The first parameter is either a string or a number representing a date.
* If it's a string, it must be in a format that is parseable by the
* strtotime() function. If it is a number, it must be an integer representing
* a UNIX timestamp (number of seconds since January 1 1970 00:00:00 GMT)
* which, conveniently, is the output of the strtotime() function.
*
* The second (optional) parameter is the format for the result. This must
* one of 'short', or 'long'.
*/
function getFormattedDate($date, $format = 'long') {
if (is_string($date)) $date = strtotime($date);
switch ($format) {
case 'long' : return date("F j, Y", $date);
case 'short' : return date("d M y", $date);
}
}
/*
* This function applies standard formatting to a date range.
*
* See the comments for getFormattedDate($date, $format) for information
* concerning what's expected in the parameters of this method).
*/
function getFormattedDateRange($start_date, $end_date, $format) {
if (is_string($start_date)) $start_date = strtotime($start_date);
if (is_string($end_date)) $end_date = strtotime($end_date);
switch ($format) {
case 'long' :
if ($this->same_year($start_date, $end_date)) {
if ($this->same_month($start_date, $end_date)) {
return date("F", $start_date)
. date(" d", $start_date)
. date("-d, Y", $end_date);
} else {
return date("F d", $start_date)
. date("-F d, Y", $end_date);
}
} else {
return date("F d, Y", $start_date)
. date("-F d, Y", $end_date);
}
case 'short' :
if ($this->same_year($start_date, $end_date)) {
if ($this->same_month($start_date, $end_date)) {
return date("d", $start_date)
. date ("-d", $end_date)
. date(" M", $start_date)
. date(" y", $end_date);
} else {
return date("d M", $start_date)
. date("-d M y", $end_date);
}
} else {
return date("d M y", $start_date)
. date("-d M y", $end_date);
}
}
}
/*
* This method answers true if the two provided values represent
* dates that occur in the same year.
*/
function same_year($a, $b) {
return date("Y", $a) == date("Y", $b);
}
/*
* This method answers true if the two provided values represent
* dates that occur in the same month.
*/
function same_month($a, $b) {
return date("F", $a) == date("F", $b);
}
/**
* Returns a string representing the size of a file in the downloads area
* @author droy
* @since Jun 7, 2007
* @param string file File name relative to http://download.eclipse.org (the &file= parameter used)
* @return string Returns a string in the format of XX MB
*/
function getDownloadFileSizeString($_file) {
$fileSize = "N/A";
$filesizebytes = filesize($this->getDownloadBasePath() . $_file);
if($filesizebytes > 0) {
$fileSize = floor($filesizebytes / 1048576) . " MB";
}
return $fileSize;
}
/**
* useSession(String) - use auth sessions
* @author droy
* @since Jun 7, 2007
* @param string 'optional' or 'required'
* @return Session object
*/
function useSession($required="") {
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/session.class.php");
$ssn = new Session(); # constructor calls validate
if ($ssn->getGID() == "" && $required == "required") {
$ssn->redirectToLogin();
}
return $ssn;
}
function isValidCaller($_pathArray) {
$a = debug_backtrace();
$caller = $a[1]['file']; # Caller 0 is the class that called App();
$validCaller = false;
for($i = 0; $i < count($_pathArray); $i++) {
# TODO: use regexp's to match the leftmost portion for better security
if(strstr($caller, $_pathArray[$i])) {
$validCaller = true;
break;
}
}
return $validCaller;
}
function sqlSanitize($_value, $_dbh=NULL) {
/**
* Sanitize incoming value to prevent SQL injections
* @param string value to sanitize
* @param dbh database resource to use
* @return string santized string
*/
if ($_dbh==NULL) {
$_dbh = $this->database( "eclipse", "" );
}
$_value = mysql_real_escape_string($_value, $_dbh);
return $_value;
}
function getOGTitle(){
return '<meta property="og:title" content="' . $this->OGTitle . '" />' . PHP_EOL;
}
function setOGTitle($title){
$this->OGTitle = $title;
}
function getOGDescription(){
return '<meta property="og:description" content="' . $this->OGDescription . '" />' . PHP_EOL;
}
function setOGDescription($description){
$this->OGDescription = $description;
}
function getOGImage(){
return '<meta property="og:image" content="' . $this->OGImage . '" />' . PHP_EOL;
}
function setOGImage($image){
$this->OGImage = $image;
}
function setDoctype($doctype) {
$accepted = array('html5', 'xhtml');
if (in_array($doctype, $accepted)) {
$this->doctype = $doctype;
}
return;
}
function getDoctype() {
$doc = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">';
switch ($this->doctype) {
case 'html5':
$doc = '<!DOCTYPE html>
<html>';
break;
}
return $doc;
}
/**
* Get theme Variables
*
* Fetch solstice custom variables
*
* @return array
*/
public function getThemeVariables() {
$v = $this->theme_variables;
// Set default variables for all themes.
if (empty($v)) {
$v['body_classes'] = '';
$v['breadcrumbs_html'] = "";
$v['hide_breadcrumbs'] = FALSE;
$v['leftnav_html'] = '';
$v['main_container_classes'] = 'container';
$v['main_container_html'] = '';
$v['header_nav'] = array();
$v['btn_cfa'] = array();
$this->theme_variables = $v;
}
return $this->theme_variables;
}
/**
* Set theme Variables
*
* This function allow pages to pass extra
* parameters to the solstice theme.
*/
public function setThemeVariables($variables) {
$current_variables = $this->getThemeVariables();
if (is_array($variables)) {
$this->theme_variables = array_merge($current_variables, $variables);
}
}
/**
* Function to validate a date
* @param string $date
* @return boolean
*/
private function validateDateFormat($date) {
if (preg_match ("/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/", $date, $d)) {
//date validation
if (checkdate($d[2],$d[3],$d[1])) {
return TRUE;
}
}
return FALSE;
}
/**
* Function to set the OutDated flag
* @param string $when.
* Accepted formats 'YYYY-MM-DD' or 'now'.
*
* @return boolean
*/
function setOutDated($when = 'now', $msg = "") {
if (is_string($msg)) {
$this->OutDatedMsg = $msg;
}
if (strtolower($when) == 'now' || ($this->validateDateFormat($when) && time() >= strtotime($when))) {
$this->OutDated = TRUE;
return TRUE;
}
return FALSE;
}
/**
* Return value of the private property OutDatedMsg.
*/
function getOutDatedMessage() {
if (empty($this->OutDatedMsg)) {
$this->OutDatedMsg = "This page is deprecated and may contain some information that is no longer relevant or accurate.";
}
return $this->OutDatedMsg;
}
/**
* Return value of the private property OutDated.
*/
function getOutDated() {
return $this->OutDated;
}
/**
* Function to set the version of jQuery
* @param string $version
*
* @return boolean
*/
function setjQueryVersion($version = FALSE){
//Only set jQueryVersion if we have a copy on eclipse.org
$supported = array('1.4.4', '1.5.1', '1.5.2', '1.7.2', '1.9.1', '2.0.0');
if(in_array($version, $supported)){
$this->jQueryVersion = $version;
return TRUE;
}
return FALSE;
}
/**
* Return markup needed to load jQuery
* @return string|boolean
*/
function getjQuery(){
if($this->jQueryVersion){
$strn = <<<EOHTML
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/$this->jQueryVersion/jquery.min.js"></script>
<script type="text/javascript">
/* <![CDATA[ */
window.jQuery || document.write('<script src="/eclipse.org-common/lib/jquery/jquery-$this->jQueryVersion.min.js"><\/script>')
/* ]]> */
</script>
EOHTML;
return $strn;
}
return FALSE;
}
/**
* Return The Eclipse Foundation Twitter and Facebook badge
* @return string
*/
function getSocialBadge(){
$protocol = $this->getHTTPPrefix();
$strn = <<<EOHTML
<script type="text/javascript">
/* <![CDATA[ */
document.write('<div id=\"badge_facebook\"><iframe src=\"$protocol:\/\/www.facebook.com\/plugins\/like.php?href=http:\/\/www.facebook.com\/pages\/Eclipse\/259655700571&amp;layout=button_count&amp;show_faces=false&amp;width=90&amp;action=like\" frameborder=\"0\" scrolling=\"no\"><\/iframe><\/div><div id=\"badge_twitter\"><a href=\"https:\/\/twitter.com\/EclipseFdn\" class=\"twitter-follow-button\" data-show-count=\"false\">Follow @EclipseFdn<\/a><script type=\"text\/javascript\">!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=\"\/\/platform.twitter.com\/widgets.js\";fjs.parentNode.insertBefore(js,fjs);}}(document,\"script\",\"twitter-wjs\");<\/script><\/div>');
/* ]]> */
</script>
EOHTML;
return $strn;
}
function getTwitterFollowWidget($_twitterhandle)
{
$output = '';
$output = '<a href="https://twitter.com/'. $_twitterhandle .'" class="twitter-follow-button" data-show-count="false">Follow @' .$_twitterhandle . '</a>';
// Only include the script once per page
if ($this->twitterScriptInserted == FALSE) {
$this->twitterScriptInserted = TRUE;
$output .= "<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>";
}
return $output;
}
function getGoogleSearchHTML() {
$strn = <<<EOHTML
<form action="//www.google.com/cse" id="searchbox_017941334893793413703:sqfrdtd112s">
<input type="hidden" name="cx" value="017941334893793413703:sqfrdtd112s" />
<input type="text" name="q" size="25" />
<input type="submit" name="sa" value="Search" />
</form>
<script type="text/javascript" src="//www.google.com/coop/cse/brand?form=searchbox_017941334893793413703%3Asqfrdtd112s&lang=en"></script>
EOHTML;
return $strn;
}
/**
* Set Google Analytics Tracking code
*
* @param string OR Null $gaUniqueID
*
* Setting $gaUniqueID to NULL will remove Google Analytics
* from the page.
*/
function setGoogleAnalyticsTrackingCode($gaUniqueID) {
$this->projectGoogleAnalyticsCode = $gaUniqueID;
}
function setPromotionPath($_path) {
$this->CustomPromotionPath = $_SERVER['DOCUMENT_ROOT'] . $_path;
}
/**
* Use reCAPTCHA service
*
* @param bool $ssl
*
* @return Captcha
*/
public function useCaptcha($ssl = true) {
include_once($_SERVER['DOCUMENT_ROOT'] . '/eclipse.org-common/classes/captcha/captcha.class.php');
return new Captcha($ssl);
}
# Record a database record
public function setDatabase( $key, $host, $user, $pwd, $db ) {
$rec = array() ;
$rec['HOST'] = $host;
$rec['USERNAME'] = $user;
$rec['PASSWORD'] = $pwd;
$rec['DATABASE'] = $db;
$rec['CONNECTION'] = null;
$this->databases[$key] = $rec;
}
# Setup the handling of database connections. On production systems, reference the database connection
# classes, but on development systems, use the standardized local database distribution.
private function configureDatabases() {
#-----------------------------------------------------------------------------------------------------
# Dev Mode Databases
$this->setDatabase( "myfoundation", "localhost", "dashboard", "draobhsad", "myfoundation_demo" );
$this->setDatabase( "foundation", "localhost", "dashboard", "draobhsad", "myfoundation_demo" );
$this->setDatabase( "eclipse", "localhost", "dashboard", "draobhsad", "myfoundation_demo" );
$this->setDatabase( "bugzilla", "localhost", "dashboard", "draobhsad", "myfoundation_demo" );
$this->setDatabase( "downloads", "localhost", "dashboard", "draobhsad", "myfoundation_demo" );
$this->setDatabase( "polls", "localhost", "dashboard", "draobhsad", "myfoundation_demo" );
$this->setDatabase( "projectinfo", "localhost", "dashboard", "draobhsad", "myfoundation_demo" );
$this->setDatabase( "packaging", "localhost", "dashboard", "draobhsad", "packaging_demo" );
$this->setDatabase( "infra", "localhost", "dashboard", "draobhsad", "infra_demo" );
$this->setDatabase( "ipzilla", "localhost", "dashboard", "draobhsad", "ipzilla_demo" );
$this->setDatabase( "ipzillatest", "localhost", "dashboard", "draobhsad", "ipzilla_demo" );
$this->setDatabase( "live", "localhost", "dashboard", "draobhsad", "live_demo" );
$this->setDatabase( "epic", "localhost", "dashboard", "draobhsad", "epic_demo" );
$this->setDatabase( "conferences", "localhost", "dashboard", "draobhsad", "conferences_demo" );
$this->setDatabase( "marketplace", "localhost", "dashboard", "draobhsad", "marketplace_demo" );
#-----------------------------------------------------------------------------------------------------
#-----------------------------------------------------------------------------------------------------
# Production Databases
$this->set("bugzilla_db_classfile_ro", 'dbconnection_bugs_ro.class.php');
$this->set("bugzilla_db_class_ro", 'DBConnectionBugs');
$this->set("bugzilla_db_classfile", 'dbconnection_bugs_rw.class.php');
$this->set("bugzilla_db_class", 'DBConnectionBugsRW');
$this->set("dashboard_db_classfile", 'dbconnection_dashboard_rw.class.php');
$this->set("dashboard_db_class", 'DBConnectionDashboard');
$this->set("downloads_db_classfile_ro", 'dbconnection_downloads_ro.class.php');
$this->set("downloads_db_class_ro", 'DBConnectionDownloads');
$this->set("epic_db_classfile_ro", 'dbconnection_epic_ro.class.php');
$this->set("epic_db_class_ro", 'DBConnectionEPIC');
$this->set("packaging_db_classfile_ro", 'dbconnection_packaging_ro.class.php');
$this->set("packaging_db_class_ro", 'DBConnectionPackaging');
$this->set("foundation_db_classfile", 'dbconnection_workaround.class.php');
$this->set("foundation_db_class", 'FoundationDBConnectionRW');
$this->set("foundation_db_classfile_ro",'dbconnection_foundation_ro.class.php');
$this->set("foundation_db_class_ro", 'DBConnectionFoundation');
$this->set("gerrit_db_classfile_ro", 'dbconnection_gerrit_ro.class.php');
$this->set("gerrit_db_class_ro", 'DBConnectionGerrit');
$this->set("infra_db_classfile", 'dbconnection_infra_ro.class.php');
$this->set("infra_db_class", 'DBConnectionInfraRO');
$this->set("ipzilla_db_classfile_ro", 'dbconnection_ipzilla_ro.class.php');
$this->set("ipzilla_db_class_ro", 'DBConnectionIPZillaRO');
$this->set("ipzilla_db_classfile", 'dbconnection_ipzilla_rw.class.php');
$this->set("ipzilla_db_class", 'DBConnectionIPZillaRW');
$this->set("ipzillatest_db_classfile", 'dbconnection_ipzillatest_rw.class.php');
$this->set("ipzillatest_db_class", 'DBConnectionIPZillaRW');
$this->set("live_db_classfile", 'dbconnection_live_rw.class.php');
$this->set("live_db_class", 'DBConnectionLIVE');
$this->set("polls_db_classfile", 'dbconnection_polls_rw.class.php');
$this->set("polls_db_class", 'DBConnectionPollsRW');
$this->set("myfoundation_db_classfile", 'dbconnection_portal_rw.class.php');
$this->set("myfoundation_db_class", 'DBConnectionPortalRW');
$this->set("projectinfo_db_classfile_ro",'dbconnection_projectinfo_ro.class.php');
$this->set("projectinfo_db_class_ro", 'DBConnectionProjectInfo');
$this->set("eclipse_db_classfile", 'dbconnection_rw.class.php');
$this->set("eclipse_db_class", 'DBConnectionRW');
$this->set("eclipse_db_classfile_ro", 'dbconnection.class.php');
$this->set("eclipse_db_class_ro", 'DBConnection');
$this->set("conferences_db_classfile", 'dbconnection.conferences_rw.class.php');
$this->set("conferences_db_class", 'DBConnectionConferencesRW');
$this->set("marketplace_db_classfile_ro", 'dbconnection_marketplace_ro.class.php');
$this->set("marketplace_db_class_ro", 'DBConnectionMarket');
#-----------------------------------------------------------------------------------------------------
}
# Open a database and store the record
public function database( $key, $query ) {
$rec = $this->databases[$key];
$dbh = null;
if($this->devmode) { # For DEV machines
$dbh = $rec['CONNECTION'];
if( $dbh == null ) {
$dbh = mysql_connect( $rec['HOST'], $rec['USERNAME'], $rec['PASSWORD']);
mysql_select_db($rec['DATABASE'], $dbh);
}
if(get_magic_quotes_gpc())
{
trigger_error("magic_quotes_gpc is currently set to ON in your php.ini. This is highly DISCOURAGED. Please change your setting or comment out this line.");
}
} else { # For PRODUCTION machines
$class = null;
if( (strtoupper(substr(trim($query), 0, 6)) == 'SELECT' && strtoupper(substr(trim($query), 0, 23)) != "SELECT /* USE MASTER */")
|| $query == "") { // Try to use read-only when possible. Blank queries occur when we call sqlSanitize.
$classfile = $this->get($key . '_db_classfile_ro');
$class = $this->get($key . '_db_class_ro');
}
if($class == null) {
$classfile = $this->get($key . '_db_classfile');
$class = $this->get($key . '_db_class');
}
require_once($this->DB_CLASS_PATH . $classfile);
$dbc = new $class();
$dbh = $dbc->connect();
}
$this->databases[$key]['CONNECTION'] = $dbh;
$this->set('DBHANDLEMAP ' . $dbh, $key);
return $dbh;
}
# Return a record for a database by name
public function databaseName( $key ) {
$rec = $this->databases[$key];
return $rec['DATABASE'];
}
# Return the name of a database by database handle
public function databaseNameForHandle($dbh) {
return $this->get('DBHANDLEMAP ' . $dbh);
}
# Storage functions for arbitraray hash
public function get( $key ) {
if(isset($this->hash[$key])) {
return $this->hash[$key];
}
}
# Storage functions for arbitraray hash
public function set( $key, $value ) {
$this->hash[$key] = $value;
}
# Storage functions for arbitraray hash
public function ifEmptyThenSet( $key, $value ) {
if( !isset($this->hash[$key])) {
$this->hash[$key] = $value;
}
}
# Display a backtrace of all the SQL queries run in this session. Only available when devmode == true or logsql == true.
function SQLBacktrace () {
if(($this->devmode && (count($this->query_btrace) > 0)) || $this->logsql){
$row = 1;
echo "<p><table cellpadding=10 width=800 bgcolor=#ffcccc><tr><td>";
echo "<p><font size=\"+2\">Query Trace: </font> In ascending order from oldest to newest";
echo "<div style=\"font-family: courier;\">";
foreach ($this->query_btrace as $query) {
echo "&nbsp;&nbsp;&nbsp;&nbsp;<b>$row.) " .
$query{0} ." (" . $query{2} . ")rows:</b> " . $query{1} . "<br>\n";
$row++;
}
echo "</div>";
echo "</p>\n";
echo "</table></p>\n";
}
}
# Check if a MySQL error occurred and display it. If $this->devmode then an
# SQL backtrace is shown as well.
function mysqlErrorCheck () {
$error = mysql_error();
if ($error) {
echo "<p><table cellpadding=10 width=400 bgcolor=#ffcccc><tr><td><font size=+2>SQL Trouble: </font>";
echo "<font color=red>";
echo htmlspecialchars ($error);
echo "</font>\n";
if($this->devmode || $this->logsql) {
$backtrace = debug_backtrace();
$file = $backtrace[2]['file'];
$line = $backtrace[2]['line'];
$function = $backtrace[2]['function'];
echo "<br/>file: $file<br/>line: $line<br/>function: $function<br/>";
}
echo "</table></p>\n";
if($this->devmode || $this->logsql) {
$this->SQLBacktrace();
}
exit();
}
}
# All in one query function
function sql ($statement, $dbname, $logstring = null) {
$dbh = $this->database( $dbname, $statement );
$result = mysql_query($statement, $dbh);
$rowcount = 0;
# Only keep information in devmode so we don't waste RAM
if($this->devmode || $this->logsql) {
# Report on the number of rows affected by the query
if(($result !== TRUE) && ($result !== FALSE)) {
$rowcount = mysql_num_rows($result);
} else {
$rowcount = mysql_affected_rows($dbh);
}
if($logstring) {
# This is used when inserting binary blobs so that the blob does not appear in the log
$this->query_btrace[] = array($this->databaseNameForHandle($dbh), $logstring, $rowcount);
} else {
$this->query_btrace[] = array($this->databaseNameForHandle($dbh), $statement, $rowcount);
}
}
$this->mysqlErrorCheck();
return $result;
}
# These don't match the naming convention in $App but are used in the portal and submissions systems like this
# so we'll leave them alone for consistency.
function bugzilla_sql ($statement) { return $this->sql ($statement, "bugzilla"); } // Bugzilla
function conference_sql ($statement){ return $this->sql ($statement, "conferences"); } // Conferences
function dashboard_sql ($statement) { return $this->sql ($statement, "dashboard"); } // Dash
function downloads_sql ($statement) { return $this->sql ($statement, "downloads"); } // Downloads
function eclipse_sql ($statement) { return $this->sql ($statement, "eclipse"); } // Whole Eclipse database
function epic_sql ($statement) { return $this->sql ($statement, "epic"); } // EPIC (read-only!)
function foundation_sql($statement) { return $this->sql ($statement, "foundation"); } // Foundation internal database
function gerrit_sql($statement) { return $this->sql ($statement, "gerrit"); } // Gerrit
function ipzilla_sql ($statement) { return $this->sql ($statement, "ipzilla"); } // IPZilla
function infra_sql ($statement) { return $this->sql ($statement, "infra"); } // Infra
function ipzillatest_sql ($statement) { return $this->sql ($statement, "ipzillatest"); } // IPZilla test database
function live_sql ($statement) { return $this->sql ($statement, "live"); } // Eclipse Live (read-only!)
function polls_sql ($statement) { return $this->sql ($statement, "polls"); } // Polls
function portal_sql ($statement) { return $this->sql ($statement, "myfoundation"); } // MyFoundation Portal
function projectinfo_sql ($statement) { return $this->sql ($statement, "projectinfo"); } // ProjectInfo tables only (read-only!)
function packaging_sql ($statement) { return $this->sql ($statement, "packaging"); } // Packaging Database
function marketplace_sql ($statement) { return $this->sql ($statement, "marketplace"); } // Marketplace (read-only)
}