PMA\libraries\Table::getSqlQueryForIndexCreateOrEdit PHP Method

getSqlQueryForIndexCreateOrEdit() public method

Function to get the sql query for index creation or edit
public getSqlQueryForIndexCreateOrEdit ( Index $index, &$error ) : string
$index Index current index
return string
    public function getSqlQueryForIndexCreateOrEdit($index, &$error)
    {
        // $sql_query is the one displayed in the query box
        $sql_query = sprintf('ALTER TABLE %s.%s', Util::backquote($this->_db_name), Util::backquote($this->_name));
        // Drops the old index
        if (!empty($_REQUEST['old_index'])) {
            if ($_REQUEST['old_index'] == 'PRIMARY') {
                $sql_query .= ' DROP PRIMARY KEY,';
            } else {
                $sql_query .= sprintf(' DROP INDEX %s,', Util::backquote($_REQUEST['old_index']));
            }
        }
        // end if
        // Builds the new one
        switch ($index->getChoice()) {
            case 'PRIMARY':
                if ($index->getName() == '') {
                    $index->setName('PRIMARY');
                } elseif ($index->getName() != 'PRIMARY') {
                    $error = Message::error(__('The name of the primary key must be "PRIMARY"!'));
                }
                $sql_query .= ' ADD PRIMARY KEY';
                break;
            case 'FULLTEXT':
            case 'UNIQUE':
            case 'INDEX':
            case 'SPATIAL':
                if ($index->getName() == 'PRIMARY') {
                    $error = Message::error(__('Can\'t rename index to PRIMARY!'));
                }
                $sql_query .= sprintf(' ADD %s ', $index->getChoice());
                if ($index->getName()) {
                    $sql_query .= Util::backquote($index->getName());
                }
                break;
        }
        // end switch
        $index_fields = array();
        foreach ($index->getColumns() as $key => $column) {
            $index_fields[$key] = Util::backquote($column->getName());
            if ($column->getSubPart()) {
                $index_fields[$key] .= '(' . $column->getSubPart() . ')';
            }
        }
        // end while
        if (empty($index_fields)) {
            $error = Message::error(__('No index parts defined!'));
        } else {
            $sql_query .= ' (' . implode(', ', $index_fields) . ')';
        }
        $keyBlockSizes = $index->getKeyBlockSize();
        if (!empty($keyBlockSizes)) {
            $sql_query .= sprintf(' KEY_BLOCK_SIZE = ', $GLOBALS['dbi']->escapeString($keyBlockSizes));
        }
        // specifying index type is allowed only for primary, unique and index only
        $type = $index->getType();
        if ($index->getChoice() != 'SPATIAL' && $index->getChoice() != 'FULLTEXT' && in_array($type, Index::getIndexTypes())) {
            $sql_query .= ' USING ' . $type;
        }
        $parser = $index->getParser();
        if ($index->getChoice() == 'FULLTEXT' && !empty($parser)) {
            $sql_query .= ' WITH PARSER ' . $GLOBALS['dbi']->escapeString($parser);
        }
        $comment = $index->getComment();
        if (!empty($comment)) {
            $sql_query .= sprintf(" COMMENT '%s'", $GLOBALS['dbi']->escapeString($comment));
        }
        $sql_query .= ';';
        return $sql_query;
    }

Usage Example

Example #1
0
 /**
  * Tests for getSqlQueryForIndexCreateOrEdit() method.
  *
  * @return void
  * @test
  */
 public function testGetSqlQueryForIndexCreateOrEdit()
 {
     $db = "pma_db";
     $table = "pma_table";
     $index = new PMA\libraries\Index();
     $error = false;
     $_REQUEST['old_index'] = "PRIMARY";
     $table = new Table($table, $db);
     $sql = $table->getSqlQueryForIndexCreateOrEdit($index, $error);
     $this->assertEquals("ALTER TABLE `pma_db`.`pma_table` DROP PRIMARY KEY, ADD UNIQUE ;", $sql);
 }