private function BuildTable(IConnection $Connection, $DatabaseName, $TableName, array &$LoadedTables)
{
if (isset($LoadedTables[$TableName])) {
return $LoadedTables[$TableName];
}
$QueryBuilder = $Connection->QueryBuilder();
$QueryBuilder->Append('SELECT T.*, C.CHARACTER_SET_NAME FROM ');
$QueryBuilder->Append('`INFORMATION_SCHEMA`.`TABLES` T ');
$QueryBuilder->Append('INNER JOIN ');
$QueryBuilder->Append('`INFORMATION_SCHEMA`.`COLLATION_CHARACTER_SET_APPLICABILITY` C ');
$QueryBuilder->Append('ON C.COLLATION_NAME = T.TABLE_COLLATION ');
$QueryBuilder->Append('WHERE TRUE ');
$QueryBuilder->AppendValue('AND T.`TABLE_SCHEMA` = # ', $DatabaseName);
$QueryBuilder->AppendValue('AND T.`TABLE_NAME` = # ', $TableName);
$TableInfoRow = $QueryBuilder->Build()->Execute()->FetchRow();
$Columns = $this->BuildColumns($Connection, $DatabaseName, $TableName);
$StructuralTraits = [];
$RelationalTraits = [];
$StructuralTraits[] = new Tables\Engine($TableInfoRow['ENGINE']);
$StructuralTraits[] = new Tables\CharacterSet($TableInfoRow['CHARACTER_SET_NAME']);
$StructuralTraits[] = new Tables\Collation($TableInfoRow['TABLE_COLLATION']);
if (strlen($TableInfoRow['TABLE_COMMENT']) > 0) {
$StructuralTraits[] = new Traits\Comment($TableInfoRow['TABLE_COMMENT']);
}
foreach ($this->BuildIndexes($Connection, $Columns, $DatabaseName, $TableName) as $Index) {
$StructuralTraits[] = $Index;
}
$Table = new Relational\Table($TableName, null, $Columns, $StructuralTraits, []);
$LoadedTables[$TableName] = $Table;
$ForeignKeys = $this->BuildForeignKeys($Connection, $Columns, $DatabaseName, $TableName, $LoadedTables);
foreach ($ForeignKeys as $ForeignKey) {
$Table->AddTrait($ForeignKey);
}
return $Table;
}