Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
92.31% |
12 / 13 |
CRAP | |
93.59% |
73 / 78 |
| MySQLTable | |
0.00% |
0 / 1 |
|
92.31% |
12 / 13 |
31.25 | |
93.59% |
73 / 78 |
| __construct | |
100.00% |
1 / 1 |
1 | |
100.00% |
9 / 9 |
|||
| getName | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| getColumnList | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| getColumnByName | |
100.00% |
1 / 1 |
3 | |
100.00% |
4 / 4 |
|||
| getConstraintList | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| getIndexList | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| getPrimaryKeyAttributeList | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 5 |
|||
| getConstraintByName | |
100.00% |
1 / 1 |
3 | |
100.00% |
4 / 4 |
|||
| getIndexByName | |
100.00% |
1 / 1 |
3 | |
100.00% |
4 / 4 |
|||
| getDataBaseSpecific | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
| extractColumnData | |
100.00% |
1 / 1 |
2 | |
100.00% |
8 / 8 |
|||
| extractReferenceData | |
100.00% |
1 / 1 |
6 | |
100.00% |
22 / 22 |
|||
| extractIndexData | |
100.00% |
1 / 1 |
5 | |
100.00% |
16 / 16 |
|||
| <?php | |
| declare(strict_types = 1); | |
| namespace Siesta\Driver\MySQL\MetaData; | |
| use Siesta\Database\Connection; | |
| use Siesta\Database\MetaData\ColumnMetaData; | |
| use Siesta\Database\MetaData\ConstraintMetaData; | |
| use Siesta\Database\MetaData\IndexMetaData; | |
| use Siesta\Database\MetaData\TableMetaData; | |
| use Siesta\Driver\MySQL\MySQLDriver; | |
| use Siesta\Driver\MySQL\MySQLTableCreator; | |
| /** | |
| * @author Gregor Müller | |
| */ | |
| class MySQLTable implements TableMetaData | |
| { | |
| const SQL_GET_COLUMN_DETAILS = "SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = '%s' AND TABLE_NAME = '%s';"; | |
| const SQL_GET_KEY_COLUMN_USAGE = "SELECT * FROM information_schema.key_column_usage as KC WHERE KC.CONSTRAINT_SCHEMA = '%s' AND KC.TABLE_NAME = '%s'"; | |
| const SQL_GET_REFERENTIAL_CONSTRAINTS = "SELECT * FROM information_schema.REFERENTIAL_CONSTRAINTS AS RC WHERE RC.CONSTRAINT_SCHEMA = '%s' AND RC.TABLE_NAME = '%s'"; | |
| const SQL_GET_INDEX_LIST = "SELECT S.* FROM INFORMATION_SCHEMA.STATISTICS AS S WHERE S.TABLE_SCHEMA = '%s' AND S.TABLE_NAME = '%s';"; | |
| /** | |
| * @var Connection | |
| */ | |
| protected $connection; | |
| /** | |
| * @var TableDTO | |
| */ | |
| protected $tableDTO; | |
| /** | |
| * @var MySQLColumn[] | |
| */ | |
| protected $columnList; | |
| /** | |
| * @var MySQLConstraint[] | |
| */ | |
| protected $constraintList; | |
| /** | |
| * @var MySQLIndex[] | |
| */ | |
| protected $indexList; | |
| /** | |
| * MySQLTable constructor. | |
| * | |
| * @param Connection $connection | |
| * @param TableDTO $tableDTO | |
| */ | |
| public function __construct(Connection $connection, TableDTO $tableDTO) | |
| { | |
| $this->connection = $connection; | |
| $this->tableDTO = $tableDTO; | |
| $this->columnList = []; | |
| $this->constraintList = []; | |
| $this->indexList = []; | |
| $this->extractColumnData(); | |
| $this->extractReferenceData(); | |
| $this->extractIndexData(); | |
| } | |
| /** | |
| * @return string | |
| */ | |
| public function getName() : string | |
| { | |
| return $this->tableDTO->name; | |
| } | |
| /** | |
| * @return ColumnMetaData[] | |
| */ | |
| public function getColumnList() : array | |
| { | |
| return $this->columnList; | |
| } | |
| /** | |
| * @param string $name | |
| * | |
| * @return ColumnMetaData|null | |
| */ | |
| public function getColumnByName(string $name) | |
| { | |
| foreach ($this->columnList as $column) { | |
| if ($column->getDBName() === $name) { | |
| return $column; | |
| } | |
| } | |
| return null; | |
| } | |
| /** | |
| * @return ConstraintMetaData[] | |
| */ | |
| public function getConstraintList() : array | |
| { | |
| return $this->constraintList; | |
| } | |
| /** | |
| * @return IndexMetaData[] | |
| */ | |
| public function getIndexList() : array | |
| { | |
| return $this->indexList; | |
| } | |
| /** | |
| * @return ColumnMetaData[] | |
| */ | |
| public function getPrimaryKeyAttributeList() : array | |
| { | |
| $primaryKeyColumnList = []; | |
| foreach ($this->getColumnList() as $column) { | |
| if ($column->getIsPrimaryKey()) { | |
| $primaryKeyColumnList[] = $column; | |
| } | |
| } | |
| return $primaryKeyColumnList; | |
| } | |
| /** | |
| * @param string $name | |
| * | |
| * @return null|MySQLConstraint | |
| */ | |
| public function getConstraintByName(string $name) | |
| { | |
| foreach ($this->constraintList as $constraint) { | |
| if ($constraint->getConstraintName() === $name) { | |
| return $constraint; | |
| } | |
| } | |
| return null; | |
| } | |
| /** | |
| * @param string $indexName | |
| * | |
| * @return null|MySQLIndex | |
| */ | |
| public function getIndexByName(string $indexName) | |
| { | |
| foreach ($this->indexList as $index) { | |
| if ($index->getName() === $indexName) { | |
| return $index; | |
| } | |
| } | |
| return null; | |
| } | |
| /** | |
| * @return array | |
| */ | |
| public function getDataBaseSpecific() : array | |
| { | |
| return [ | |
| MySQLDriver::MYSQL_DRIVER_NAME => [ | |
| MySQLTableCreator::MYSQL_ENGINE_ATTRIBUTE => $this->tableDTO->engine, | |
| MySQLTableCreator::MYSQL_COLLATE_ATTRIBUTE => $this->tableDTO->collation | |
| ] | |
| ]; | |
| } | |
| /** | |
| * | |
| */ | |
| protected function extractColumnData() | |
| { | |
| $sql = sprintf(self::SQL_GET_COLUMN_DETAILS, $this->connection->getDatabase(), $this->getName()); | |
| $resultSet = $this->connection->query($sql); | |
| while ($resultSet->hasNext()) { | |
| $column = new MySQLColumn(); | |
| $column->fromResultSet($resultSet, $this->tableDTO->autoincrement); | |
| $this->columnList[] = $column; | |
| } | |
| $resultSet->close(); | |
| } | |
| /** | |
| * | |
| */ | |
| protected function extractReferenceData() | |
| { | |
| $sql = sprintf(self::SQL_GET_KEY_COLUMN_USAGE, $this->connection->getDatabase(), $this->getName()); | |
| $resultSet = $this->connection->query($sql); | |
| while ($resultSet->hasNext()) { | |
| // skip primary key index | |
| if ($resultSet->getStringValue(MySQLConstraint::REFERENCED_TABLE_NAME) === null) { | |
| continue; | |
| } | |
| $constraintName = $resultSet->getStringValue(MySQLConstraint::CONSTRAINT_NAME); | |
| $constraint = $this->getConstraintByName($constraintName); | |
| if ($constraint === null) { | |
| $constraint = new MySQLConstraint($resultSet); | |
| $constraint->fromResultSet($resultSet); | |
| $this->constraintList[] = $constraint; | |
| } else { | |
| $constraint->addConstraint($resultSet); | |
| } | |
| } | |
| $resultSet->close(); | |
| $sql = sprintf(self::SQL_GET_REFERENTIAL_CONSTRAINTS, $this->connection->getDatabase(), $this->getName()); | |
| $resultSet = $this->connection->query($sql); | |
| while ($resultSet->hasNext()) { | |
| $constraintName = $resultSet->getStringValue(MySQLConstraint::CONSTRAINT_NAME); | |
| $constraint = $this->getConstraintByName($constraintName); | |
| if ($constraint !== null) { | |
| $constraint->addUpdateAndDeleteRule($resultSet); | |
| } | |
| } | |
| $resultSet->close(); | |
| } | |
| /** | |
| * extracts index data | |
| */ | |
| protected function extractIndexData() | |
| { | |
| $sql = sprintf(self::SQL_GET_INDEX_LIST, $this->connection->getDatabase(), $this->getName()); | |
| $resultSet = $this->connection->query($sql); | |
| while ($resultSet->hasNext()) { | |
| $indexName = $resultSet->getStringValue(MySQLIndex::INDEX_NAME); | |
| if ($indexName === MySQLIndex::PRIMARY_KEY_INDEX_NAME) { | |
| continue; | |
| } | |
| $constraint = $this->getConstraintByName($indexName); | |
| if ($constraint !== null) { | |
| continue; | |
| } | |
| $index = $this->getIndexByName($indexName); | |
| if ($index === null) { | |
| $index = new MySQLIndex(); | |
| $index->fromResultSet($resultSet); | |
| $this->indexList[] = $index; | |
| } else { | |
| $index->addIndexPart($resultSet); | |
| } | |
| } | |
| } | |
| } |