public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $this->database = $request->getURIData('database'); $this->table = $request->getURIData('table'); $this->column = $request->getURIData('column'); $this->key = $request->getURIData('key'); $this->ref = $request->getURIData('ref'); $query = new PhabricatorConfigSchemaQuery(); $actual = $query->loadActualSchemata(); $expect = $query->loadExpectedSchemata(); $comp = $query->buildComparisonSchemata($expect, $actual); if ($this->ref !== null) { $server_actual = idx($actual, $this->ref); if (!$server_actual) { return new Aphront404Response(); } $server_comparison = $comp[$this->ref]; $server_expect = $expect[$this->ref]; if ($this->column) { return $this->renderColumn($server_comparison, $server_expect, $server_actual, $this->database, $this->table, $this->column); } else { if ($this->key) { return $this->renderKey($server_comparison, $server_expect, $server_actual, $this->database, $this->table, $this->key); } else { if ($this->table) { return $this->renderTable($server_comparison, $server_expect, $server_actual, $this->database, $this->table); } else { if ($this->database) { return $this->renderDatabase($server_comparison, $server_expect, $server_actual, $this->database); } } } } } return $this->renderServers($comp, $expect, $actual); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $query = new PhabricatorConfigSchemaQuery(); $actual = $query->loadActualSchemata(); $expect = $query->loadExpectedSchemata(); $comp_servers = $query->buildComparisonSchemata($expect, $actual); $crumbs = $this->buildApplicationCrumbs(); $crumbs->addTextCrumb(pht('Database Issues')); $crumbs->setBorder(true); // Collect all open issues. $issues = array(); foreach ($comp_servers as $ref_name => $comp) { foreach ($comp->getDatabases() as $database_name => $database) { foreach ($database->getLocalIssues() as $issue) { $issues[] = array($ref_name, $database_name, null, null, null, $issue); } foreach ($database->getTables() as $table_name => $table) { foreach ($table->getLocalIssues() as $issue) { $issues[] = array($ref_name, $database_name, $table_name, null, null, $issue); } foreach ($table->getColumns() as $column_name => $column) { foreach ($column->getLocalIssues() as $issue) { $issues[] = array($ref_name, $database_name, $table_name, 'column', $column_name, $issue); } } foreach ($table->getKeys() as $key_name => $key) { foreach ($key->getLocalIssues() as $issue) { $issues[] = array($ref_name, $database_name, $table_name, 'key', $key_name, $issue); } } } } } // Sort all open issues so that the most severe issues appear first. $order = array(); $counts = array(); foreach ($issues as $key => $issue) { $const = $issue[5]; $status = PhabricatorConfigStorageSchema::getIssueStatus($const); $severity = PhabricatorConfigStorageSchema::getStatusSeverity($status); $order[$key] = sprintf('~%d~%s%s%s', 9 - $severity, $issue[1], $issue[2], $issue[4]); if (empty($counts[$status])) { $counts[$status] = 0; } $counts[$status]++; } asort($order); $issues = array_select_keys($issues, array_keys($order)); // Render the issues. $rows = array(); foreach ($issues as $issue) { $const = $issue[5]; $uri = $this->getApplicationURI('/database/' . $issue[0] . '/' . $issue[1] . '/'); $database_link = phutil_tag('a', array('href' => $uri), $issue[1]); $rows[] = array($this->renderIcon(PhabricatorConfigStorageSchema::getIssueStatus($const)), $issue[0], $database_link, $issue[2], $issue[3], $issue[4], PhabricatorConfigStorageSchema::getIssueDescription($const)); } $table = id(new AphrontTableView($rows))->setNoDataString(pht('No databases have any issues.'))->setHeaders(array(null, pht('Server'), pht('Database'), pht('Table'), pht('Type'), pht('Column/Key'), pht('Issue')))->setColumnClasses(array(null, null, null, null, null, null, 'wide')); $errors = array(); if (isset($counts[PhabricatorConfigStorageSchema::STATUS_FAIL])) { $errors[] = pht('Detected %s serious issue(s) with the schemata.', new PhutilNumber($counts[PhabricatorConfigStorageSchema::STATUS_FAIL])); } if (isset($counts[PhabricatorConfigStorageSchema::STATUS_WARN])) { $errors[] = pht('Detected %s warning(s) with the schemata.', new PhutilNumber($counts[PhabricatorConfigStorageSchema::STATUS_WARN])); } $title = pht('Database Issues'); $header = id(new PHUIHeaderView())->setHeader($title)->setProfileHeader(true); $nav = $this->buildSideNavView(); $nav->selectFilter('dbissue/'); $content = id(new PhabricatorConfigPageView())->setHeader($header)->setContent($table); return $this->newPage()->setTitle($title)->setCrumbs($crumbs)->setNavigation($nav)->appendChild($content)->addClass('white-background'); }