private function _extractPartitionDetails()
{
$createTable = (new Table($this->table, $this->db))->showCreate();
if (!$createTable) {
return null;
}
$parser = new SqlParser\Parser($createTable);
/**
* @var $stmt SqlParser\Statements\CreateStatement
*/
$stmt = $parser->statements[0];
$partitionDetails = array();
$partitionDetails['partition_by'] = '';
$partitionDetails['partition_expr'] = '';
$partitionDetails['partition_count'] = '';
if (!empty($stmt->partitionBy)) {
$openPos = strpos($stmt->partitionBy, "(");
$closePos = strrpos($stmt->partitionBy, ")");
$partitionDetails['partition_by'] = trim(substr($stmt->partitionBy, 0, $openPos));
$partitionDetails['partition_expr'] = trim(substr($stmt->partitionBy, $openPos + 1, $closePos - ($openPos + 1)));
if (isset($stmt->partitionsNum)) {
$count = $stmt->partitionsNum;
} else {
$count = count($stmt->partitions);
}
$partitionDetails['partition_count'] = $count;
}
$partitionDetails['subpartition_by'] = '';
$partitionDetails['subpartition_expr'] = '';
$partitionDetails['subpartition_count'] = '';
if (!empty($stmt->subpartitionBy)) {
$openPos = strpos($stmt->subpartitionBy, "(");
$closePos = strrpos($stmt->subpartitionBy, ")");
$partitionDetails['subpartition_by'] = trim(substr($stmt->subpartitionBy, 0, $openPos));
$partitionDetails['subpartition_expr'] = trim(substr($stmt->subpartitionBy, $openPos + 1, $closePos - ($openPos + 1)));
if (isset($stmt->subpartitionsNum)) {
$count = $stmt->subpartitionsNum;
} else {
$count = count($stmt->partitions[0]->subpartitions);
}
$partitionDetails['subpartition_count'] = $count;
}
// Only LIST and RANGE type parameters allow subpartitioning
$partitionDetails['can_have_subpartitions'] = $partitionDetails['partition_count'] > 1 && ($partitionDetails['partition_by'] == 'RANGE' || $partitionDetails['partition_by'] == 'RANGE COLUMNS' || $partitionDetails['partition_by'] == 'LIST' || $partitionDetails['partition_by'] == 'LIST COLUMNS');
// Values are specified only for LIST and RANGE type partitions
$partitionDetails['value_enabled'] = isset($partitionDetails['partition_by']) && ($partitionDetails['partition_by'] == 'RANGE' || $partitionDetails['partition_by'] == 'RANGE COLUMNS' || $partitionDetails['partition_by'] == 'LIST' || $partitionDetails['partition_by'] == 'LIST COLUMNS');
$partitionDetails['partitions'] = array();
for ($i = 0; $i < intval($partitionDetails['partition_count']); $i++) {
if (!isset($stmt->partitions[$i])) {
$partitionDetails['partitions'][$i] = array('name' => 'p' . $i, 'value_type' => '', 'value' => '', 'engine' => '', 'comment' => '', 'data_directory' => '', 'index_directory' => '', 'max_rows' => '', 'min_rows' => '', 'tablespace' => '', 'node_group' => '');
} else {
$p = $stmt->partitions[$i];
$type = $p->type;
$expr = trim($p->expr, '()');
if ($expr == 'MAXVALUE') {
$type .= ' MAXVALUE';
$expr = '';
}
$partitionDetails['partitions'][$i] = array('name' => $p->name, 'value_type' => $type, 'value' => $expr, 'engine' => $p->options->has('ENGINE', true), 'comment' => trim($p->options->has('COMMENT', true), "'"), 'data_directory' => trim($p->options->has('DATA DIRECTORY', true), "'"), 'index_directory' => trim($p->options->has('INDEX_DIRECTORY', true), "'"), 'max_rows' => $p->options->has('MAX_ROWS', true), 'min_rows' => $p->options->has('MIN_ROWS', true), 'tablespace' => $p->options->has('TABLESPACE', true), 'node_group' => $p->options->has('NODEGROUP', true));
}
$partition =& $partitionDetails['partitions'][$i];
$partition['prefix'] = 'partitions[' . $i . ']';
if ($partitionDetails['subpartition_count'] > 1) {
$partition['subpartition_count'] = $partitionDetails['subpartition_count'];
$partition['subpartitions'] = array();
for ($j = 0; $j < intval($partitionDetails['subpartition_count']); $j++) {
if (!isset($stmt->partitions[$i]->subpartitions[$j])) {
$partition['subpartitions'][$j] = array('name' => $partition['name'] . '_s' . $j, 'engine' => '', 'comment' => '', 'data_directory' => '', 'index_directory' => '', 'max_rows' => '', 'min_rows' => '', 'tablespace' => '', 'node_group' => '');
} else {
$sp = $stmt->partitions[$i]->subpartitions[$j];
$partition['subpartitions'][$j] = array('name' => $sp->name, 'engine' => $sp->options->has('ENGINE', true), 'comment' => trim($sp->options->has('COMMENT', true), "'"), 'data_directory' => trim($sp->options->has('DATA DIRECTORY', true), "'"), 'index_directory' => trim($sp->options->has('INDEX_DIRECTORY', true), "'"), 'max_rows' => $sp->options->has('MAX_ROWS', true), 'min_rows' => $sp->options->has('MIN_ROWS', true), 'tablespace' => $sp->options->has('TABLESPACE', true), 'node_group' => $sp->options->has('NODEGROUP', true));
}
$subpartition =& $partition['subpartitions'][$j];
$subpartition['prefix'] = 'partitions[' . $i . ']' . '[subpartitions][' . $j . ']';
}
}
}
return $partitionDetails;
}