Really support export of UPDATE queries (bug #914237), condition generation used from previous implementation in display_tbl.lib.php and moved to common.lib.php.
This commit is contained in:
@@ -8,6 +8,10 @@ $Source$
|
|||||||
2004-03-25 Michal Cihar <michal@cihar.com>
|
2004-03-25 Michal Cihar <michal@cihar.com>
|
||||||
* lang/czech: Updated.
|
* lang/czech: Updated.
|
||||||
* tbl_select.php: Fixed undefined variable warning.
|
* tbl_select.php: Fixed undefined variable warning.
|
||||||
|
* libraries/common.lib.php, libraries/display_tbl.lib.php,
|
||||||
|
libraries/export/sql.php: Really support export of UPDATE queries (bug
|
||||||
|
#914237), condition generation used from previous implementation in
|
||||||
|
display_tbl.lib.php and moved to common.lib.php.
|
||||||
|
|
||||||
2004-04-13 Marc Delisle <lem9@users.sourceforge.net>
|
2004-04-13 Marc Delisle <lem9@users.sourceforge.net>
|
||||||
* libraries/relation.lib.php: bug 930445 when PMA_table_info not defined,
|
* libraries/relation.lib.php: bug 930445 when PMA_table_info not defined,
|
||||||
|
@@ -557,10 +557,10 @@ if ($is_minimum_common == FALSE) {
|
|||||||
* Get the complete list of Databases a user can access
|
* Get the complete list of Databases a user can access
|
||||||
*
|
*
|
||||||
* @param boolean whether to include check on failed 'only_db' operations
|
* @param boolean whether to include check on failed 'only_db' operations
|
||||||
* @param ressource database handle (superuser)
|
* @param resource database handle (superuser)
|
||||||
* @param integer amount of databases inside the 'only_db' container
|
* @param integer amount of databases inside the 'only_db' container
|
||||||
* @param ressource possible ressource from a failed previous query
|
* @param resource possible resource from a failed previous query
|
||||||
* @param ressource database handle (user)
|
* @param resource database handle (user)
|
||||||
* @param array configuration
|
* @param array configuration
|
||||||
* @param array previous list of databases
|
* @param array previous list of databases
|
||||||
*
|
*
|
||||||
@@ -1896,6 +1896,7 @@ if (typeof(document.getElementById) != 'undefined'
|
|||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
* @author Michal Cihar (nijel@users.sourceforge.net)
|
* @author Michal Cihar (nijel@users.sourceforge.net)
|
||||||
|
* @return bool Whether extension is valid
|
||||||
*/
|
*/
|
||||||
function PMA_checkFileExtensions($file, $extension) {
|
function PMA_checkFileExtensions($file, $extension) {
|
||||||
if (substr($file, -1 * strlen($extension)) == $extension) {
|
if (substr($file, -1 * strlen($extension)) == $extension) {
|
||||||
@@ -1914,5 +1915,92 @@ if (typeof(document.getElementById) != 'undefined'
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
} // end function
|
} // end function
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function to generate unique condition for specified row.
|
||||||
|
*
|
||||||
|
* @param resource handle for current query
|
||||||
|
* @param integer number of fields
|
||||||
|
* @param array meta information about fields
|
||||||
|
* @param array current row
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @author Michal Cihar (michal@cihar.com)
|
||||||
|
* @return string calculated condition
|
||||||
|
*/
|
||||||
|
function PMA_getUvaCondition($handle, $fields_cnt, $fields_meta, $row) {
|
||||||
|
|
||||||
|
$primary_key = '';
|
||||||
|
$unique_key = '';
|
||||||
|
$uva_nonprimary_condition = '';
|
||||||
|
|
||||||
|
for ($i = 0; $i < $fields_cnt; ++$i) {
|
||||||
|
$field_flags = PMA_DBI_field_flags($handle, $i);
|
||||||
|
$meta = $fields_meta[$i];
|
||||||
|
// do not use an alias in a condition
|
||||||
|
$column_for_condition = $meta->name;
|
||||||
|
if (isset($analyzed_sql[0]['select_expr']) && is_array($analyzed_sql[0]['select_expr'])) {
|
||||||
|
foreach($analyzed_sql[0]['select_expr'] AS $select_expr_position => $select_expr) {
|
||||||
|
$alias = $analyzed_sql[0]['select_expr'][$select_expr_position]['alias'];
|
||||||
|
if (!empty($alias)) {
|
||||||
|
$true_column = $analyzed_sql[0]['select_expr'][$select_expr_position]['column'];
|
||||||
|
if ($alias == $meta->name) {
|
||||||
|
$column_for_condition = $true_column;
|
||||||
|
} // end if
|
||||||
|
} // end if
|
||||||
|
} // end while
|
||||||
|
}
|
||||||
|
|
||||||
|
// to fix the bug where float fields (primary or not)
|
||||||
|
// can't be matched because of the imprecision of
|
||||||
|
// floating comparison, use CONCAT
|
||||||
|
// (also, the syntax "CONCAT(field) IS NULL"
|
||||||
|
// that we need on the next "if" will work)
|
||||||
|
if ($meta->type == 'real') {
|
||||||
|
$condition = ' CONCAT(' . PMA_backquote($column_for_condition) . ') ';
|
||||||
|
} else {
|
||||||
|
// string and blob fields have to be converted using
|
||||||
|
// the system character set (always utf8) since
|
||||||
|
// mysql4.1 can use different charset for fields.
|
||||||
|
if (PMA_MYSQL_INT_VERSION >= 40100 && ($meta->type == 'string' || $meta->type == 'blob')) {
|
||||||
|
$condition = ' CONVERT(' . PMA_backquote($column_for_condition) . ' USING utf8) ';
|
||||||
|
} else {
|
||||||
|
$condition = ' ' . PMA_backquote($column_for_condition) . ' ';
|
||||||
|
}
|
||||||
|
} // end if... else...
|
||||||
|
|
||||||
|
if (!isset($row[$i]) || is_null($row[$i])) {
|
||||||
|
$condition .= 'IS NULL AND';
|
||||||
|
} else {
|
||||||
|
if ($meta->type == 'blob'
|
||||||
|
// hexify only if this is a true not empty BLOB
|
||||||
|
&& stristr($field_flags, 'BINARY')
|
||||||
|
&& !empty($row[$i])) {
|
||||||
|
$condition .= 'LIKE 0x' . bin2hex($row[$i]). ' AND';
|
||||||
|
} else {
|
||||||
|
$condition .= '= \'' . PMA_sqlAddslashes($row[$i], FALSE, TRUE) . '\' AND';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($meta->primary_key > 0) {
|
||||||
|
$primary_key .= $condition;
|
||||||
|
} else if ($meta->unique_key > 0) {
|
||||||
|
$unique_key .= $condition;
|
||||||
|
}
|
||||||
|
$uva_nonprimary_condition .= $condition;
|
||||||
|
} // end for
|
||||||
|
|
||||||
|
// Correction uva 19991216: prefer primary or unique keys
|
||||||
|
// for condition, but use conjunction of all values if no
|
||||||
|
// primary key
|
||||||
|
if ($primary_key) {
|
||||||
|
$uva_condition = $primary_key;
|
||||||
|
} else if ($unique_key) {
|
||||||
|
$uva_condition = $unique_key;
|
||||||
|
} else {
|
||||||
|
$uva_condition = $uva_nonprimary_condition;
|
||||||
|
}
|
||||||
|
|
||||||
|
return preg_replace('|\s?AND$|', '', $uva_condition);
|
||||||
|
} // end function
|
||||||
|
|
||||||
} // end if: minimal common.lib needed?
|
} // end if: minimal common.lib needed?
|
||||||
?>
|
?>
|
||||||
|
@@ -1026,88 +1026,10 @@ function PMA_displayTableBody(&$dt_result, &$is_display, $map, $analyzed_sql)
|
|||||||
|
|
||||||
// 1. Prepares the row (gets primary keys to use)
|
// 1. Prepares the row (gets primary keys to use)
|
||||||
if ($is_display['edit_lnk'] != 'nn' || $is_display['del_lnk'] != 'nn') {
|
if ($is_display['edit_lnk'] != 'nn' || $is_display['del_lnk'] != 'nn') {
|
||||||
$primary_key = '';
|
|
||||||
$unique_key = '';
|
|
||||||
$uva_nonprimary_condition = '';
|
|
||||||
|
|
||||||
// 1.1 Results from a "SELECT" statement -> builds the
|
// 1.1 Results from a "SELECT" statement -> builds the
|
||||||
// "primary" key to use in links
|
// "primary" key to use in links
|
||||||
if ($is_display['edit_lnk'] == 'ur' /* || $is_display['edit_lnk'] == 'dr' */) {
|
if ($is_display['edit_lnk'] == 'ur' /* || $is_display['edit_lnk'] == 'dr' */) {
|
||||||
for ($i = 0; $i < $fields_cnt; ++$i) {
|
$uva_condition = urlencode(PMA_getUvaCondition($dt_result, $fields_cnt, $fields_meta, $row));
|
||||||
$field_flags = PMA_DBI_field_flags($dt_result, $i);
|
|
||||||
$meta = $fields_meta[$i];
|
|
||||||
// do not use an alias in a condition
|
|
||||||
$column_for_condition = $meta->name;
|
|
||||||
if (isset($analyzed_sql[0]['select_expr']) && is_array($analyzed_sql[0]['select_expr'])) {
|
|
||||||
foreach($analyzed_sql[0]['select_expr'] AS $select_expr_position => $select_expr) {
|
|
||||||
$alias = $analyzed_sql[0]['select_expr'][$select_expr_position]['alias'];
|
|
||||||
if (!empty($alias)) {
|
|
||||||
$true_column = $analyzed_sql[0]['select_expr'][$select_expr_position]['column'];
|
|
||||||
if ($alias == $meta->name) {
|
|
||||||
$column_for_condition = $true_column;
|
|
||||||
} // end if
|
|
||||||
} // end if
|
|
||||||
} // end while
|
|
||||||
}
|
|
||||||
|
|
||||||
// to fix the bug where float fields (primary or not)
|
|
||||||
// can't be matched because of the imprecision of
|
|
||||||
// floating comparison, use CONCAT
|
|
||||||
// (also, the syntax "CONCAT(field) IS NULL"
|
|
||||||
// that we need on the next "if" will work)
|
|
||||||
if ($meta->type == 'real') {
|
|
||||||
$condition = ' CONCAT(' . PMA_backquote($column_for_condition) . ') ';
|
|
||||||
} else {
|
|
||||||
// string and blob fields have to be converted using
|
|
||||||
// the system character set (always utf8) since
|
|
||||||
// mysql4.1 can use different charset for fields.
|
|
||||||
if (PMA_MYSQL_INT_VERSION >= 40100 && ($meta->type == 'string' || $meta->type == 'blob')) {
|
|
||||||
$condition = ' CONVERT(' . PMA_backquote($column_for_condition) . ' USING utf8) ';
|
|
||||||
} else {
|
|
||||||
$condition = ' ' . PMA_backquote($column_for_condition) . ' ';
|
|
||||||
}
|
|
||||||
} // end if... else...
|
|
||||||
|
|
||||||
// loic1: To fix bug #474943 under php4, the row
|
|
||||||
// pointer will depend on whether the "is_null"
|
|
||||||
// php4 function is available or not
|
|
||||||
// ne0x: Not used anymore because PMA needs PHP > 4.1.0 where
|
|
||||||
// the "is_null" function is available.
|
|
||||||
//
|
|
||||||
// $pointer = (function_exists('is_null') ? $i : $meta->name);
|
|
||||||
|
|
||||||
if (!isset($row[$i]) || is_null($row[$i])) {
|
|
||||||
$condition .= 'IS NULL AND';
|
|
||||||
} else {
|
|
||||||
if ($meta->type == 'blob'
|
|
||||||
// hexify only if this is a true not empty BLOB
|
|
||||||
&& stristr($field_flags, 'BINARY')
|
|
||||||
&& !empty($row[$i])) {
|
|
||||||
$condition .= 'LIKE 0x' . bin2hex($row[$i]). ' AND';
|
|
||||||
} else {
|
|
||||||
$condition .= '= \'' . PMA_sqlAddslashes($row[$i], FALSE, TRUE) . '\' AND';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($meta->primary_key > 0) {
|
|
||||||
$primary_key .= $condition;
|
|
||||||
} else if ($meta->unique_key > 0) {
|
|
||||||
$unique_key .= $condition;
|
|
||||||
}
|
|
||||||
$uva_nonprimary_condition .= $condition;
|
|
||||||
} // end for
|
|
||||||
|
|
||||||
// Correction uva 19991216: prefer primary or unique keys
|
|
||||||
// for condition, but use conjunction of all values if no
|
|
||||||
// primary key
|
|
||||||
if ($primary_key) {
|
|
||||||
$uva_condition = $primary_key;
|
|
||||||
} else if ($unique_key) {
|
|
||||||
$uva_condition = $unique_key;
|
|
||||||
} else {
|
|
||||||
$uva_condition = $uva_nonprimary_condition;
|
|
||||||
}
|
|
||||||
|
|
||||||
$uva_condition = urlencode(preg_replace('|\s?AND$|', '', $uva_condition));
|
|
||||||
} // end if (1.1)
|
} // end if (1.1)
|
||||||
|
|
||||||
// 1.2 Defines the urls for the modify/delete link(s)
|
// 1.2 Defines the urls for the modify/delete link(s)
|
||||||
|
@@ -426,32 +426,17 @@ function PMA_exportData($db, $table, $crlf, $error_url, $sql_query)
|
|||||||
|
|
||||||
$result = PMA_DBI_query($sql_query, NULL, PMA_DBI_QUERY_UNBUFFERED);
|
$result = PMA_DBI_query($sql_query, NULL, PMA_DBI_QUERY_UNBUFFERED);
|
||||||
if ($result != FALSE) {
|
if ($result != FALSE) {
|
||||||
$fields_cnt = PMA_DBI_num_fields($result);
|
$fields_cnt = PMA_DBI_num_fields($result);
|
||||||
|
|
||||||
|
$fields_meta = PMA_DBI_get_fields_meta($result);
|
||||||
|
|
||||||
// Checks whether the field is an integer or not
|
|
||||||
for ($j = 0; $j < $fields_cnt; $j++) {
|
for ($j = 0; $j < $fields_cnt; $j++) {
|
||||||
|
|
||||||
if (isset($analyzed_sql[0]['select_expr'][$j]['column'])) {
|
if (isset($analyzed_sql[0]['select_expr'][$j]['column'])) {
|
||||||
$field_set[$j] = PMA_backquote($analyzed_sql[0]['select_expr'][$j]['column'], $use_backquotes);
|
$field_set[$j] = PMA_backquote($analyzed_sql[0]['select_expr'][$j]['column'], $use_backquotes);
|
||||||
} else {
|
} else {
|
||||||
$field_set[$j] = PMA_backquote(PMA_DBI_field_name($result, $j), $use_backquotes);
|
$field_set[$j] = PMA_backquote($fields_meta[$j]->name, $use_backquotes);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
$type = $field_types[$field_set[$j]];
|
|
||||||
|
|
||||||
if ($type == 'tinyint' || $type == 'smallint' || $type == 'mediumint' || $type == 'int' ||
|
|
||||||
$type == 'bigint' || (PMA_MYSQL_INT_VERSION < 40100 && $type == 'timestamp')) {
|
|
||||||
$field_num[$j] = TRUE;
|
|
||||||
} else {
|
|
||||||
$field_num[$j] = FALSE;
|
|
||||||
}
|
|
||||||
// blob
|
|
||||||
if ($type == 'blob' || $type == 'mediumblob' || $type == 'longblob' || $type == 'tinyblob') {
|
|
||||||
$field_blob[$j] = TRUE;
|
|
||||||
} else {
|
|
||||||
$field_blob[$j] = FALSE;
|
|
||||||
}
|
|
||||||
} // end for
|
|
||||||
|
|
||||||
if (isset($GLOBALS['sql_type']) && $GLOBALS['sql_type'] == 'update') {
|
if (isset($GLOBALS['sql_type']) && $GLOBALS['sql_type'] == 'update') {
|
||||||
// update
|
// update
|
||||||
@@ -459,7 +444,6 @@ function PMA_exportData($db, $table, $crlf, $error_url, $sql_query)
|
|||||||
if (isset($GLOBALS['sql_ignore']))
|
if (isset($GLOBALS['sql_ignore']))
|
||||||
$schema_insert .= 'IGNORE ';
|
$schema_insert .= 'IGNORE ';
|
||||||
$schema_insert .= PMA_backquote($table, $use_backquotes) . ' SET ';
|
$schema_insert .= PMA_backquote($table, $use_backquotes) . ' SET ';
|
||||||
$fields_no = count($field_set);
|
|
||||||
} else {
|
} else {
|
||||||
// insert or replace
|
// insert or replace
|
||||||
if (isset($GLOBALS['sql_type']) && $GLOBALS['sql_type'] == 'replace') {
|
if (isset($GLOBALS['sql_type']) && $GLOBALS['sql_type'] == 'replace') {
|
||||||
@@ -498,21 +482,25 @@ function PMA_exportData($db, $table, $crlf, $error_url, $sql_query)
|
|||||||
while ($row = PMA_DBI_fetch_row($result)) {
|
while ($row = PMA_DBI_fetch_row($result)) {
|
||||||
$current_row++;
|
$current_row++;
|
||||||
for ($j = 0; $j < $fields_cnt; $j++) {
|
for ($j = 0; $j < $fields_cnt; $j++) {
|
||||||
if (!isset($row[$j])) {
|
$field_flags = PMA_DBI_field_flags($result, $j);
|
||||||
|
if (!isset($row[$j]) || is_null($row[$j])) {
|
||||||
$values[] = 'NULL';
|
$values[] = 'NULL';
|
||||||
} else if ($row[$j] == '0' || $row[$j] != '') {
|
} else if ($row[$j] == '0' || $row[$j] != '') {
|
||||||
// a number
|
// a number
|
||||||
if ($field_num[$j]) {
|
if ($fields_meta[$j]->numeric) {
|
||||||
$values[] = $row[$j];
|
$values[] = $row[$j];
|
||||||
// a not empty blob
|
// a blob
|
||||||
} else if ($field_blob[$j] && !empty($row[$j])) {
|
} else if ($fields_meta[$j]->blob
|
||||||
|
// hexify only if this is a true not empty BLOB
|
||||||
|
&& stristr($field_flags, 'BINARY')
|
||||||
|
&& !empty($row[$j])) {
|
||||||
$values[] = '0x' . bin2hex($row[$j]);
|
$values[] = '0x' . bin2hex($row[$j]);
|
||||||
// a string
|
// a string
|
||||||
} else {
|
} else {
|
||||||
$values[] = "'" . str_replace($search, $replace, PMA_sqlAddslashes($row[$j])) . "'";
|
$values[] = '\'' . str_replace($search, $replace, PMA_sqlAddslashes($row[$j])) . '\'';
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$values[] = "''";
|
$values[] = '\'\'';
|
||||||
} // end if
|
} // end if
|
||||||
} // end for
|
} // end for
|
||||||
|
|
||||||
@@ -520,13 +508,15 @@ function PMA_exportData($db, $table, $crlf, $error_url, $sql_query)
|
|||||||
if (isset($GLOBALS['sql_type']) && $GLOBALS['sql_type'] == 'update') {
|
if (isset($GLOBALS['sql_type']) && $GLOBALS['sql_type'] == 'update') {
|
||||||
|
|
||||||
$insert_line = $schema_insert;
|
$insert_line = $schema_insert;
|
||||||
for ($i = 0; $i < $fields_no; $i++) {
|
for ($i = 0; $i < $fields_cnt; $i++) {
|
||||||
if ($i > 0) {
|
if ($i > 0) {
|
||||||
$insert_line .= ', ';
|
$insert_line .= ', ';
|
||||||
}
|
}
|
||||||
$insert_line .= $field_set[$i] . ' = ' . $values[$i];
|
$insert_line .= $field_set[$i] . ' = ' . $values[$i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$insert_line .= ' WHERE ' . PMA_getUvaCondition($result, $fields_cnt, $fields_meta, $row);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// Extended inserts case
|
// Extended inserts case
|
||||||
|
Reference in New Issue
Block a user