Path: blob/master/src/applications/config/controller/services/PhabricatorConfigDatabaseIssueController.php
12262 views
<?php12final class PhabricatorConfigDatabaseIssueController3extends PhabricatorConfigDatabaseController {45public function handleRequest(AphrontRequest $request) {6$viewer = $request->getViewer();78$query = new PhabricatorConfigSchemaQuery();910$actual = $query->loadActualSchemata();11$expect = $query->loadExpectedSchemata();12$comp_servers = $query->buildComparisonSchemata($expect, $actual);1314// Collect all open issues.15$issues = array();16foreach ($comp_servers as $ref_name => $comp) {17foreach ($comp->getDatabases() as $database_name => $database) {18foreach ($database->getLocalIssues() as $issue) {19$issues[] = array(20$ref_name,21$database_name,22null,23null,24null,25$issue,26);27}28foreach ($database->getTables() as $table_name => $table) {29foreach ($table->getLocalIssues() as $issue) {30$issues[] = array(31$ref_name,32$database_name,33$table_name,34null,35null,36$issue,37);38}39foreach ($table->getColumns() as $column_name => $column) {40foreach ($column->getLocalIssues() as $issue) {41$issues[] = array(42$ref_name,43$database_name,44$table_name,45'column',46$column_name,47$issue,48);49}50}51foreach ($table->getKeys() as $key_name => $key) {52foreach ($key->getLocalIssues() as $issue) {53$issues[] = array(54$ref_name,55$database_name,56$table_name,57'key',58$key_name,59$issue,60);61}62}63}64}65}6667// Sort all open issues so that the most severe issues appear first.68$order = array();69$counts = array();70foreach ($issues as $key => $issue) {71$const = $issue[5];72$status = PhabricatorConfigStorageSchema::getIssueStatus($const);73$severity = PhabricatorConfigStorageSchema::getStatusSeverity($status);74$order[$key] = sprintf(75'~%d~%s%s%s',769 - $severity,77$issue[1],78$issue[2],79$issue[4]);8081if (empty($counts[$status])) {82$counts[$status] = 0;83}8485$counts[$status]++;86}87asort($order);88$issues = array_select_keys($issues, array_keys($order));899091// Render the issues.92$rows = array();93foreach ($issues as $issue) {94$const = $issue[5];9596$uri = $this->getApplicationURI('/database/'.$issue[0].'/'.$issue[1].'/');9798$database_link = phutil_tag(99'a',100array(101'href' => $uri,102),103$issue[1]);104105$rows[] = array(106$this->renderIcon(107PhabricatorConfigStorageSchema::getIssueStatus($const)),108$issue[0],109$database_link,110$issue[2],111$issue[3],112$issue[4],113PhabricatorConfigStorageSchema::getIssueDescription($const),114);115}116117$table = id(new AphrontTableView($rows))118->setNoDataString(119pht('No databases have any issues.'))120->setHeaders(121array(122null,123pht('Server'),124pht('Database'),125pht('Table'),126pht('Type'),127pht('Column/Key'),128pht('Issue'),129))130->setColumnClasses(131array(132null,133null,134null,135null,136null,137null,138'wide',139));140141$errors = array();142143if (isset($counts[PhabricatorConfigStorageSchema::STATUS_FAIL])) {144$errors[] = pht(145'Detected %s serious issue(s) with the schemata.',146new PhutilNumber($counts[PhabricatorConfigStorageSchema::STATUS_FAIL]));147}148149if (isset($counts[PhabricatorConfigStorageSchema::STATUS_WARN])) {150$errors[] = pht(151'Detected %s warning(s) with the schemata.',152new PhutilNumber($counts[PhabricatorConfigStorageSchema::STATUS_WARN]));153}154155$title = pht('Schemata Issues');156$header = $this->buildHeaderView($title);157158$nav = $this->newNavigation('schemata-issues');159160$view = $this->buildConfigBoxView(pht('Issues'), $table);161162$crumbs = $this->newCrumbs()163->addTextCrumb($title)164->setBorder(true);165166$content = id(new PHUITwoColumnView())167->setHeader($header)168->setFooter($view);169170return $this->newPage()171->setTitle($title)172->setCrumbs($crumbs)173->setNavigation($nav)174->appendChild($content);175}176177}178179180