blob: 984ac01f9baa03fa462ccfcffe07a9ff0479d7c7 [file] [log] [blame]
<?php
/*******************************************************************************
* Copyright (c) 2007-2009 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:
* Bjorn Freeman-Benson - Initial API, meta-data inheritance
* Nathan Gervais - Fixed __get function to return correct values for multirow records
* Karl Matthias - Implemented Countable Extension to the class. And Plural __get retrieval
* Added fields() and ProjectInfoID() functions, fixed bug in multi-row sets
* Meta-data inheritance
* Fixed meta-data inheritance not to override name/short name
*******************************************************************************/
require_once(realpath(dirname(__FILE__) . "/../../system/app.class.php"));
class ProjectInfoData implements Countable
{
private $rows; // raw query results for database, ProjectID, MainKey, SubKey, Value, ProjectInfoID
private $mainkeys; // [main key] -> # of rows
private $subkeys; // [main key] -> true if has subkeys, false otherwise
public $original_projectid;
public $effective_projectid;
private $projectname; // Stored separately because even with inheritance we don't inherit this
private $projectshortname; // Same reason as $projectname
private $inherited = false;
function __construct( $projectid )
{
$App = new App();
$this->original_projectid = $projectid;
while(1) { // While loop allows infinite levels of inheritance
$result = $App->eclipse_sql("
SELECT COUNT(1) AS count FROM ProjectInfo, ProjectInfoValues
WHERE ProjectID = '$projectid'
AND ProjectInfo.ProjectInfoID = ProjectInfoValues.ProjectInfoID
AND MainKey = 'inherit'
AND Value = 'true'");
$row = mysql_fetch_object( $result );
if( $row && $row->count > 0 ) {
// Ok, we inherited so store the original name
$result2 = $App->eclipse_sql("
SELECT Value AS projectname FROM ProjectInfo, ProjectInfoValues
WHERE ProjectID = '$projectid'
AND ProjectInfo.ProjectInfoID = ProjectInfoValues.ProjectInfoID
AND MainKey = 'projectname'"
);
$row = mysql_fetch_object($result2);
$this->projectname = $row->projectname;
// Store shortname, too
$result2 = $App->eclipse_sql("
SELECT Value AS projectshortname FROM ProjectInfo, ProjectInfoValues
WHERE ProjectID = '$projectid'
AND ProjectInfo.ProjectInfoID = ProjectInfoValues.ProjectInfoID
AND MainKey = 'projectshortname'"
);
$row = mysql_fetch_object($result2);
$this->projectshortname = $row->projectshortname;
// Set inherited flag
$this->inherited = true;
// Set the new projectid
$words = explode( '.', $projectid );
array_pop( $words);
$projectid = implode( '.', $words );
} else {
break;
}
}
$this->effective_projectid = $projectid;
$result = $App->eclipse_sql("
SELECT * FROM ProjectInfo, ProjectInfoValues
WHERE ProjectID = '$projectid'
AND ProjectInfo.ProjectInfoID = ProjectInfoValues.ProjectInfoID");
$this->rows = array();
$this->mainkeys = array();
$this->subkeys = array();
while($row = mysql_fetch_assoc($result)) {
$this->rows[] = $row;
$mainkey = $row['MainKey'];
if( isset($this->mainkeys[$mainkey]))
$this->mainkeys[$mainkey]++;
else
$this->mainkeys[$mainkey] = 1;
if( !isset($this->subkeys[$mainkey]))
$this->subkeys[$mainkey] = false;
if( $row['SubKey'] != null )
$this->subkeys[$mainkey] = true;
}
}
function __get( $varname ) {
// When inheriting data, don't inherit the project name/short name
if(($varname == 'projectname') && $this->inherited) {
return $this->projectname;
} elseif(($varname == 'projectshortname') && $this->inherited) {
return $this->projectshortname;
} elseif(($varname == 'projectnames') && $this->inherited) {
return array($this->projectname);
} elseif(($varname == 'projectshortnames') && $this->inherited) {
return array($this->projectshortname);
}
$check_multiples = false;
if(preg_match('/s$/', $varname)) // see if we need to look for "newsgroups" instead of just "newsgroup" for example
$check_multiples = true;
foreach( $this->rows as $row ) {
if (preg_match('/projectid/i', $varname)) { return $row['ProjectID'];}
$mainkey = $row['MainKey'];
$exactmatch = ($mainkey == $varname);
$pluralmatch = ($mainkey . 's' == $varname);
if( $exactmatch || ($check_multiples && $pluralmatch) ) {
if( $this->mainkeys[$mainkey] == 1 ) {
if( $this->subkeys[$mainkey] == false ) {
if($check_multiples && !$exactmatch) {
$rtrn = array();
$rtrn[] = $row['Value'];
return $rtrn;
} else {
return $row['Value'];
}
} else {
$subrows = array();
foreach( $this->rows as $rr ) {
if( $row['ProjectInfoID'] == $rr['ProjectInfoID']) {
$subrows[] = $rr;
}
}
if($check_multiples && !$exactmatch) {
$rtrn = array();
$rtrn[] = new ProjectInfoValues( $this, $subrows );
return $rtrn;
} else {
return new ProjectInfoValues( $this, $subrows );
}
}
} else {
if( $this->subkeys[$mainkey] == false ) {
$result = array();
foreach( $this->rows as $rr ) {
if( $rr['MainKey'] == $mainkey) {
$result[] = $rr['Value'];
}
}
return $result;
} else {
$result = array();
$checked = array();
foreach( $this->rows as $rr ) {
if(isset($checked[$rr['ProjectInfoID']])) {
continue;
}
$checked[$rr['ProjectInfoID']] = true;
if( $rr['MainKey'] == $mainkey) {
$subrows = array();
foreach( $this->rows as $rrr ) {
if( $rr['ProjectInfoID'] == $rrr['ProjectInfoID']) {
$subrows[] = $rrr;
}
}
$result[] = new ProjectInfoValues( $this, $subrows );
}
}
return $result;
}
}
}
}
return null;
}
function count() {
return count($this->mainkeys);
}
}
class ProjectInfoValues implements Countable {
private $rows;
function __construct( $projectinfo, $subrows ) {
$this->rows = $subrows;
}
function __get( $varname )
{
foreach( $this->rows as $row ) {
$subkey = $row['SubKey'];
if( $subkey == $varname ) {
return $row['Value'];
}
}
return null;
}
function count() {
return count($this->rows);
}
function fields() {
$fields = array();
foreach($this->rows as $row) {
$fields[] = $row['SubKey'];
}
arsort($fields, SORT_STRING);
return $fields;
}
function ProjectInfoID() {
$row = $this->rows[0];
return $row['ProjectInfoID'];
}
}
?>