diff --git a/ChangeLog b/ChangeLog index 3820e083b..e45f011a9 100755 --- a/ChangeLog +++ b/ChangeLog @@ -43,6 +43,10 @@ $Source$ strFailure. * lang/*: Remove unused messages. * sql.php: Use common code for superuser detection. + * tbl_addfield.php, tbl_alter.php, tbl_create.php, + libraries/common.lib.php, libraries/relation.lib.php: Use common code + for CREATE/ALTER TABLE, set comments on creating table, so that user can + see it in the query. 2005-10-07 Marc Delisle * libraries/check_user_privileges.lib.php: bug #1313821, dbname containing a diff --git a/libraries/common.lib.php b/libraries/common.lib.php index 69c1abc37..46116070a 100644 --- a/libraries/common.lib.php +++ b/libraries/common.lib.php @@ -2737,25 +2737,36 @@ if (typeof(document.getElementById) != 'undefined' } // end function - function PMA_generateAlterTable($oldcol, $newcol, $full_field_type, $collation, $null, $default, $default_current_timestamp, $extra, $comment='', $default_orig) { + function PMA_generateFieldSpec($name, $type, $length, $attribute, $collation, $null, $default, $default_current_timestamp, $extra, $comment='', &$field_primary, $index, $default_orig = FALSE) { // $default_current_timestamp has priority over $default // TODO: on the interface, some js to clear the default value // when the default current_timestamp is checked - $query = PMA_backquote($oldcol) . ' ' . PMA_backquote($newcol) . ' ' - . $full_field_type; - if (PMA_MYSQL_INT_VERSION >= 40100 && !empty($collation) && $collation != 'NULL' && preg_match('@^(TINYTEXT|TEXT|MEDIUMTEXT|LONGTEXT|VARCHAR\(\d+\)|CHAR\(\d+\))$@i', $full_field_type)) { + $query = PMA_backquote($name) . ' ' . $type; + + if ($length != '' + && !preg_match('@^(DATE|DATETIME|TIME|TINYBLOB|TINYTEXT|BLOB|TEXT|MEDIUMBLOB|MEDIUMTEXT|LONGBLOB|LONGTEXT)$@i', $type)) { + $query .= '(' . $length . ')'; + } + + if ($attribute != '') { + $query .= ' ' . $attribute; + } + + if (PMA_MYSQL_INT_VERSION >= 40100 && !empty($collation) && $collation != 'NULL' && preg_match('@^(TINYTEXT|TEXT|MEDIUMTEXT|LONGTEXT|VARCHAR|CHAR)$@i', $type)) { $query .= PMA_generateCharsetQueryPart($collation); } - if (!empty($null)) { - $query .= ' NOT NULL'; - } else { - $query .= ' NULL'; + if (!($null === FALSE)) { + if (!empty($null)) { + $query .= ' NOT NULL'; + } else { + $query .= ' NULL'; + } } - if ($default_current_timestamp && strpos(' ' . strtoupper($full_field_type),'TIMESTAMP') == 1) { + if ($default_current_timestamp && strpos(' ' . strtoupper($type),'TIMESTAMP') == 1) { $query .= ' DEFAULT CURRENT_TIMESTAMP'; // 0 is empty in PHP } elseif (!empty($default) || $default == '0' || $default != $default_orig) { @@ -2768,12 +2779,28 @@ if (typeof(document.getElementById) != 'undefined' if (!empty($extra)) { $query .= ' ' . $extra; + // An auto_increment field must be use as a primary key + if ($extra == 'AUTO_INCREMENT' && isset($field_primary)) { + $primary_cnt = count($field_primary); + for ($j = 0; $j < $primary_cnt && $field_primary[$j] != $index; $j++) { + // void + } // end for + if (isset($field_primary[$j]) && $field_primary[$j] == $index) { + $query .= ' PRIMARY KEY'; + unset($field_primary[$j]); + } // end if + } // end if (auto_increment) } if (PMA_MYSQL_INT_VERSION >= 40100 && !empty($comment)) { $query .= " COMMENT '" . PMA_sqlAddslashes($comment) . "'"; } return $query; } // end function + + function PMA_generateAlterTable($oldcol, $newcol, $type, $length, $attribute, $collation, $null, $default, $default_current_timestamp, $extra, $comment='', $default_orig) { + $empty_a = array(); + return PMA_backquote($oldcol) . ' ' . PMA_generateFieldSpec($newcol, $type, $length, $attribute, $collation, $null, $default, $default_current_timestamp, $extra, $comment, $empty_a, -1, $default_orig); + } // end function } // end if: minimal common.lib needed? diff --git a/libraries/relation.lib.php b/libraries/relation.lib.php index 7669cd707..2f03c9514 100644 --- a/libraries/relation.lib.php +++ b/libraries/relation.lib.php @@ -560,59 +560,8 @@ function PMA_setComment($db, $table, $col, $comment, $removekey = '', $mode='aut // native mode is only for column comments so we need a table name if ($mode == 'native' && !empty($table)) { - $fields = PMA_DBI_get_fields($db, $table); - - - // Get more complete field information - // For now, this is done just for MySQL 4.1.2+ new TIMESTAMP options - // but later, if the analyser returns more information, it - // could be executed for any MySQL version and replace - // the info given by SHOW FULL FIELDS FROM. - // TODO: put this code into a require() - // or maybe make it part of PMA_DBI_get_fields(); - - if (PMA_MYSQL_INT_VERSION >= 40102) { - $show_create_table_query = 'SHOW CREATE TABLE ' - . PMA_backquote($db) . '.' . PMA_backquote($table); - $show_create_table_res = PMA_DBI_query($show_create_table_query); - list(,$show_create_table) = PMA_DBI_fetch_row($show_create_table_res); - PMA_DBI_free_result($show_create_table_res); - unset($show_create_table_res, $show_create_table_query); - $analyzed_sql = PMA_SQP_analyze(PMA_SQP_parse($show_create_table)); - } - - // TODO: get directly the information of $col - foreach($fields as $key=>$field) { - $tmp_col = $field['Field']; - $types[$tmp_col] = $field['Type']; - $collations[$tmp_col] = $field['Collation']; - $nulls[$tmp_col] = $field['Null']; - $defaults[$tmp_col] = $field['Default']; - $extras[$tmp_col] = $field['Extra']; - - if (PMA_MYSQL_INT_VERSION >= 40102 && isset($analyzed_sql[0]['create_table_fields'][$tmp_col]['on_update_current_timestamp'])) { - $extras[$tmp_col] = 'ON UPDATE CURRENT_TIMESTAMP'; - } - - if (PMA_MYSQL_INT_VERSION >= 40102 && isset($analyzed_sql[0]['create_table_fields'][$tmp_col]['default_current_timestamp'])) { - $default_current_timestamps[$tmp_col] = TRUE; - } else { - $default_current_timestamps[$tmp_col] = FALSE; - } - - if ($tmp_col == $col) { - break; - } - } - if ($nulls[$col] == 'YES') { - $nulls[$col] = ''; - } else { - $nulls[$col] = 'NOT NULL'; - } - $query = 'ALTER TABLE ' . PMA_backquote($table) . ' CHANGE ' - . PMA_generateAlterTable($col, $col, $types[$col], $collations[$col], $nulls[$col], $defaults[$col], $default_current_timestamps[$col], $extras[$col], $comment, ''); - + . PMA_generateAlterTable($col, $col, '', '', '', '', FALSE, '', FALSE, '', $comment, '', ''); PMA_DBI_try_query($query, NULL, PMA_DBI_QUERY_STORE); return TRUE; } diff --git a/tbl_addfield.php b/tbl_addfield.php index 8c25a2831..b00c441e7 100644 --- a/tbl_addfield.php +++ b/tbl_addfield.php @@ -51,54 +51,13 @@ if (isset($submit_num_fields)) { } // end for // Builds the field creation statement and alters the table - // TODO: check to see if this logic is exactly the same - // as in tbl_create.php, and move to an include file - for ($i = 0; $i < $field_cnt; ++$i) { // '0' is also empty for php :-( if (empty($field_name[$i]) && $field_name[$i] != '0') { continue; } - $query .= PMA_backquote($field_name[$i]) . ' ' . $field_type[$i]; - if ($field_length[$i] != '' - && !preg_match('@^(DATE|DATETIME|TIME|TINYBLOB|TINYTEXT|BLOB|TEXT|MEDIUMBLOB|MEDIUMTEXT|LONGBLOB|LONGTEXT)$@i', $field_type[$i])) { - $query .= '(' . $field_length[$i] . ')'; - } - if ($field_attribute[$i] != '') { - $query .= ' ' . $field_attribute[$i]; - } else if (PMA_MYSQL_INT_VERSION >= 40100 && isset($field_collation[$i]) && $field_collation[$i] != '') { - list($tmp_charset) = explode('_', $field_collation[$i]); - $query .= ' CHARACTER SET ' . $tmp_charset . ' COLLATE ' . $field_collation[$i]; - unset($tmp_charset); - } - - if (isset($field_default_current_timestamp[$i]) && $field_default_current_timestamp[$i]) { - $query .= ' DEFAULT CURRENT_TIMESTAMP'; - } elseif ($field_default[$i] != '') { - if (strtoupper($field_default[$i]) == 'NULL') { - $query .= ' DEFAULT NULL'; - } else { - $query .= ' DEFAULT \'' . PMA_sqlAddslashes($field_default[$i]) . '\''; - } - } - if ($field_null[$i] != '') { - $query .= ' ' . $field_null[$i]; - } - if ($field_extra[$i] != '') { - $query .= ' ' . $field_extra[$i]; - // An auto_increment field must be use as a primary key - if ($field_extra[$i] == 'AUTO_INCREMENT' && isset($field_primary)) { - $primary_cnt = count($field_primary); - for ($j = 0; $j < $primary_cnt && $field_primary[$j] != $i; $j++) { - // void - } // end for - if ($field_primary[$j] == $i) { - $query .= ' PRIMARY KEY'; - unset($field_primary[$j]); - } // end if - } // end if (auto_increment) - } + $query .= PMA_generateFieldSpec($field_name[$i], $field_type[$i], $field_length[$i], $field_attribute[$i], $field_collation[$i], $field_null[$i], $field_default[$i], isset($field_default_current_timestamp[$i]), $field_extra[$i], isset($field_comments[$i]) ? $field_comments[$i] : '', $field_primary, $i); if ($field_where != 'last') { // Only the first field can be added somewhere other than at the end @@ -205,13 +164,9 @@ if (isset($submit_num_fields)) { $cfgRelation = PMA_getRelationsParam(); // garvin: Update comment table, if a comment was set. - // lem9: FIXME: here we take care of native comments and - // pmadb-style comments, however, in the case of - // native comments, users do not see the COMMENT clause - // when SQL query is displayed - if (isset($field_comments) && is_array($field_comments) && ($cfgRelation['commwork'] || PMA_MYSQL_INT_VERSION >= 40100)) { + if (isset($field_comments) && is_array($field_comments) && $cfgRelation['commwork'] && PMA_MYSQL_INT_VERSION < 40100) { foreach ($field_comments AS $fieldindex => $fieldcomment) { - PMA_setComment($db, $table, $field_name[$fieldindex], $fieldcomment); + PMA_setComment($db, $table, $field_name[$fieldindex], $fieldcomment, '', 'pmadb'); } } diff --git a/tbl_alter.php b/tbl_alter.php index f2bad5a4f..db5b6cc9a 100644 --- a/tbl_alter.php +++ b/tbl_alter.php @@ -57,17 +57,7 @@ if (isset($do_save_data)) { $query .= ', CHANGE '; } - $full_field_type = $field_type[$i]; - if ($field_length[$i] != '' - && !preg_match('@^(DATE|DATETIME|TIME|TINYBLOB|TINYTEXT|BLOB|TEXT|MEDIUMBLOB|MEDIUMTEXT|LONGBLOB|LONGTEXT)$@i', $field_type[$i])) { - $full_field_type .= '(' . $field_length[$i] . ')'; - } - if ($field_attribute[$i] != '') { - $full_field_type .= ' ' . $field_attribute[$i]; - } - // take care of native MySQL comments here - - $query .= PMA_generateAlterTable($field_orig[$i], $field_name[$i], $full_field_type, (PMA_MYSQL_INT_VERSION >= 40100 && $field_collation[$i] != '' ? $field_collation[$i] : ''), $field_null[$i], $field_default[$i], (isset($field_default_current_timestamp[$i]) ? $field_default_current_timestamp[$i] : ''), $field_extra[$i], (PMA_MYSQL_INT_VERSION >= 40100 && isset($field_comments[$i]) && $field_comments[$i] != '' ? $field_comments[$i] : ''), $field_default_orig[$i]); + $query .= PMA_generateAlterTable($field_orig[$i], $field_name[$i], $field_type[$i], $field_length[$i], $field_attribute[$i], $field_collation[$i], $field_null[$i], $field_default[$i], isset($field_default_current_timestamp[$i]), $field_extra[$i], (isset($field_comments[$i]) ? $field_comments[$i] : ''), $field_default_orig[$i]); } // end for // To allow replication, we first select the db to use and then run queries diff --git a/tbl_create.php b/tbl_create.php index 853fbf09e..4768f1ecd 100644 --- a/tbl_create.php +++ b/tbl_create.php @@ -62,34 +62,9 @@ if (isset($submit_num_fields)) { if (empty($field_name[$i]) && $field_name[$i] != '0') { continue; } - // TODO: maybe move this logic and the one of PMA_generateAlterTable() - // to a central place - $query = PMA_backquote($field_name[$i]) . ' ' . $field_type[$i]; - if ($field_length[$i] != '' - && !preg_match('@^(DATE|DATETIME|TIME|TINYBLOB|TINYTEXT|BLOB|TEXT|MEDIUMBLOB|MEDIUMTEXT|LONGBLOB|LONGTEXT)$@i', $field_type[$i])) { - $query .= '(' . $field_length[$i] . ')'; - } - if ($field_attribute[$i] != '') { - $query .= ' ' . $field_attribute[$i]; - } else if (PMA_MYSQL_INT_VERSION >= 40100 && !empty($field_collation[$i])) { - $query .= PMA_generateCharsetQueryPart($field_collation[$i]); - } - if (isset($field_default_current_timestamp[$i]) && $field_default_current_timestamp[$i]) { - $query .= ' DEFAULT CURRENT_TIMESTAMP'; - } elseif ($field_default[$i] != '') { - if (strtoupper($field_default[$i]) == 'NULL') { - $query .= ' DEFAULT NULL'; - } else { - $query .= ' DEFAULT \'' . PMA_sqlAddslashes($field_default[$i]) . '\''; - } - } - if ($field_null[$i] != '') { - $query .= ' ' . $field_null[$i]; - } - if ($field_extra[$i] != '') { - $query .= ' ' . $field_extra[$i]; - } + $query = PMA_generateFieldSpec($field_name[$i], $field_type[$i], $field_length[$i], $field_attribute[$i], $field_collation[$i], $field_null[$i], $field_default[$i], isset($field_default_current_timestamp[$i]), $field_extra[$i], isset($field_comments[$i]) ? $field_comments[$i] : '', $field_primary, $i); + $query .= ', '; $sql_query .= $query; $query_cpy .= "\n" . ' ' . $query; @@ -202,11 +177,11 @@ if (isset($submit_num_fields)) { $cfgRelation = PMA_getRelationsParam(); // garvin: Update comment table, if a comment was set. - if (isset($field_comments) && is_array($field_comments) && ($cfgRelation['commwork'] || PMA_MYSQL_INT_VERSION >= 40100)) { + if (isset($field_comments) && is_array($field_comments) && $cfgRelation['commwork'] && PMA_MYSQL_INT_VERSION < 40100) { foreach ($field_comments AS $fieldindex => $fieldcomment) { // do not try to set a comment if the field name is empty if (!empty($field_name[$fieldindex])) { - PMA_setComment($db, $table, $field_name[$fieldindex], $fieldcomment); + PMA_setComment($db, $table, $field_name[$fieldindex], $fieldcomment, '', 'pmadb'); } } }