123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365 |
- <?php
- /* vim: set expandtab sw=4 ts=4 sts=4: */
- /**
- * Displays index edit/creation form and handles it
- *
- * @package PhpMyAdmin
- */
- /**
- * Gets some core libraries
- */
- require_once 'libraries/common.inc.php';
- require_once 'libraries/Index.class.php';
- require_once 'libraries/tbl_common.inc.php';
- // Get fields and stores their name/type
- $fields = array();
- foreach (PMA_DBI_get_columns_full($db, $table) as $row) {
- if (preg_match('@^(set|enum)\((.+)\)$@i', $row['Type'], $tmp)) {
- $tmp[2] = substr(
- preg_replace('@([^,])\'\'@', '\\1\\\'', ',' . $tmp[2]), 1
- );
- $fields[$row['Field']] = $tmp[1] . '('
- . str_replace(',', ', ', $tmp[2]) . ')';
- } else {
- $fields[$row['Field']] = $row['Type'];
- }
- } // end while
- // Prepares the form values
- if (isset($_REQUEST['index'])) {
- if (is_array($_REQUEST['index'])) {
- // coming already from form
- $index = new PMA_Index($_REQUEST['index']);
- } else {
- $index = PMA_Index::singleton($db, $table, $_REQUEST['index']);
- }
- } else {
- $index = new PMA_Index;
- }
- /**
- * Process the data from the edit/create index form,
- * run the query to build the new index
- * and moves back to "tbl_sql.php"
- */
- if (isset($_REQUEST['do_save_data'])) {
- $error = false;
- // $sql_query is the one displayed in the query box
- $sql_query = 'ALTER TABLE ' . PMA_Util::backquote($db)
- . '.' . PMA_Util::backquote($table);
- // Drops the old index
- if (! empty($_REQUEST['old_index'])) {
- if ($_REQUEST['old_index'] == 'PRIMARY') {
- $sql_query .= ' DROP PRIMARY KEY,';
- } else {
- $sql_query .= ' DROP INDEX '
- . PMA_Util::backquote($_REQUEST['old_index']) . ',';
- }
- } // end if
- // Builds the new one
- switch ($index->getType()) {
- case 'PRIMARY':
- if ($index->getName() == '') {
- $index->setName('PRIMARY');
- } elseif ($index->getName() != 'PRIMARY') {
- $error = PMA_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 = PMA_Message::error(__('Can\'t rename index to PRIMARY!'));
- }
- $sql_query .= ' ADD ' . $index->getType() . ' '
- . ($index->getName() ? PMA_Util::backquote($index->getName()) : '');
- break;
- } // end switch
- $index_fields = array();
- foreach ($index->getColumns() as $key => $column) {
- $index_fields[$key] = PMA_Util::backquote($column->getName());
- if ($column->getSubPart()) {
- $index_fields[$key] .= '(' . $column->getSubPart() . ')';
- }
- } // end while
- if (empty($index_fields)) {
- $error = PMA_Message::error(__('No index parts defined!'));
- } else {
- $sql_query .= ' (' . implode(', ', $index_fields) . ')';
- }
- if (PMA_MYSQL_INT_VERSION > 50500) {
- $sql_query .= "COMMENT '"
- . PMA_Util::sqlAddSlashes($index->getComment())
- . "'";
- }
- $sql_query .= ';';
- if (! $error) {
- PMA_DBI_query($sql_query);
- $message = PMA_Message::success(
- __('Table %1$s has been altered successfully')
- );
- $message->addParam($table);
- if ($GLOBALS['is_ajax_request'] == true) {
- $response = PMA_Response::getInstance();
- $response->addJSON('message', $message);
- $response->addJSON('index_table', PMA_Index::getView($table, $db));
- $response->addJSON(
- 'sql_query',
- PMA_Util::getMessage(null, $sql_query)
- );
- } else {
- $active_page = 'tbl_structure.php';
- include 'tbl_structure.php';
- }
- exit;
- } else {
- if ($GLOBALS['is_ajax_request'] == true) {
- $response = PMA_Response::getInstance();
- $response->isSuccess(false);
- $response->addJSON('message', $error);
- exit;
- } else {
- $error->display();
- }
- }
- } // end builds the new index
- /**
- * Display the form to edit/create an index
- */
- // Displays headers (if needed)
- $response = PMA_Response::getInstance();
- $header = $response->getHeader();
- $scripts = $header->getScripts();
- $scripts->addFile('indexes.js');
- require_once 'libraries/tbl_info.inc.php';
- if (isset($_REQUEST['index']) && is_array($_REQUEST['index'])) {
- // coming already from form
- $add_fields
- = count($_REQUEST['index']['columns']['names']) - $index->getColumnCount();
- if (isset($_REQUEST['add_fields'])) {
- $add_fields += $_REQUEST['added_fields'];
- }
- } elseif (isset($_REQUEST['create_index'])) {
- $add_fields = $_REQUEST['added_fields'];
- } else {
- $add_fields = 1;
- }
- // end preparing form values
- ?>
- <form action="tbl_indexes.php" method="post" name="index_frm" id="index_frm" class="ajax"
- onsubmit="if (typeof(this.elements['index[Key_name]'].disabled) != 'undefined') {
- this.elements['index[Key_name]'].disabled = false}">
- <?php
- $form_params = array(
- 'db' => $db,
- 'table' => $table,
- );
- if (isset($_REQUEST['create_index'])) {
- $form_params['create_index'] = 1;
- } elseif (isset($_REQUEST['old_index'])) {
- $form_params['old_index'] = $_REQUEST['old_index'];
- } elseif (isset($_REQUEST['index'])) {
- $form_params['old_index'] = $_REQUEST['index'];
- }
- echo PMA_generate_common_hidden_inputs($form_params);
- ?>
- <fieldset id="index_edit_fields">
- <?php
- if ($GLOBALS['is_ajax_request'] != true) {
- ?>
- <legend>
- <?php
- if (isset($_REQUEST['create_index'])) {
- echo __('Add index');
- } else {
- echo __('Edit index');
- }
- ?>
- </legend>
- <?php
- }
- ?>
- <div class='index_info'>
- <div>
- <div class="label">
- <strong>
- <label for="input_index_name">
- <?php echo __('Index name:'); ?>
- <?php
- echo PMA_Util::showHint(
- PMA_Message::notice(
- __(
- '("PRIMARY" <b>must</b> be the name of'
- . ' and <b>only of</b> a primary key!)'
- )
- )
- );
- ?>
- </label>
- </strong>
- </div>
- <input type="text" name="index[Key_name]" id="input_index_name" size="25"
- value="<?php echo htmlspecialchars($index->getName()); ?>"
- onfocus="this.select()" />
- </div>
- <?php
- if (PMA_MYSQL_INT_VERSION > 50500) {
- ?>
- <div>
- <div class="label">
- <strong>
- <label for="input_index_comment">
- <?php echo __('Comment:'); ?>
- </label>
- </strong>
- </div>
- <input type="text" name="index[Index_comment]" id="input_index_comment" size="30"
- value="<?php echo htmlspecialchars($index->getComment()); ?>"
- onfocus="this.select()" />
- </div>
- <?php
- }
- ?>
- <div>
- <div class="label">
- <strong>
- <label for="select_index_type">
- <?php echo __('Index type:'); ?>
- <?php echo PMA_Util::showMySQLDocu('SQL-Syntax', 'ALTER_TABLE'); ?>
- </label>
- </strong>
- </div>
- <select name="index[Index_type]" id="select_index_type" >
- <?php echo $index->generateIndexSelector(); ?>
- </select>
- </div>
- <div class="clearfloat"></div>
- </div>
- <table id="index_columns">
- <thead>
- <tr><th><?php echo __('Column'); ?></th>
- <th><?php echo __('Size'); ?></th>
- </tr>
- </thead>
- <tbody>
- <?php
- $odd_row = true;
- $spatial_types = array(
- 'geometry', 'point', 'linestring', 'polygon', 'multipoint',
- 'multilinestring', 'multipolygon', 'geomtrycollection'
- );
- foreach ($index->getColumns() as $column) {
- ?>
- <tr class="<?php echo $odd_row ? 'odd' : 'even'; ?> noclick">
- <td>
- <select name="index[columns][names][]">
- <option value="">-- <?php echo __('Ignore'); ?> --</option>
- <?php
- foreach ($fields as $field_name => $field_type) {
- if (($index->getType() != 'FULLTEXT'
- || preg_match('/(char|text)/i', $field_type))
- && ($index->getType() != 'SPATIAL'
- || in_array($field_type, $spatial_types))
- ) {
- echo '<option value="' . htmlspecialchars($field_name) . '"'
- . (($field_name == $column->getName())
- ? ' selected="selected"'
- : '') . '>'
- . htmlspecialchars($field_name) . ' ['
- . htmlspecialchars($field_type) . ']'
- . '</option>' . "\n";
- }
- } // end foreach $fields
- ?>
- </select>
- </td>
- <td>
- <input type="text" size="5" onfocus="this.select()"
- name="index[columns][sub_parts][]"
- value="<?php
- if ($index->getType() != 'SPATIAL') {
- echo $column->getSubPart();
- }
- ?>"/>
- </td>
- </tr>
- <?php
- $odd_row = !$odd_row;
- } // end foreach $edited_index_info['Sequences']
- for ($i = 0; $i < $add_fields; $i++) {
- ?>
- <tr class="<?php echo $odd_row ? 'odd' : 'even'; ?> noclick">
- <td>
- <select name="index[columns][names][]">
- <option value="">-- <?php echo __('Ignore'); ?> --</option>
- <?php
- foreach ($fields as $field_name => $field_type) {
- echo '<option value="' . htmlspecialchars($field_name) . '">'
- . htmlspecialchars($field_name) . ' ['
- . htmlspecialchars($field_type) . ']'
- . '</option>' . "\n";
- } // end foreach $fields
- ?>
- </select>
- </td>
- <td>
- <input type="text" size="5" onfocus="this.select()"
- name="index[columns][sub_parts][]" value="" />
- </td>
- </tr>
- <?php
- $odd_row = !$odd_row;
- } // end foreach $edited_index_info['Sequences']
- ?>
- </tbody>
- </table>
- </fieldset>
- <fieldset class="tblFooters">
- <?php
- if ($GLOBALS['is_ajax_request'] != true || ! empty($_REQUEST['ajax_page_request'])) {
- ?>
- <input type="submit" name="do_save_data" value="<?php echo __('Save'); ?>" />
- <span id="addMoreColumns">
- <?php
- echo __('Or') . ' ';
- printf(
- __('Add %s column(s) to index') . "\n",
- '<input type="text" name="added_fields" size="2" value="1" />'
- );
- echo '<input type="submit" name="add_fields" value="' . __('Go') . '" />' . "\n";
- ?>
- </span>
- <?php
- } else {
- $btn_value = sprintf(__('Add %s column(s) to index'), 1);
- echo '<div class="slider"></div>';
- echo '<div class="add_fields">';
- echo '<input type="submit" value="' . $btn_value . '" />';
- echo '</div>';
- }
- ?>
- </fieldset>
- </form>
|