Differential D10525 Diff 25299 src/applications/config/controller/PhabricatorConfigDatabaseStatusController.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/config/controller/PhabricatorConfigDatabaseStatusController.php
- This file was copied from src/applications/config/controller/PhabricatorConfigDatabaseController.php.
<?php | <?php | ||||
final class PhabricatorConfigDatabaseController | final class PhabricatorConfigDatabaseStatusController | ||||
extends PhabricatorConfigController { | extends PhabricatorConfigDatabaseController { | ||||
const MAX_INNODB_KEY_LENGTH = 767; | |||||
private $database; | private $database; | ||||
private $table; | private $table; | ||||
private $column; | private $column; | ||||
private $key; | private $key; | ||||
public function willProcessRequest(array $data) { | public function willProcessRequest(array $data) { | ||||
$this->database = idx($data, 'database'); | $this->database = idx($data, 'database'); | ||||
$this->table = idx($data, 'table'); | $this->table = idx($data, 'table'); | ||||
$this->column = idx($data, 'column'); | $this->column = idx($data, 'column'); | ||||
$this->key = idx($data, 'key'); | $this->key = idx($data, 'key'); | ||||
} | } | ||||
public function processRequest() { | public function processRequest() { | ||||
$request = $this->getRequest(); | $request = $this->getRequest(); | ||||
$viewer = $request->getUser(); | $viewer = $request->getUser(); | ||||
$conf = PhabricatorEnv::newObjectFromConfig( | $query = $this->buildSchemaQuery(); | ||||
'mysql.configuration-provider', | |||||
array($dao = null, 'w')); | |||||
$api = id(new PhabricatorStorageManagementAPI()) | |||||
->setUser($conf->getUser()) | |||||
->setHost($conf->getHost()) | |||||
->setPort($conf->getPort()) | |||||
->setNamespace(PhabricatorLiskDAO::getDefaultStorageNamespace()) | |||||
->setPassword($conf->getPassword()); | |||||
$query = id(new PhabricatorConfigSchemaQuery()) | |||||
->setAPI($api); | |||||
$actual = $query->loadActualSchema(); | $actual = $query->loadActualSchema(); | ||||
$expect = $query->loadExpectedSchema(); | $expect = $query->loadExpectedSchema(); | ||||
$comp = $query->buildComparisonSchema($expect, $actual); | $comp = $query->buildComparisonSchema($expect, $actual); | ||||
if ($this->column) { | if ($this->column) { | ||||
return $this->renderColumn( | return $this->renderColumn( | ||||
$comp, | $comp, | ||||
▲ Show 20 Lines • Show All 243 Lines • ▼ Show 20 Lines | private function renderTable( | ||||
PhabricatorConfigServerSchema $actual, | PhabricatorConfigServerSchema $actual, | ||||
$database_name, | $database_name, | ||||
$table_name) { | $table_name) { | ||||
$type_issue = PhabricatorConfigStorageSchema::ISSUE_COLUMNTYPE; | $type_issue = PhabricatorConfigStorageSchema::ISSUE_COLUMNTYPE; | ||||
$charset_issue = PhabricatorConfigStorageSchema::ISSUE_CHARSET; | $charset_issue = PhabricatorConfigStorageSchema::ISSUE_CHARSET; | ||||
$collation_issue = PhabricatorConfigStorageSchema::ISSUE_COLLATION; | $collation_issue = PhabricatorConfigStorageSchema::ISSUE_COLLATION; | ||||
$nullable_issue = PhabricatorConfigStorageSchema::ISSUE_NULLABLE; | $nullable_issue = PhabricatorConfigStorageSchema::ISSUE_NULLABLE; | ||||
$unique_issue = PhabricatorConfigStorageSchema::ISSUE_UNIQUE; | |||||
$database = $comp->getDatabase($database_name); | $database = $comp->getDatabase($database_name); | ||||
if (!$database) { | if (!$database) { | ||||
return new Aphront404Response(); | return new Aphront404Response(); | ||||
} | } | ||||
$table = $database->getTable($table_name); | $table = $database->getTable($table_name); | ||||
if (!$table) { | if (!$table) { | ||||
Show All 39 Lines | foreach ($table->getColumns() as $column_name => $column) { | ||||
$column_name.'/'), | $column_name.'/'), | ||||
), | ), | ||||
$column_name), | $column_name), | ||||
$data_type, | $data_type, | ||||
$this->renderAttr( | $this->renderAttr( | ||||
$column->getColumnType(), | $column->getColumnType(), | ||||
$column->hasIssue($type_issue)), | $column->hasIssue($type_issue)), | ||||
$this->renderAttr( | $this->renderAttr( | ||||
$column->getNullable() | $this->renderBoolean($column->getNullable()), | ||||
? pht('Yes') | |||||
: pht('No'), | |||||
$column->hasIssue($nullable_issue)), | $column->hasIssue($nullable_issue)), | ||||
$this->renderAttr( | $this->renderAttr( | ||||
$column->getCharacterSet(), | $column->getCharacterSet(), | ||||
$column->hasIssue($charset_issue)), | $column->hasIssue($charset_issue)), | ||||
$this->renderAttr( | $this->renderAttr( | ||||
$column->getCollation(), | $column->getCollation(), | ||||
$column->hasIssue($collation_issue)), | $column->hasIssue($collation_issue)), | ||||
); | ); | ||||
▲ Show 20 Lines • Show All 55 Lines • ▼ Show 20 Lines | foreach ($table->getKeys() as $key_name => $key) { | ||||
'database/'. | 'database/'. | ||||
$database_name.'/'. | $database_name.'/'. | ||||
$table_name.'/'. | $table_name.'/'. | ||||
'key/'. | 'key/'. | ||||
$key_name.'/'), | $key_name.'/'), | ||||
), | ), | ||||
$key_name), | $key_name), | ||||
implode(', ', $key->getColumnNames()), | implode(', ', $key->getColumnNames()), | ||||
$this->renderAttr( | |||||
$this->renderBoolean($key->getUnique()), | |||||
$key->hasIssue($unique_issue)), | |||||
$size_formatted, | $size_formatted, | ||||
); | ); | ||||
} | } | ||||
$keys_view = id(new AphrontTableView($key_rows)) | $keys_view = id(new AphrontTableView($key_rows)) | ||||
->setHeaders( | ->setHeaders( | ||||
array( | array( | ||||
null, | null, | ||||
pht('Key'), | pht('Key'), | ||||
pht('Columns'), | pht('Columns'), | ||||
pht('Unique'), | |||||
pht('Size'), | pht('Size'), | ||||
)) | )) | ||||
->setColumnClasses( | ->setColumnClasses( | ||||
array( | array( | ||||
null, | null, | ||||
'wide pri', | 'wide pri', | ||||
null, | null, | ||||
null, | null, | ||||
null, | |||||
)); | )); | ||||
$title = pht('Database Status: %s.%s', $database_name, $table_name); | $title = pht('Database Status: %s.%s', $database_name, $table_name); | ||||
if ($actual_table) { | if ($actual_table) { | ||||
$actual_collation = $actual_table->getCollation(); | $actual_collation = $actual_table->getCollation(); | ||||
} else { | } else { | ||||
$actual_collation = null; | $actual_collation = null; | ||||
▲ Show 20 Lines • Show All 130 Lines • ▼ Show 20 Lines | $properties = $this->buildProperties( | ||||
$actual_collation, | $actual_collation, | ||||
), | ), | ||||
array( | array( | ||||
pht('Expected Collation'), | pht('Expected Collation'), | ||||
$expect_collation, | $expect_collation, | ||||
), | ), | ||||
array( | array( | ||||
pht('Nullable'), | pht('Nullable'), | ||||
$this->getNullableString($actual_nullable), | $this->renderBoolean($actual_nullable), | ||||
), | ), | ||||
array( | array( | ||||
pht('Expected Nullable'), | pht('Expected Nullable'), | ||||
$this->getNullableString($expect_nullable), | $this->renderBoolean($expect_nullable), | ||||
), | ), | ||||
), | ), | ||||
$column->getIssues()); | $column->getIssues()); | ||||
$box = id(new PHUIObjectBoxView()) | $box = id(new PHUIObjectBoxView()) | ||||
->setHeaderText($title) | ->setHeaderText($title) | ||||
->addPropertyList($properties); | ->addPropertyList($properties); | ||||
Show All 40 Lines | if ($expect_database) { | ||||
$expect_table = $expect_database->getTable($table_name); | $expect_table = $expect_database->getTable($table_name); | ||||
if ($expect_table) { | if ($expect_table) { | ||||
$expect_key = $expect_table->getKey($key_name); | $expect_key = $expect_table->getKey($key_name); | ||||
} | } | ||||
} | } | ||||
if ($actual_key) { | if ($actual_key) { | ||||
$actual_columns = $actual_key->getColumnNames(); | $actual_columns = $actual_key->getColumnNames(); | ||||
$actual_unique = $actual_key->getUnique(); | |||||
} else { | } else { | ||||
$actual_columns = array(); | $actual_columns = array(); | ||||
$actual_unique = null; | |||||
} | } | ||||
if ($expect_key) { | if ($expect_key) { | ||||
$expect_columns = $expect_key->getColumnNames(); | $expect_columns = $expect_key->getColumnNames(); | ||||
$expect_unique = $expect_key->getUnique(); | |||||
} else { | } else { | ||||
$expect_columns = array(); | $expect_columns = array(); | ||||
$expect_unique = null; | |||||
} | } | ||||
$title = pht( | $title = pht( | ||||
'Database Status: %s.%s (%s)', | 'Database Status: %s.%s (%s)', | ||||
$database_name, | $database_name, | ||||
$table_name, | $table_name, | ||||
$key_name); | $key_name); | ||||
$properties = $this->buildProperties( | $properties = $this->buildProperties( | ||||
array( | array( | ||||
array( | array( | ||||
pht('Unique'), | |||||
$this->renderBoolean($actual_unique), | |||||
), | |||||
array( | |||||
pht('Expected Unique'), | |||||
$this->renderBoolean($expect_unique), | |||||
), | |||||
array( | |||||
pht('Columns'), | pht('Columns'), | ||||
implode(', ', $actual_columns), | implode(', ', $actual_columns), | ||||
), | ), | ||||
array( | array( | ||||
pht('Expected Columns'), | pht('Expected Columns'), | ||||
implode(', ', $expect_columns), | implode(', ', $expect_columns), | ||||
), | ), | ||||
), | ), | ||||
$key->getIssues()); | $key->getIssues()); | ||||
$box = id(new PHUIObjectBoxView()) | $box = id(new PHUIObjectBoxView()) | ||||
->setHeaderText($title) | ->setHeaderText($title) | ||||
->addPropertyList($properties); | ->addPropertyList($properties); | ||||
return $this->buildResponse($title, $box); | return $this->buildResponse($title, $box); | ||||
} | } | ||||
private function renderIcon($status) { | |||||
switch ($status) { | |||||
case PhabricatorConfigStorageSchema::STATUS_OKAY: | |||||
$icon = 'fa-check-circle green'; | |||||
break; | |||||
case PhabricatorConfigStorageSchema::STATUS_NOTE: | |||||
$icon = 'fa-info-circle blue'; | |||||
break; | |||||
case PhabricatorConfigStorageSchema::STATUS_WARN: | |||||
$icon = 'fa-exclamation-circle yellow'; | |||||
break; | |||||
case PhabricatorConfigStorageSchema::STATUS_FAIL: | |||||
default: | |||||
$icon = 'fa-times-circle red'; | |||||
break; | |||||
} | |||||
return id(new PHUIIconView()) | |||||
->setIconFont($icon); | |||||
} | |||||
private function renderAttr($attr, $issue) { | |||||
if ($issue) { | |||||
return phutil_tag( | |||||
'span', | |||||
array( | |||||
'style' => 'color: #aa0000;', | |||||
), | |||||
$attr); | |||||
} else { | |||||
return $attr; | |||||
} | |||||
} | |||||
private function buildProperties(array $properties, array $issues) { | private function buildProperties(array $properties, array $issues) { | ||||
$view = id(new PHUIPropertyListView()) | $view = id(new PHUIPropertyListView()) | ||||
->setUser($this->getRequest()->getUser()); | ->setUser($this->getRequest()->getUser()); | ||||
foreach ($properties as $property) { | foreach ($properties as $property) { | ||||
list($key, $value) = $property; | list($key, $value) = $property; | ||||
$view->addProperty($key, $value); | $view->addProperty($key, $value); | ||||
} | } | ||||
Show All 33 Lines | if (!$issues) { | ||||
$status_view->addItem($item); | $status_view->addItem($item); | ||||
} | } | ||||
} | } | ||||
$view->addProperty(pht('Schema Status'), $status_view); | $view->addProperty(pht('Schema Status'), $status_view); | ||||
return $view; | return $view; | ||||
} | } | ||||
private function getNullableString($value) { | |||||
if ($value === null) { | |||||
return ''; | |||||
} else if ($value === true) { | |||||
return pht('Yes'); | |||||
} else { | |||||
return pht('No'); | |||||
} | |||||
} | |||||
} | } |