Example #1
0
 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;
 }