| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 | 
							- <?php
 
- /**
 
-  * Library for extracting information about the partitions
 
-  */
 
- declare(strict_types=1);
 
- namespace PhpMyAdmin\Partitioning;
 
- use function array_values;
 
- /**
 
-  * base Partition Class
 
-  */
 
- class Partition extends SubPartition
 
- {
 
-     /** @var string partition description */
 
-     protected $description;
 
-     /** @var SubPartition[] sub partitions */
 
-     protected $subPartitions = [];
 
-     /**
 
-      * Loads data from the fetched row from information_schema.PARTITIONS
 
-      *
 
-      * @param array $row fetched row
 
-      */
 
-     protected function loadData(array $row): void
 
-     {
 
-         $this->name = $row['PARTITION_NAME'];
 
-         $this->ordinal = $row['PARTITION_ORDINAL_POSITION'];
 
-         $this->method = $row['PARTITION_METHOD'];
 
-         $this->expression = $row['PARTITION_EXPRESSION'];
 
-         $this->description = $row['PARTITION_DESCRIPTION'];
 
-         // no sub partitions, load all data to this object
 
-         if (! empty($row['SUBPARTITION_NAME'])) {
 
-             return;
 
-         }
 
-         $this->loadCommonData($row);
 
-     }
 
-     /**
 
-      * Returns the partition description
 
-      *
 
-      * @return string partition description
 
-      */
 
-     public function getDescription()
 
-     {
 
-         return $this->description;
 
-     }
 
-     /**
 
-      * Add a sub partition
 
-      *
 
-      * @param SubPartition $partition Sub partition
 
-      */
 
-     public function addSubPartition(SubPartition $partition): void
 
-     {
 
-         $this->subPartitions[] = $partition;
 
-     }
 
-     /**
 
-      * Whether there are sub partitions
 
-      */
 
-     public function hasSubPartitions(): bool
 
-     {
 
-         return ! empty($this->subPartitions);
 
-     }
 
-     /**
 
-      * Returns the number of data rows
 
-      *
 
-      * @return int number of rows
 
-      */
 
-     public function getRows()
 
-     {
 
-         if (empty($this->subPartitions)) {
 
-             return $this->rows;
 
-         }
 
-         $rows = 0;
 
-         foreach ($this->subPartitions as $subPartition) {
 
-             $rows += $subPartition->rows;
 
-         }
 
-         return $rows;
 
-     }
 
-     /**
 
-      * Returns the total data length
 
-      *
 
-      * @return int data length
 
-      */
 
-     public function getDataLength()
 
-     {
 
-         if (empty($this->subPartitions)) {
 
-             return $this->dataLength;
 
-         }
 
-         $dataLength = 0;
 
-         foreach ($this->subPartitions as $subPartition) {
 
-             $dataLength += $subPartition->dataLength;
 
-         }
 
-         return $dataLength;
 
-     }
 
-     /**
 
-      * Returns the total index length
 
-      *
 
-      * @return int index length
 
-      */
 
-     public function getIndexLength()
 
-     {
 
-         if (empty($this->subPartitions)) {
 
-             return $this->indexLength;
 
-         }
 
-         $indexLength = 0;
 
-         foreach ($this->subPartitions as $subPartition) {
 
-             $indexLength += $subPartition->indexLength;
 
-         }
 
-         return $indexLength;
 
-     }
 
-     /**
 
-      * Returns the list of sub partitions
 
-      *
 
-      * @return SubPartition[]
 
-      */
 
-     public function getSubPartitions()
 
-     {
 
-         return $this->subPartitions;
 
-     }
 
-     /**
 
-      * Returns array of partitions for a specific db/table
 
-      *
 
-      * @param string $db    database name
 
-      * @param string $table table name
 
-      *
 
-      * @return Partition[]
 
-      */
 
-     public static function getPartitions($db, $table)
 
-     {
 
-         global $dbi;
 
-         if (self::havePartitioning()) {
 
-             $result = $dbi->fetchResult(
 
-                 'SELECT * FROM `information_schema`.`PARTITIONS`'
 
-                 . " WHERE `TABLE_SCHEMA` = '" . $dbi->escapeString($db)
 
-                 . "' AND `TABLE_NAME` = '" . $dbi->escapeString($table) . "'"
 
-             );
 
-             if ($result) {
 
-                 $partitionMap = [];
 
-                 /** @var array $row */
 
-                 foreach ($result as $row) {
 
-                     if (isset($partitionMap[$row['PARTITION_NAME']])) {
 
-                         $partition = $partitionMap[$row['PARTITION_NAME']];
 
-                     } else {
 
-                         $partition = new Partition($row);
 
-                         $partitionMap[$row['PARTITION_NAME']] = $partition;
 
-                     }
 
-                     if (empty($row['SUBPARTITION_NAME'])) {
 
-                         continue;
 
-                     }
 
-                     $parentPartition = $partition;
 
-                     $partition = new SubPartition($row);
 
-                     $parentPartition->addSubPartition($partition);
 
-                 }
 
-                 return array_values($partitionMap);
 
-             }
 
-             return [];
 
-         }
 
-         return [];
 
-     }
 
-     /**
 
-      * returns array of partition names for a specific db/table
 
-      *
 
-      * @param string $db    database name
 
-      * @param string $table table name
 
-      *
 
-      * @return array   of partition names
 
-      */
 
-     public static function getPartitionNames($db, $table)
 
-     {
 
-         global $dbi;
 
-         if (self::havePartitioning()) {
 
-             return $dbi->fetchResult(
 
-                 'SELECT DISTINCT `PARTITION_NAME` FROM `information_schema`.`PARTITIONS`'
 
-                 . " WHERE `TABLE_SCHEMA` = '" . $dbi->escapeString($db)
 
-                 . "' AND `TABLE_NAME` = '" . $dbi->escapeString($table) . "'"
 
-             );
 
-         }
 
-         return [];
 
-     }
 
-     /**
 
-      * returns the partition method used by the table.
 
-      *
 
-      * @param string $db    database name
 
-      * @param string $table table name
 
-      *
 
-      * @return string|null partition method
 
-      */
 
-     public static function getPartitionMethod($db, $table)
 
-     {
 
-         global $dbi;
 
-         if (self::havePartitioning()) {
 
-             $partition_method = $dbi->fetchResult(
 
-                 'SELECT `PARTITION_METHOD` FROM `information_schema`.`PARTITIONS`'
 
-                 . " WHERE `TABLE_SCHEMA` = '" . $dbi->escapeString($db) . "'"
 
-                 . " AND `TABLE_NAME` = '" . $dbi->escapeString($table) . "'"
 
-                 . ' LIMIT 1'
 
-             );
 
-             if (! empty($partition_method)) {
 
-                 return $partition_method[0];
 
-             }
 
-         }
 
-         return null;
 
-     }
 
-     /**
 
-      * checks if MySQL server supports partitioning
 
-      *
 
-      * @static
 
-      * @staticvar bool $have_partitioning
 
-      * @staticvar bool $already_checked
 
-      */
 
-     public static function havePartitioning(): bool
 
-     {
 
-         global $dbi;
 
-         static $have_partitioning = false;
 
-         static $already_checked = false;
 
-         if (! $already_checked) {
 
-             if ($dbi->getVersion() < 50600) {
 
-                 if ($dbi->fetchValue('SELECT @@have_partitioning;')) {
 
-                     $have_partitioning = true;
 
-                 }
 
-             } elseif ($dbi->getVersion() >= 80000) {
 
-                 $have_partitioning = true;
 
-             } else {
 
-                 // see https://dev.mysql.com/doc/refman/5.6/en/partitioning.html
 
-                 $plugins = $dbi->fetchResult('SHOW PLUGINS');
 
-                 foreach ($plugins as $value) {
 
-                     if ($value['Name'] === 'partition') {
 
-                         $have_partitioning = true;
 
-                         break;
 
-                     }
 
-                 }
 
-             }
 
-             $already_checked = true;
 
-         }
 
-         return $have_partitioning;
 
-     }
 
- }
 
 
  |