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;
 }
 private function renderKey(PhabricatorConfigServerSchema $comp, PhabricatorConfigServerSchema $expect, PhabricatorConfigServerSchema $actual, $database_name, $table_name, $key_name)
 {
     $database = $comp->getDatabase($database_name);
     if (!$database) {
         return new Aphront404Response();
     }
     $table = $database->getTable($table_name);
     if (!$table) {
         return new Aphront404Response();
     }
     $key = $table->getKey($key_name);
     if (!$key) {
         return new Aphront404Response();
     }
     $actual_database = $actual->getDatabase($database_name);
     $actual_table = null;
     $actual_key = null;
     if ($actual_database) {
         $actual_table = $actual_database->getTable($table_name);
         if ($actual_table) {
             $actual_key = $actual_table->getKey($key_name);
         }
     }
     $expect_database = $expect->getDatabase($database_name);
     $expect_table = null;
     $expect_key = null;
     if ($expect_database) {
         $expect_table = $expect_database->getTable($table_name);
         if ($expect_table) {
             $expect_key = $expect_table->getKey($key_name);
         }
     }
     if ($actual_key) {
         $actual_columns = $actual_key->getColumnNames();
         $actual_unique = $actual_key->getUnique();
     } else {
         $actual_columns = array();
         $actual_unique = null;
     }
     if ($expect_key) {
         $expect_columns = $expect_key->getColumnNames();
         $expect_unique = $expect_key->getUnique();
     } else {
         $expect_columns = array();
         $expect_unique = null;
     }
     $title = pht('Database Status: %s.%s (%s)', $database_name, $table_name, $key_name);
     $properties = $this->buildProperties(array(array(pht('Server'), $this->ref), array(pht('Unique'), $this->renderBoolean($actual_unique)), array(pht('Expected Unique'), $this->renderBoolean($expect_unique)), array(pht('Columns'), implode(', ', $actual_columns)), array(pht('Expected Columns'), implode(', ', $expect_columns))), $key->getIssues());
     return $this->buildResponse($title, $properties);
 }