[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/src/applications/config/controller/ -> PhabricatorConfigDatabaseIssueController.php (source)

   1  <?php
   2  
   3  final class PhabricatorConfigDatabaseIssueController
   4    extends PhabricatorConfigDatabaseController {
   5  
   6    public function processRequest() {
   7      $request = $this->getRequest();
   8      $viewer = $request->getUser();
   9  
  10      $query = $this->buildSchemaQuery();
  11  
  12      $actual = $query->loadActualSchema();
  13      $expect = $query->loadExpectedSchema();
  14      $comp = $query->buildComparisonSchema($expect, $actual);
  15  
  16      $crumbs = $this->buildApplicationCrumbs();
  17      $crumbs->addTextCrumb(pht('Database Issues'));
  18  
  19      // Collect all open issues.
  20      $issues = array();
  21      foreach ($comp->getDatabases() as $database_name => $database) {
  22        foreach ($database->getLocalIssues() as $issue) {
  23          $issues[] = array(
  24            $database_name,
  25            null,
  26            null,
  27            null,
  28            $issue,
  29          );
  30        }
  31        foreach ($database->getTables() as $table_name => $table) {
  32          foreach ($table->getLocalIssues() as $issue) {
  33            $issues[] = array(
  34              $database_name,
  35              $table_name,
  36              null,
  37              null,
  38              $issue,
  39            );
  40          }
  41          foreach ($table->getColumns() as $column_name => $column) {
  42            foreach ($column->getLocalIssues() as $issue) {
  43              $issues[] = array(
  44                $database_name,
  45                $table_name,
  46                'column',
  47                $column_name,
  48                $issue,
  49              );
  50            }
  51          }
  52          foreach ($table->getKeys() as $key_name => $key) {
  53            foreach ($key->getLocalIssues() as $issue) {
  54              $issues[] = array(
  55                $database_name,
  56                $table_name,
  57                'key',
  58                $key_name,
  59                $issue,
  60              );
  61            }
  62          }
  63        }
  64      }
  65  
  66  
  67      // Sort all open issues so that the most severe issues appear first.
  68      $order = array();
  69      $counts = array();
  70      foreach ($issues as $key => $issue) {
  71        $const = $issue[4];
  72        $status = PhabricatorConfigStorageSchema::getIssueStatus($const);
  73        $severity = PhabricatorConfigStorageSchema::getStatusSeverity($status);
  74        $order[$key] = sprintf(
  75          '~%d~%s%s%s',
  76          9 - $severity,
  77          $issue[0],
  78          $issue[1],
  79          $issue[3]);
  80  
  81        if (empty($counts[$status])) {
  82          $counts[$status] = 0;
  83        }
  84  
  85        $counts[$status]++;
  86      }
  87      asort($order);
  88      $issues = array_select_keys($issues, array_keys($order));
  89  
  90  
  91      // Render the issues.
  92      $rows = array();
  93      foreach ($issues as $issue) {
  94        $const = $issue[4];
  95  
  96        $database_link = phutil_tag(
  97          'a',
  98          array(
  99            'href' => $this->getApplicationURI('/database/'.$issue[0].'/'),
 100          ),
 101          $issue[0]);
 102  
 103        $rows[] = array(
 104          $this->renderIcon(
 105            PhabricatorConfigStorageSchema::getIssueStatus($const)),
 106          $database_link,
 107          $issue[1],
 108          $issue[2],
 109          $issue[3],
 110          PhabricatorConfigStorageSchema::getIssueDescription($const),
 111        );
 112      }
 113  
 114      $table = id(new AphrontTableView($rows))
 115        ->setHeaders(
 116          array(
 117            null,
 118            pht('Database'),
 119            pht('Table'),
 120            pht('Type'),
 121            pht('Column/Key'),
 122            pht('Issue'),
 123          ))
 124        ->setColumnClasses(
 125          array(
 126            null,
 127            null,
 128            null,
 129            null,
 130            null,
 131            'wide',
 132          ));
 133  
 134      $errors = array();
 135  
 136      if (isset($counts[PhabricatorConfigStorageSchema::STATUS_FAIL])) {
 137        $errors[] = pht(
 138          'Detected %s serious issue(s) with the schemata.',
 139          new PhutilNumber($counts[PhabricatorConfigStorageSchema::STATUS_FAIL]));
 140      }
 141  
 142      if (isset($counts[PhabricatorConfigStorageSchema::STATUS_WARN])) {
 143        $errors[] = pht(
 144          'Detected %s warning(s) with the schemata.',
 145          new PhutilNumber($counts[PhabricatorConfigStorageSchema::STATUS_WARN]));
 146      }
 147  
 148      $title = pht('Database Issues');
 149  
 150      $table_box = id(new PHUIObjectBoxView())
 151        ->setHeader($this->buildHeaderWithDocumentationLink($title))
 152        ->setFormErrors($errors)
 153        ->appendChild($table);
 154  
 155      $nav = $this->buildSideNavView();
 156      $nav->selectFilter('dbissue/');
 157      $nav->appendChild(
 158        array(
 159          $crumbs,
 160          $table_box,
 161        ));
 162  
 163      return $this->buildApplicationPage(
 164        $nav,
 165        array(
 166          'title' => $title,
 167        ));
 168    }
 169  
 170  }


Generated: Sun Nov 30 09:20:46 2014 Cross-referenced by PHPXref 0.7.1