This repository has been archived on 2025-05-24. You can view files and clone it, but cannot push or open issues or pull requests.
Files
qemudb/include/bugs.php
Alexander Nicolaysen Sørnes 5cce3b1c5f bug: Correct casing for an SQL column
2009-07-30 18:22:10 +02:00

687 lines
22 KiB
PHP

<?php
require_once(BASE."include/util.php");
require_once(BASE."include/application.php");
/******************************************/
/* bug class and related functions */
/******************************************/
/**
* Bug Link class for handling Bug Links and thumbnails
*/
class Bug
{
var $iLinkId;
// parameters necessary to create a new Bug with Bug::create()
var $iVersionId;
var $iBug_id;
// values retrieved from bugzilla
var $sShort_desc;
var $sBug_status;
var $sResolution;
var $sSubmitTime;
var $iSubmitterId;
var $bQueued;
/**
* Constructor, fetches the data and bug objects if $ilinkId is given.
*/
function bug($iLinkId = null, $oRow = null)
{
if(!$iLinkId && !$oRow)
return;
if(!$oRow)
{
$sQuery = "SELECT * FROM buglinks
WHERE linkId = '?'";
if($hResult = query_parameters($sQuery, $iLinkId))
{
$oRow = query_fetch_object($hResult);
}
}
if($oRow)
{
$this->iLinkId = $oRow->linkId;
$this->iBug_id = $oRow->bug_id;
$this->iVersionId = $oRow->versionId;
$this->bQueued = ($oRow->state=='queued') ? true : false;
$this->sSubmitTime = $oRow->submitTime;
$this->iSubmitterId = $oRow->submitterId;
/* lets fill in some blanks */
if ($this->iBug_id)
{
$sQuery = "SELECT *
FROM bugs
WHERE bug_id = ".$this->iBug_id;
if($hResult = query_bugzilladb($sQuery))
{
$oRow = query_fetch_object($hResult);
if($oRow)
{
$this->sShort_desc = $oRow->short_desc;
$this->sBug_status = $oRow->bug_status;
$this->sResolution = $oRow->resolution;
}
}
}
}
}
/**
* Creates a new Bug.
*/
function create()
{
$oVersion = new Version($this->iVersionId);
// Security, if we are not an administrator or a maintainer,
// the Bug must be queued.
if($this->mustBeQueued())
{
$this->bQueued = true;
} else
{
$this->bQueued = false;
}
/* lets check for a valid bug id */
if(!is_numeric($this->iBug_id))
{
addmsg($this->iBug_id." is not a valid bug number.", "red");
return false;
}
/* check that bug # exists in bugzilla*/
$sQuery = "SELECT *
FROM bugs
WHERE bug_id = ".$this->iBug_id;
if(query_num_rows(query_bugzilladb($sQuery, "checking bugzilla")) == 0)
{
addmsg("There is no bug in Bugzilla with that bug number.", "red");
return false;
}
/* Check for duplicates */
if($this->isDuplicate())
{
addmsg("The Bug link has already been submitted.", "red");
return false;
}
/* passed the checks so lets insert the puppy! */
$hResult = query_parameters("INSERT INTO buglinks (versionId, bug_id, ".
"submitTime, submitterId, state) ".
"VALUES('?', '?', ?, '?', '?')",
$this->iVersionId, $this->iBug_id,
"NOW()",
$_SESSION['current']->iUserId,
$this->bQueued ? 'queued' : 'accepted');
if($hResult)
{
$this->iLinkId = query_appdb_insert_id();
$this->SendNotificationMail();
return true;
} else
{
addmsg("Error while creating a new Bug link.", "red");
return false;
}
}
function purge()
{
return $this->delete();
}
/**
* Deletes the Bug from the database.
* and request its deletion from the filesystem (including the thumbnail).
*
* Return true if successful, false if an error occurs
*/
function delete()
{
$sQuery = "DELETE FROM buglinks
WHERE linkId = '?'";
if(!($hResult = query_parameters($sQuery, $this->iLinkId)))
return false;
return true;
}
/**
* Move Bug out of the queue.
*/
function unQueue()
{
// If we are not in the queue, we can't move the Bug out of the queue.
if(!$this->bQueued)
return false;
if(query_parameters("UPDATE buglinks SET state = '?' WHERE linkId='?'",
'accepted', $this->iLinkId))
{
$this->bQueued = false;
// we send an e-mail to interested people
$this->mailSubmitter();
$this->SendNotificationMail();
// the Bug has been unqueued
addmsg("The Bug has been unqueued.", "green");
}
}
function update()
{
$oBug = new bug($this->iLinkId);
// There is no need to have two links to a bug. The update is still
// considered successful
if($this->isDuplicate())
return $this->delete();
if($this->iVersionId && $this->iVersionId != $oBug->iVersionId)
{
$hResult = query_parameters("UPDATE buglinks SET versionId = '?'
WHERE linkId = '?'",
$this->iVersionId, $this->iLinkId);
if(!$hResult)
return false;
}
return true;
}
/* Checks whether the version already has a link for this bug */
public function isDuplicate()
{
$sQuery = "SELECT COUNT(linkId) as count
FROM buglinks
WHERE versionId = '?'
AND bug_id = '?'";
if($hResult = query_parameters($sQuery, $this->iVersionId, $this->iBug_id))
{
if(($oRow = query_fetch_object($hResult)))
{
return $oRow->count > 0;
}
}
return false;
}
function mailSubmitter($bRejected=false)
{
global $aClean;
if(!isset($aClean['sReplyText']))
$aClean['sReplyText'] = "";
if($this->iSubmitterId)
{
$oSubmitter = new User($this->iSubmitterId);
$sAppName = Version::fullName($this->iVersionId);
if(!$bRejected)
{
$sSubject = "Submitted Bug Link accepted";
$sMsg = "The bug link you submitted between Bug ".$this->iBug_id." and ".
$sAppName." has been accepted.";
} else
{
$sSubject = "Submitted Bug Link rejected";
$sMsg = "The bug link you submitted between Bug ".$this->iBug_id." and ".
$sAppName." has been deleted.";
}
$sMsg .= $aClean['sReplyText']."\n";
$sMsg .= "We appreciate your help in making the Application Database better for all users.";
mail_appdb($oSubmitter->sEmail, $sSubject ,$sMsg);
}
}
function SendNotificationMail($bDeleted=false)
{
$sAppName = version::fullName($this->iVersionId);
$oVersion = new version($this->iVersionId);
//show the application version URL and the bug URL
$sMsg = $oVersion->objectMakeUrl()."\n\n";
$sMsg .= BUGZILLA_ROOT."show_bug.cgi?id=".$this->iBug_id."\n";
if(!$bDeleted)
{
if(!$this->bQueued)
{
$sSubject = "Link between Bug ".$this->iBug_id." and ".$sAppName." added by ".$_SESSION['current']->sRealname;
if($this->iSubmitterId)
{
$oSubmitter = new User($this->iSubmitterId);
$sMsg .= "This Bug Link has been submitted by ".$oSubmitter->sRealname.".\n";
}
addmsg("The Bug Link was successfully added into the database.", "green");
} else // Bug Link queued.
{
$sSubject = "Link between Bug ".$this->iBug_id." and ".$sAppName." submitted by ".$_SESSION['current']->sRealname;
$sMsg .= "This Bug Link has been queued.\n";
addmsg("The Bug Link you submitted will be added to the database after being reviewed.", "green");
}
} else // Bug Link deleted.
{
$sSubject = "Link between Bug ".$this->iBug_id." and ".$sAppName." deleted by ".$_SESSION['current']->sRealname;
addmsg("Bug Link deleted.", "green");
}
$sEmail = User::get_notify_email_address_list(null, $this->iVersionId);
if($sEmail)
{
mail_appdb($sEmail, $sSubject ,$sMsg);
}
}
function objectGetSubmitterId()
{
return $this->iSubmitterId;
}
function objectGetMailOptions($sAction, $bMailSubmitter, $bParentAction)
{
return new mailOptions();
}
function objectGetMail($sAction, $bMailSubmitter, $bParentAction)
{
/* We don't do this at the moment */
return array(null, null, null);
}
public function objectGetParent($sClass = '')
{
return new version($this->iVersionId);
}
public function objectSetParent($iNewId, $sClass = '')
{
$this->iVersionId = $iNewId;
}
function objectGetChildren($bIncludeDeleted = false)
{
return array();
}
/* Get a list of bugs submitted by a given user */
function listSubmittedBy($iUserId, $bQueued = true)
{
$hResult = query_parameters("SELECT appFamily.appName, buglinks.versionId, appVersion.versionName, buglinks.submitTime, buglinks.bug_id, buglinks.linkId FROM buglinks, appFamily, appVersion WHERE appFamily.appId = appVersion.appId AND buglinks.versionId = appVersion.versionId AND buglinks.state = '?' AND buglinks.submitterId = '?' ORDER BY buglinks.versionId", $bQueued ? 'queued' : 'accepted', $iUserId);
if(!$hResult || !query_num_rows($hResult))
return FALSE;
$oTable = new Table();
$oTable->SetWidth("100%");
$oTable->SetAlign("center");
// setup the table header
$oTableRow = new TableRow();
$oTableRow->AddTextCell('Version');
$oTableRow->AddTextCell('Bug #', 'width="50"');
$oTableRow->AddTextCell('Status', 'width="80"');
$oTableRow->AddTextCell('Resolution', 'width="110"');
$oTableRow->AddTextCell('Description', 'Submit time');
$oTableRow->AddTextCell('Submit time');
if($bQueued)
$oTableRow->addTextCell('Action');
$oTableRow->SetClass('color4');
$oTable->AddRow($oTableRow);
for($i = 1; $oRow = query_fetch_object($hResult); $i++)
{
$oTableRow = new TableRow();
$oTableRow->AddTextCell(version::fullNameLink($oRow->versionId));
$oTableRow->AddTextCell('<a href="'.BUGZILLA_ROOT.'show_bug.cgi?id='.$oRow->bug_id.'">'.$oRow->bug_id.'</a>');
$oTableRow->AddTextCell($oBug->sBug_status);
$oTableRow->AddTextCell($oBug->sResolution);
$oTableRow->AddTextCell($oBug->sShort_desc);
$oTableRow->AddTextCell(print_date(mysqldatetime_to_unixtimestamp($oRow->submitTime)));
if($bQueued)
{
$oM = new objectManager('bug');
$oM->setReturnTo(array_key_exists('REQUEST_URI', $_SERVER) ? $_SERVER['REQUEST_URI'] : "");
$shDeleteLink = '<a href="'.$oM->makeUrl('delete', $oRow->linkId, 'Delete entry').'">delete</a>';
$oTableRow->addTextCell(" [ $shDeleteLink ]");
}
$oTableRow->SetClass(($i % 2 ) ? 'color0' : 'color1');
$oTable->AddRow($oTableRow);
}
return $oTable->GetString();
}
function isOpen()
{
return ($this->sBug_status != 'RESOLVED' && $this->sBug_status != 'CLOSED');
}
function allowAnonymousSubmissions()
{
return false;
}
function mustBeQueued()
{
$oVersion = new version($this->iVersionId);
if($_SESSION['current']->hasPriv("admin") ||
$_SESSION['current']->isMaintainer($oVersion->iVersionId) ||
$_SESSION['current']->isSuperMaintainer($oVersion->iAppId))
{
return false;
}
return true;
}
function objectGetId()
{
return $this->iLinkId;
}
function objectGetEntries($sState, $iRows = 0, $iStart = 0, $sOrderBy = '', $bAscending = true)
{
$sLimit = "";
/* Selecting 0 rows makes no sense, so we assume the user
wants to select all of them
after an offset given by iStart */
if(!$iRows)
$iRows = bug::objectGetEntriesCount($sState);
$sQuery = "select * from buglinks where state = '?' LIMIT ?, ?";
$hResult = query_parameters($sQuery, $sState, $iStart, $iRows);
return $hResult;
}
function objectGetEntriesCount($sState)
{
$sQuery = "select count(*) as cnt from buglinks where state = '?'";
$hResult = query_parameters($sQuery, $sState);
$oRow = mysql_fetch_object($hResult);
return $oRow->cnt;
}
function objectGetHeader()
{
$oTableRow = new TableRow();
$oTableRow->AddTextCell("Bug #");
$oTableCell = new TableCell("Status");
$oTableCell->SetAlign("center");
$oTableRow->AddCell($oTableCell);
$oTableRow->AddTextCell("Bug Description");
$oTableCell = new TableCell("Application Name");
$oTableCell->SetAlign("center");
$oTableRow->AddCell($oTableCell);
$oTableCell = new TableCell("Application Description");
$oTableCell->SetAlign("center");
$oTableRow->AddCell($oTableCell);
$oTableCell = new TableCell("Version");
$oTableCell->SetAlign("center");
$oTableRow->AddCell($oTableCell);
return $oTableRow;
}
// returns a table row
function objectGetTableRow()
{
$oTableRow = new TableRow();
$oVersion = new version($this->iVersionId);
$oApp = new application($oVersion->iAppId);
$oTableCell = new TableCell($this->iBug_id);
$oTableCell->SetAlign("center");
$oTableCell->SetCellLink(BUGZILLA_ROOT.'show_bug.cgi?id='.$this->iBug_id);
$oTableRow->AddCell($oTableCell);
$oTableCell = new TableCell($this->sBug_status);
$oTableCell->SetAlign("center");
$oTableRow->AddCell($oTableCell);
$oTableRow->AddTextCell($this->sShort_desc);
$oTableRow->AddTextCell($oApp->objectMakeLink());
$oTableRow->AddTextCell(util_trim_description($oApp->sDescription));
$oTableRow->AddTextCell($oVersion->objectMakeLink());
$oOMTableRow = new OMTableRow($oTableRow);
// enable the deletion link, the objectManager will check
// for appropriate permissions before adding the link
$oOMTableRow->SetHasDeleteLink(true);
return $oOMTableRow;
}
function objectMakeUrl()
{
$oManager = new objectManager("bug", "View Bug");
return $oManager->makeUrl("view", $this->objectGetId());
}
function objectMakeLink()
{
$sLink = "<a href=\"".$this->objectMakeUrl()."\">".
$this->sShort_desc."</a>";
return $sLink;
}
function objectGetState()
{
return ($this->bQueued) ? 'queued' : 'accepted';
}
function canEdit()
{
if($_SESSION['current']->hasPriv("admin"))
{
return true;
} else if($this->iVersionId)
{
if(maintainer::isUserMaintainer($_SESSION['current'],
$this->iVersionId))
{
return true;
}
if($this->iSubmitterId == $_SESSION['current']->iUserId)
return true;
}
return false;
}
function objectGetItemsPerPage($sState = 'accepted')
{
$aItemsPerPage = array(25, 50, 100, 200);
$iDefaultPerPage = 25;
return array($aItemsPerPage, $iDefaultPerPage);
}
function display()
{
$oTable = new Table();
$oTable->SetAlign("center");
$oTable->SetClass("color0");
$oTable->SetCellPadding(2);
$oHeaderRow = $this->objectGetHeader();
$oHeaderRow->SetClass("color4");
$oTable->AddRow($oHeaderRow);
$oDataRow = $this->objectGetTableRow();
$oDataRow->GetTableRow()->SetClass("color0");
$oTable->AddRow($oDataRow);
echo $oTable->GetString();
}
function objectHideReject()
{
return TRUE;
}
// NOTE: we don't have any editing support for this entry at this time
// so output the entry and a field to identify the bug id
function outputEditor()
{
$this->display();
echo '<input type="hidden" name="iBuglinkId" value="'.$this->iBug_id.'">';
echo '<input type="hidden" name="iVersionId" value="'.$this->iVersionId.'">';
}
function getOutputEditorValues($aClean)
{
$this->iBug_id = $aClean['iBuglinkId'];
if($aClean['iVersionId'])
$this->iVersionId = $aClean['iVersionId'];
}
}
/*
* Bug Link functions that are not part of the class
*/
function view_version_bugs($iVersionId = null, $aBuglinkIds)
{
global $aClean;
$bCanEdit = FALSE;
$oVersion = new Version($iVersionId);
// Security, if we are an administrator or a maintainer, we can remove or ok links.
if(($_SESSION['current']->hasPriv("admin") ||
$_SESSION['current']->isMaintainer($oVersion->iVersionId) ||
$_SESSION['current']->isSuperMaintainer($oVersion->iAppId)))
{
$bCanEdit = TRUE;
}
//start format table
if($_SESSION['current']->isLoggedIn())
{
echo "<form method=post action='".APPDB_ROOT."objectManager.php'>\n";
}
echo html_frame_start("Known bugs","98%",'',0);
echo "<table width=\"100%\" border=\"0\" cellpadding=\"3\" cellspacing=\"1\">\n\n";
echo "<tr class=color4>\n";
echo " <td align=center width=\"80\">Bug #</td>\n";
echo " <td>Description</td>\n";
echo " <td align=center width=\"80\">Status</td>\n";
echo " <td align=center width=\"80\">Resolution</td>\n";
echo " <td align=center width=\"80\">Other apps affected</td>\n";
if($bCanEdit == true)
{
echo " <td align=center width=\"80\">Delete</td>\n";
echo " <td align=center width=\"80\">Checked</td>\n";
}
echo "</tr>\n\n";
$c = 0;
foreach($aBuglinkIds as $iBuglinkId)
{
$oBuglink = new Bug($iBuglinkId);
if (
(!isset($aClean['sAllBugs']) && $oBuglink->isOpen() )
||
isset($aClean['sAllBugs'])
)
{
// set row color
$bgcolor = ($c % 2 == 0) ? "color0" : "color1";
//display row
echo "<tr class=$bgcolor>\n";
echo "<td align=center><a href='".BUGZILLA_ROOT."show_bug.cgi?id=".$oBuglink->iBug_id."'>".$oBuglink->iBug_id."</a></td>\n";
echo "<td>".$oBuglink->sShort_desc."</td>\n";
echo "<td align=center>".$oBuglink->sBug_status."</td>","\n";
echo "<td align=center>".$oBuglink->sResolution."</td>","\n";
echo "<td align=center><a href='viewbugs.php?bug_id=".$oBuglink->iBug_id."'>View</a></td>\n";
if($bCanEdit == true)
{
$oM = new objectManager("bug");
$oM->setReturnTo($oVersion->objectMakeUrl());
echo "<td align=center>[<a href='".$oM->makeUrl("delete", $oBuglink->iLinkId)."&amp;sSubmit=delete'>delete</a>]</td>\n";
if ($oBuglink->bQueued)
{
echo "<td align=center>[<a href='".$oM->makeUrl("edit", $oBuglink->iLinkId)."&amp;sSubmit=Submit&amp;bIsQueue=true'>OK</a>]</td>\n";
} else
{
echo "<td align=center>Yes</td>\n";
}
}
echo "</tr>\n\n";
$c++;
}
}
if($_SESSION['current']->isLoggedIn())
{
echo '<input type="hidden" name="iVersionId" value="'.$iVersionId.'">',"\n";
echo '<tr class=color3><td align=center>',"\n";
$sBuglinkId = isset($aClean['buglinkId']) ? $aClean['buglinkId'] : '';
echo '<input type="text" name="iBuglinkId" value="'.$sBuglinkId.'" size="8"></td>',"\n";
echo '<input type="hidden" name="sSubmit" value="Submit">',"\n";
echo '<input type="hidden" name="sClass" value="bug">',"\n";
echo '<input type="hidden" name="sReturnTo" value="'.$oVersion->objectMakeUrl().'">',"\n";
echo '<td><input type="submit" name="sSub" value="Submit a new bug link."></td>',"\n";
echo '<td colspan=6></td></tr></form>',"\n";
}
echo '</table>',"\n";
// show only open link
if ( isset( $aClean['sAllBugs'] ) )
{
$sURL = str_replace( '&sAllBugs', '', $_SERVER['REQUEST_URI'] );
$sLink = '<a href="' . htmlentities($sURL) . '">Show open bugs</a>';
}
// show all link
else
{
$sURL = $_SERVER['REQUEST_URI'] . '&sAllBugs';
$sLink = '<a href="' . htmlentities($sURL) . '">Show all bugs</a>';
}
echo '<div style="text-align:right;">' . $sLink .'</div>';
echo html_frame_end();
}
?>