private function renderServer(PhabricatorConfigServerSchema $comp, PhabricatorConfigServerSchema $expect, PhabricatorConfigServerSchema $actual)
 {
     $charset_issue = PhabricatorConfigStorageSchema::ISSUE_CHARSET;
     $collation_issue = PhabricatorConfigStorageSchema::ISSUE_COLLATION;
     $rows = array();
     foreach ($comp->getDatabases() as $database_name => $database) {
         $actual_database = $actual->getDatabase($database_name);
         if ($actual_database) {
             $charset = $actual_database->getCharacterSet();
             $collation = $actual_database->getCollation();
         } else {
             $charset = null;
             $collation = null;
         }
         $status = $database->getStatus();
         $issues = $database->getIssues();
         $rows[] = array($this->renderIcon($status), phutil_tag('a', array('href' => $this->getApplicationURI('/database/' . $database_name . '/')), $database_name), $this->renderAttr($charset, $database->hasIssue($charset_issue)), $this->renderAttr($collation, $database->hasIssue($collation_issue)));
     }
     $table = id(new AphrontTableView($rows))->setHeaders(array(null, pht('Database'), pht('Charset'), pht('Collation')))->setColumnClasses(array(null, 'wide pri', null, null));
     $title = pht('Database Status');
     $properties = $this->buildProperties(array(), $comp->getIssues());
     $prop_box = id(new PHUIObjectBoxView())->setHeader($this->buildHeaderWithDocumentationLink($title))->addPropertyList($properties);
     $table_box = id(new PHUIObjectBoxView())->setHeaderText(pht('Databases'))->setTable($table);
     return $this->buildResponse($title, array($prop_box, $table_box));
 }
 public function buildComparisonSchema(PhabricatorConfigServerSchema $expect, PhabricatorConfigServerSchema $actual)
 {
     $comp_server = $actual->newEmptyClone();
     $all_databases = $actual->getDatabases() + $expect->getDatabases();
     foreach ($all_databases as $database_name => $database_template) {
         $actual_database = $actual->getDatabase($database_name);
         $expect_database = $expect->getDatabase($database_name);
         $issues = $this->compareSchemata($expect_database, $actual_database);
         $comp_database = $database_template->newEmptyClone()->setIssues($issues);
         if (!$actual_database) {
             $actual_database = $expect_database->newEmptyClone();
         }
         if (!$expect_database) {
             $expect_database = $actual_database->newEmptyClone();
         }
         $all_tables = $actual_database->getTables() + $expect_database->getTables();
         foreach ($all_tables as $table_name => $table_template) {
             $actual_table = $actual_database->getTable($table_name);
             $expect_table = $expect_database->getTable($table_name);
             $issues = $this->compareSchemata($expect_table, $actual_table);
             $comp_table = $table_template->newEmptyClone()->setIssues($issues);
             if (!$actual_table) {
                 $actual_table = $expect_table->newEmptyClone();
             }
             if (!$expect_table) {
                 $expect_table = $actual_table->newEmptyClone();
             }
             $all_columns = $actual_table->getColumns() + $expect_table->getColumns();
             foreach ($all_columns as $column_name => $column_template) {
                 $actual_column = $actual_table->getColumn($column_name);
                 $expect_column = $expect_table->getColumn($column_name);
                 $issues = $this->compareSchemata($expect_column, $actual_column);
                 $comp_column = $column_template->newEmptyClone()->setIssues($issues);
                 $comp_table->addColumn($comp_column);
             }
             $all_keys = $actual_table->getKeys() + $expect_table->getKeys();
             foreach ($all_keys as $key_name => $key_template) {
                 $actual_key = $actual_table->getKey($key_name);
                 $expect_key = $expect_table->getKey($key_name);
                 $issues = $this->compareSchemata($expect_key, $actual_key);
                 $comp_key = $key_template->newEmptyClone()->setIssues($issues);
                 $comp_table->addKey($comp_key);
             }
             $comp_database->addTable($comp_table);
         }
         $comp_server->addDatabase($comp_database);
     }
     return $comp_server;
 }