Changeset View
Changeset View
Standalone View
Standalone View
src/applications/config/schema/PhabricatorConfigSchemaQuery.php
Show First 20 Lines • Show All 63 Lines • ▼ Show 20 Lines | if ($sql) { | ||||
FROM INFORMATION_SCHEMA.COLUMNS | FROM INFORMATION_SCHEMA.COLUMNS | ||||
WHERE (%Q)', | WHERE (%Q)', | ||||
'('.implode(') OR (', $sql).')'); | '('.implode(') OR (', $sql).')'); | ||||
$column_info = igroup($column_info, 'TABLE_SCHEMA'); | $column_info = igroup($column_info, 'TABLE_SCHEMA'); | ||||
} else { | } else { | ||||
$column_info = array(); | $column_info = array(); | ||||
} | } | ||||
if ($sql) { | // NOTE: Tables like KEY_COLUMN_USAGE and TABLE_CONSTRAINTS only contain | ||||
$key_info = queryfx_all( | // primary, unique, and foreign keys, so we can't use them here. We pull | ||||
$conn, | // indexes later on using SHOW INDEXES. | ||||
'SELECT CONSTRAINT_NAME, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, | |||||
ORDINAL_POSITION, POSITION_IN_UNIQUE_CONSTRAINT | |||||
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE | |||||
WHERE (%Q)', | |||||
'('.implode(') OR (', $sql).')'); | |||||
$key_info = igroup($key_info, 'TABLE_SCHEMA'); | |||||
} else { | |||||
$key_info = array(); | |||||
} | |||||
$server_schema = new PhabricatorConfigServerSchema(); | $server_schema = new PhabricatorConfigServerSchema(); | ||||
$tables = igroup($tables, 'TABLE_SCHEMA'); | $tables = igroup($tables, 'TABLE_SCHEMA'); | ||||
foreach ($tables as $database_name => $database_tables) { | foreach ($tables as $database_name => $database_tables) { | ||||
$info = $database_info[$database_name]; | $info = $database_info[$database_name]; | ||||
$database_schema = id(new PhabricatorConfigDatabaseSchema()) | $database_schema = id(new PhabricatorConfigDatabaseSchema()) | ||||
->setName($database_name) | ->setName($database_name) | ||||
->setCharacterSet($info['DEFAULT_CHARACTER_SET_NAME']) | ->setCharacterSet($info['DEFAULT_CHARACTER_SET_NAME']) | ||||
->setCollation($info['DEFAULT_COLLATION_NAME']); | ->setCollation($info['DEFAULT_COLLATION_NAME']); | ||||
$database_column_info = idx($column_info, $database_name, array()); | $database_column_info = idx($column_info, $database_name, array()); | ||||
$database_column_info = igroup($database_column_info, 'TABLE_NAME'); | $database_column_info = igroup($database_column_info, 'TABLE_NAME'); | ||||
$database_key_info = idx($key_info, $database_name, array()); | |||||
$database_key_info = igroup($database_key_info, 'TABLE_NAME'); | |||||
foreach ($database_tables as $table) { | foreach ($database_tables as $table) { | ||||
$table_name = $table['TABLE_NAME']; | $table_name = $table['TABLE_NAME']; | ||||
$table_schema = id(new PhabricatorConfigTableSchema()) | $table_schema = id(new PhabricatorConfigTableSchema()) | ||||
->setName($table_name) | ->setName($table_name) | ||||
->setCollation($table['TABLE_COLLATION']); | ->setCollation($table['TABLE_COLLATION']); | ||||
$columns = idx($database_column_info, $table_name, array()); | $columns = idx($database_column_info, $table_name, array()); | ||||
foreach ($columns as $column) { | foreach ($columns as $column) { | ||||
$column_schema = id(new PhabricatorConfigColumnSchema()) | $column_schema = id(new PhabricatorConfigColumnSchema()) | ||||
->setName($column['COLUMN_NAME']) | ->setName($column['COLUMN_NAME']) | ||||
->setCharacterSet($column['CHARACTER_SET_NAME']) | ->setCharacterSet($column['CHARACTER_SET_NAME']) | ||||
->setCollation($column['COLLATION_NAME']) | ->setCollation($column['COLLATION_NAME']) | ||||
->setColumnType($column['COLUMN_TYPE']) | ->setColumnType($column['COLUMN_TYPE']) | ||||
->setNullable($column['IS_NULLABLE'] == 'YES'); | ->setNullable($column['IS_NULLABLE'] == 'YES'); | ||||
$table_schema->addColumn($column_schema); | $table_schema->addColumn($column_schema); | ||||
} | } | ||||
$key_parts = idx($database_key_info, $table_name, array()); | $key_parts = queryfx_all( | ||||
$keys = igroup($key_parts, 'CONSTRAINT_NAME'); | $conn, | ||||
'SHOW INDEXES FROM %T.%T', | |||||
$database_name, | |||||
$table_name); | |||||
$keys = igroup($key_parts, 'Key_name'); | |||||
foreach ($keys as $key_name => $key_pieces) { | foreach ($keys as $key_name => $key_pieces) { | ||||
$key_pieces = isort($key_pieces, 'ORDINAL_POSITION'); | $key_pieces = isort($key_pieces, 'Seq_in_index'); | ||||
$head = head($key_pieces); | |||||
$key_schema = id(new PhabricatorConfigKeySchema()) | $key_schema = id(new PhabricatorConfigKeySchema()) | ||||
->setName($key_name) | ->setName($key_name) | ||||
->setColumnNames(ipull($key_pieces, 'COLUMN_NAME')); | ->setColumnNames(ipull($key_pieces, 'Column_name')) | ||||
->setUnique(!$head['Non_unique']); | |||||
$table_schema->addKey($key_schema); | $table_schema->addKey($key_schema); | ||||
} | } | ||||
$database_schema->addTable($table_schema); | $database_schema->addTable($table_schema); | ||||
} | } | ||||
$server_schema->addDatabase($database_schema); | $server_schema->addDatabase($database_schema); | ||||
▲ Show 20 Lines • Show All 146 Lines • Show Last 20 Lines |