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; }