Merge pull request #124 from Chanaka/master

Extend support for inline edit, for smallint fields
This commit is contained in:
Chanaka Indrajith 2012-12-28 07:21:21 -08:00
commit 5de29afc71
3 changed files with 108 additions and 4 deletions

View File

@ -378,10 +378,10 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
table_create_time: g.tableCreateTime
};
if (g.colOrder.length > 0) {
$.extend(post_params, { col_order: g.colOrder.toString() });
$.extend(post_params, {col_order: g.colOrder.toString()});
}
if (g.colVisib.length > 0) {
$.extend(post_params, { col_visib: g.colVisib.toString() });
$.extend(post_params, {col_visib: g.colVisib.toString()});
}
$.post('sql.php', post_params, function(data) {
if (data.success != true) {
@ -637,7 +637,9 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
$this_field.addClass('null');
} else {
$this_field.removeClass('null');
var new_html = $this_field.data('value');
var new_html = data.isTruncatableField
? data.truncatableFieldValue
: $this_field.data('value');
if ($this_field.is('.truncated')) {
if (new_html.length > g.maxTruncatedLen) {
new_html = new_html.substring(0, g.maxTruncatedLen) + '...';
@ -1227,6 +1229,32 @@ function PMA_makegrid(t, enableResize, enableReorder, enableVisib, enableGridEdi
}
if (data.success == true) {
PMA_ajaxShowMessage(data.message);
// Generate new where clause again if the column
// can be truncated by MySQL and table does not have
// primary/unique key
if (data.isTruncatableField && !data.hasUniqueIdentifier) {
var $toBeSavedColumn = $('.to_be_saved');
var condition_array = jQuery.parseJSON($toBeSavedColumn.parent().find('.condition_array').val());
var field_name = getFieldName($toBeSavedColumn);
var field_str = '`' + g.table + '`.' + '`' + field_name + '`';
condition_array[field_str] = ' =' + data.truncatableFieldValue;
// save new_clause
var new_clause = '';
for (var field in condition_array) {
new_clause += field + ' ' + condition_array[field] + ' AND ';
}
new_clause = new_clause.substring(0, new_clause.length - 5); // remove the last AND
new_clause = PMA_urlencode(new_clause);
$toBeSavedColumn.parent().data('new_clause', new_clause);
// save condition_array
$toBeSavedColumn.parent().find('.condition_array').val(JSON.stringify(condition_array));
}
// update where_clause related data in each edited row
$('td.to_be_saved').parents('tr').each(function() {
var new_clause = $(this).data('new_clause');

View File

@ -2329,4 +2329,69 @@ function PMA_getCurrentValueForDifferentTypes($possibly_uploaded_val, $key,
return $current_value;
}
/**
* Check whether particular table has primary key or unique key
*
* @param string $db Database name
* @param string $table Table name
*
* @return boolean
*/
function PMA_hasPrimaryKeyOrUniqueKey($db, $table) {
$table_indexes = PMA_DBI_get_table_indexes($db, $table);
foreach ($table_indexes as $index) {
if (($index['Key_name'] == 'PRIMARY') || ($index['Non_unique'] == '0')) {
return true;
}
}
return false;
}
/**
* Check whether inline edited value can be truncated or not,
* and add additional parameters for extra_data array if needed
*
* @param string $db Database name
* @param string $table Table name
* @param string $column_name Column name
* @param string $column_value Edited column value
* @param array $column_meta_data Column meta data
* @param array &$extra_data Extra data for ajax response
*/
function PMA_verifyWhetherValueCanBeTruncatedAndAppendExtraData(
$db, $table, $column_name, $column_value, $column_meta_data, &$extra_data
) {
if (stripos($column_meta_data['Type'], 'smallint') !== false) {
$extra_data['isTruncatableField'] = true;
$extra_data['hasUniqueIdentifier'] = PMA_hasPrimaryKeyOrUniqueKey($db, $table)
? true
: false;
// If table has unique identifier (primary/unique key), fetch the value
// of the field. (Yes, can be just round and return, but better need to
// retrieve the value really saved in the database when it is possible)
if ($extra_data['hasUniqueIdentifier']) {
$sql_for_real_value = 'SELECT '. PMA_Util::backquote($table) . '.' . PMA_Util::backquote($column_name)
. ' FROM ' . PMA_Util::backquote($db) . '.' . PMA_Util::backquote($table)
. ' WHERE ' . $_REQUEST['where_clause'][0];
$extra_data['truncatableFieldValue'] = (PMA_DBI_fetch_value($sql_for_real_value) !== false)
? PMA_DBI_fetch_value($sql_for_real_value)
: round($column_value);
} else {
$extra_data['truncatableFieldValue'] = round($column_value);
}
}
}
?>

View File

@ -345,7 +345,17 @@ if ($response->isAjax() && ! isset($_POST['ajax_page_request'])) {
}
} // end of loop for each $mime_map
}
// Need to check the inline edited value can be truncated by MySQL
// without informing while saving
$column_name = $_REQUEST['fields_name']['multi_edit'][0][0];
$column_value = $_REQUEST['fields']['multi_edit'][0][0];
$column_meta_data = PMA_DBI_get_columns($db, $table, $column_name);
PMA_verifyWhetherValueCanBeTruncatedAndAppendExtraData(
$db, $table, $column_name, $column_value, $column_meta_data, $extra_data
);
/**Get the total row count of the table*/
$extra_data['row_count'] = PMA_Table::countRecords(
$_REQUEST['db'], $_REQUEST['table']
@ -386,4 +396,5 @@ if (isset($_REQUEST['after_insert']) && 'new_insert' == $_REQUEST['after_insert'
*/
require '' . PMA_securePath($goto_include);
exit;
?>