diff --git a/db_central_columns.php b/db_central_columns.php index cb97fc8b0a..d23aa1bcba 100644 --- a/db_central_columns.php +++ b/db_central_columns.php @@ -7,6 +7,7 @@ * @package PhpMyAdmin */ +use PhpMyAdmin\CentralColumns; use PhpMyAdmin\Core; use PhpMyAdmin\Url; use PhpMyAdmin\Response; @@ -15,7 +16,6 @@ use PhpMyAdmin\Response; * Gets some core libraries */ require_once 'libraries/common.inc.php'; -require_once 'libraries/central_columns.lib.php'; if (isset($_POST['edit_save']) || isset($_POST['add_new_column'])) { $col_name = $_POST['col_name']; @@ -33,13 +33,13 @@ if (isset($_POST['edit_save']) || isset($_POST['add_new_column'])) { $col_type = $_POST['col_type']; $collation = $_POST['collation']; if (isset($orig_col_name) && $orig_col_name) { - echo PMA_updateOneColumn( + echo CentralColumns::updateOneColumn( $db, $orig_col_name, $col_name, $col_type, $col_attribute, $col_length, $col_isNull, $collation, $col_extra, $col_default ); exit; } else { - $tmp_msg = PMA_updateOneColumn( + $tmp_msg = CentralColumns::updateOneColumn( $db, "", $col_name, $col_type, $col_attribute, $col_length, $col_isNull, $collation, $col_extra, $col_default ); @@ -47,18 +47,18 @@ if (isset($_POST['edit_save']) || isset($_POST['add_new_column'])) { } if (isset($_POST['populateColumns'])) { $selected_tbl = $_POST['selectedTable']; - echo PMA_getHTMLforColumnDropdown($db, $selected_tbl); + echo CentralColumns::getHtmlForColumnDropdown($db, $selected_tbl); exit; } if (isset($_POST['getColumnList'])) { - echo PMA_getCentralColumnsListRaw($db, $_POST['cur_table']); + echo CentralColumns::getListRaw($db, $_POST['cur_table']); exit; } if (isset($_POST['add_column'])) { $selected_col = array(); $selected_tbl = $_POST['table-select']; $selected_col[] = $_POST['column-select']; - $tmp_msg = PMA_syncUniqueColumns($selected_col, false, $selected_tbl); + $tmp_msg = CentralColumns::syncUniqueColumns($selected_col, false, $selected_tbl); } $response = Response::getInstance(); $header = $response->getHeader(); @@ -66,7 +66,7 @@ $scripts = $header->getScripts(); $scripts->addFile('vendor/jquery/jquery.uitablefilter.js'); $scripts->addFile('vendor/jquery/jquery.tablesorter.js'); $scripts->addFile('db_central_columns.js'); -$cfgCentralColumns = PMA_centralColumnsGetParams(); +$cfgCentralColumns = CentralColumns::getParams(); $pmadb = $cfgCentralColumns['db']; $pmatable = $cfgCentralColumns['table']; $max_rows = intval($GLOBALS['cfg']['MaxRows']); @@ -74,14 +74,14 @@ $max_rows = intval($GLOBALS['cfg']['MaxRows']); if (isset($_REQUEST['edit_central_columns_page'])) { $selected_fld = $_REQUEST['selected_fld']; $selected_db = $_REQUEST['db']; - $edit_central_column_page = PMA_getHTMLforEditingPage( + $edit_central_column_page = CentralColumns::getHtmlForEditingPage( $selected_fld, $selected_db ); $response->addHTML($edit_central_column_page); exit; } if (isset($_POST['multi_edit_central_column_save'])) { - $message = PMA_updateMultipleColumn(); + $message = CentralColumns::updateMultipleColumn(); if (!is_bool($message)) { $response->setRequestStatus(false); $response->addJSON('message', $message); @@ -90,19 +90,19 @@ if (isset($_POST['multi_edit_central_column_save'])) { if (isset($_POST['delete_save'])) { $col_name = array(); parse_str($_POST['col_name'], $col_name); - $tmp_msg = PMA_deleteColumnsFromList($col_name['selected_fld'], false); + $tmp_msg = CentralColumns::deleteColumnsFromList($col_name['selected_fld'], false); } if (isset($_REQUEST['total_rows']) && $_REQUEST['total_rows']) { $total_rows = $_REQUEST['total_rows']; } else { - $total_rows = PMA_getCentralColumnsCount($db); + $total_rows = CentralColumns::getCount($db); } if (Core::isValid($_REQUEST['pos'], 'integer')) { $pos = intval($_REQUEST['pos']); } else { $pos = 0; } -$addNewColumn = PMA_getHTMLforAddNewColumn($db, $total_rows); +$addNewColumn = CentralColumns::getHtmlForAddNewColumn($db, $total_rows); $response->addHTML($addNewColumn); if ($total_rows <= 0) { $response->addHTML( @@ -110,13 +110,13 @@ if ($total_rows <= 0) { 'The central list of columns for the current database is empty.' ) . '' ); - $columnAdd = PMA_getHTMLforAddCentralColumn($total_rows, $pos, $db); + $columnAdd = CentralColumns::getHtmlForAddCentralColumn($total_rows, $pos, $db); $response->addHTML($columnAdd); exit; } -$table_navigation_html = PMA_getHTMLforTableNavigation($total_rows, $pos, $db); +$table_navigation_html = CentralColumns::getHtmlForTableNavigation($total_rows, $pos, $db); $response->addHTML($table_navigation_html); -$columnAdd = PMA_getHTMLforAddCentralColumn($total_rows, $pos, $db); +$columnAdd = CentralColumns::getHtmlForAddCentralColumn($total_rows, $pos, $db); $response->addHTML($columnAdd); $deleteRowForm = '
' . Url::getHiddenInputs( @@ -131,21 +131,21 @@ $table_struct = '
' . ''; $response->addHTML($table_struct); -$tableheader = PMA_getCentralColumnsTableHeader( +$tableheader = CentralColumns::getTableHeader( 'column_heading', __('Click to sort.'), 2 ); $response->addHTML($tableheader); -$result = PMA_getColumnsList($db, $pos, $max_rows); +$result = CentralColumns::getColumnsList($db, $pos, $max_rows); $row_num = 0; foreach ($result as $row) { - $tableHtmlRow = PMA_getHTMLforCentralColumnsTableRow( + $tableHtmlRow = CentralColumns::getHtmlForCentralColumnsTableRow( $row, $row_num, $db ); $response->addHTML($tableHtmlRow); $row_num++; } $response->addHTML('
'); -$tablefooter = PMA_getCentralColumnsTableFooter($pmaThemeImage, $text_dir); +$tablefooter = CentralColumns::getTableFooter($pmaThemeImage, $text_dir); $response->addHTML($tablefooter); $response->addHTML('
'); $message = PhpMyAdmin\Message::success( diff --git a/libraries/central_columns.lib.php b/libraries/central_columns.lib.php deleted file mode 100644 index 344d2572cc..0000000000 --- a/libraries/central_columns.lib.php +++ /dev/null @@ -1,1408 +0,0 @@ - $GLOBALS['cfg']['Server']['user'], - 'db' => $cfgRelation['db'], - 'table' => $cfgRelation['central_columns'], - ); - } else { - $cfgCentralColumns = false; - } - - return $cfgCentralColumns; -} - -/** - * get $num columns of given database from central columns list - * starting at offset $from - * - * @param string $db selected database - * @param int $from starting offset of first result - * @param int $num maximum number of results to return - * - * @return array list of $num columns present in central columns list - * starting at offset $from for the given database - */ -function PMA_getColumnsList($db, $from=0, $num=25) -{ - $cfgCentralColumns = PMA_centralColumnsGetParams(); - if (empty($cfgCentralColumns)) { - return array(); - } - $pmadb = $cfgCentralColumns['db']; - $GLOBALS['dbi']->selectDb($pmadb, $GLOBALS['controllink']); - $central_list_table = $cfgCentralColumns['table']; - //get current values of $db from central column list - if ($num == 0) { - $query = 'SELECT * FROM ' . Util::backquote($central_list_table) . ' ' - . 'WHERE db_name = \'' . $GLOBALS['dbi']->escapeString($db) . '\';'; - } else { - $query = 'SELECT * FROM ' . Util::backquote($central_list_table) . ' ' - . 'WHERE db_name = \'' . $GLOBALS['dbi']->escapeString($db) . '\' ' - . 'LIMIT ' . $from . ', ' . $num . ';'; - } - $has_list = (array) $GLOBALS['dbi']->fetchResult( - $query, null, null, $GLOBALS['controllink'] - ); - PMA_handleColumnExtra($has_list); - return $has_list; -} - -/** - * get the number of columns present in central list for given db - * - * @param string $db current database - * - * @return int number of columns in central list of columns for $db - */ -function PMA_getCentralColumnsCount($db) -{ - $cfgCentralColumns = PMA_centralColumnsGetParams(); - if (empty($cfgCentralColumns)) { - return 0; - } - $pmadb = $cfgCentralColumns['db']; - $GLOBALS['dbi']->selectDb($pmadb, $GLOBALS['controllink']); - $central_list_table = $cfgCentralColumns['table']; - $query = 'SELECT count(db_name) FROM ' . - Util::backquote($central_list_table) . ' ' - . 'WHERE db_name = \'' . $GLOBALS['dbi']->escapeString($db) . '\';'; - $res = $GLOBALS['dbi']->fetchResult( - $query, null, null, $GLOBALS['controllink'] - ); - if (isset($res[0])) { - return $res[0]; - } else { - return 0; - } -} -/** - * return the existing columns in central list among the given list of columns - * - * @param string $db the selected database - * @param string $cols comma separated list of given columns - * @param boolean $allFields set if need all the fields of existing columns, - * otherwise only column_name is returned - * - * @return array list of columns in central columns among given set of columns - */ -function PMA_findExistingColNames($db, $cols, $allFields=false) -{ - $cfgCentralColumns = PMA_centralColumnsGetParams(); - if (empty($cfgCentralColumns)) { - return array(); - } - $pmadb = $cfgCentralColumns['db']; - $GLOBALS['dbi']->selectDb($pmadb, $GLOBALS['controllink']); - $central_list_table = $cfgCentralColumns['table']; - if ($allFields) { - $query = 'SELECT * FROM ' . Util::backquote($central_list_table) . ' ' - . 'WHERE db_name = \'' . $GLOBALS['dbi']->escapeString($db) . '\' AND col_name IN (' . $cols . ');'; - $has_list = (array) $GLOBALS['dbi']->fetchResult( - $query, null, null, $GLOBALS['controllink'] - ); - PMA_handleColumnExtra($has_list); - } else { - $query = 'SELECT col_name FROM ' - . Util::backquote($central_list_table) . ' ' - . 'WHERE db_name = \'' . $GLOBALS['dbi']->escapeString($db) . '\' AND col_name IN (' . $cols . ');'; - $has_list = (array) $GLOBALS['dbi']->fetchResult( - $query, null, null, $GLOBALS['controllink'] - ); - } - - return $has_list; -} - -/** - * return error message to be displayed if central columns - * configuration storage is not completely configured - * - * @return Message - */ -function PMA_configErrorMessage() -{ - return Message::error( - __( - 'The configuration storage is not ready for the central list' - . ' of columns feature.' - ) - ); -} - -/** - * build the insert query for central columns list given PMA storage - * db, central_columns table, column name and corresponding definition to be added - * - * @param string $column column to add into central list - * @param array $def list of attributes of the column being added - * @param string $db PMA configuration storage database name - * @param string $central_list_table central columns configuration storage table name - * - * @return string query string to insert the given column - * with definition into central list - */ -function PMA_getInsertQuery($column, $def, $db, $central_list_table) -{ - $type = ""; - $length = 0; - $attribute = ""; - if (isset($def['Type'])) { - $extracted_columnspec = Util::extractColumnSpec($def['Type']); - $attribute = trim($extracted_columnspec[ 'attribute']); - $type = $extracted_columnspec['type']; - $length = $extracted_columnspec['spec_in_brackets']; - } - if (isset($def['Attribute'])) { - $attribute = $def['Attribute']; - }; - $collation = isset($def['Collation'])?$def['Collation']:""; - $isNull = ($def['Null'] == "NO")?0:1; - $extra = isset($def['Extra'])?$def['Extra']:""; - $default = isset($def['Default'])?$def['Default']:""; - $insQuery = 'INSERT INTO ' - . Util::backquote($central_list_table) . ' ' - . 'VALUES ( \'' . $GLOBALS['dbi']->escapeString($db) . '\' ,' - . '\'' . $GLOBALS['dbi']->escapeString($column) . '\',\'' - . $GLOBALS['dbi']->escapeString($type) . '\',' - . '\'' . $GLOBALS['dbi']->escapeString($length) . '\',\'' - . $GLOBALS['dbi']->escapeString($collation) . '\',' - . '\'' . $GLOBALS['dbi']->escapeString($isNull) . '\',' - . '\'' . implode(',', array($extra, $attribute)) - . '\',\'' . $GLOBALS['dbi']->escapeString($default) . '\');'; - return $insQuery; -} - -/** - * If $isTable is true then unique columns from given tables as $field_select - * are added to central list otherwise the $field_select is considered as - * list of columns and these columns are added to central list if not already added - * - * @param array $field_select if $isTable is true selected tables list - * otherwise selected columns list - * @param bool $isTable if passed array is of tables or columns - * @param string $table if $isTable is false, - * then table name to which columns belong - * - * @return true|PhpMyAdmin\Message - */ -function PMA_syncUniqueColumns($field_select, $isTable=true, $table=null) -{ - $cfgCentralColumns = PMA_centralColumnsGetParams(); - if (empty($cfgCentralColumns)) { - return PMA_configErrorMessage(); - } - $db = $_REQUEST['db']; - $pmadb = $cfgCentralColumns['db']; - $central_list_table = $cfgCentralColumns['table']; - $GLOBALS['dbi']->selectDb($db, $GLOBALS['userlink']); - $existingCols = array(); - $cols = ""; - $insQuery = array(); - $fields = array(); - $message = true; - if ($isTable) { - foreach ($field_select as $table) { - $fields[$table] = (array) $GLOBALS['dbi']->getColumns( - $db, $table, null, true, $GLOBALS['userlink'] - ); - foreach ($fields[$table] as $field => $def) { - $cols .= "'" . $GLOBALS['dbi']->escapeString($field) . "',"; - } - } - - $has_list = PMA_findExistingColNames($db, trim($cols, ',')); - foreach ($field_select as $table) { - foreach ($fields[$table] as $field => $def) { - if (!in_array($field, $has_list)) { - $has_list[] = $field; - $insQuery[] = PMA_getInsertQuery( - $field, $def, $db, $central_list_table - ); - } else { - $existingCols[] = "'" . $field . "'"; - } - } - } - } else { - if ($table === null) { - $table = $_REQUEST['table']; - } - foreach ($field_select as $column) { - $cols .= "'" . $GLOBALS['dbi']->escapeString($column) . "',"; - } - $has_list = PMA_findExistingColNames($db, trim($cols, ',')); - foreach ($field_select as $column) { - if (!in_array($column, $has_list)) { - $has_list[] = $column; - $field = (array) $GLOBALS['dbi']->getColumns( - $db, $table, $column, - true, $GLOBALS['userlink'] - ); - $insQuery[] = PMA_getInsertQuery( - $column, $field, $db, $central_list_table - ); - } else { - $existingCols[] = "'" . $column . "'"; - } - } - } - if (! empty($existingCols)) { - $existingCols = implode(",", array_unique($existingCols)); - $message = Message::notice( - sprintf( - __( - 'Could not add %1$s as they already exist in central list!' - ), htmlspecialchars($existingCols) - ) - ); - $message->addMessage( - Message::notice( - "Please remove them first " - . "from central list if you want to update above columns" - ) - ); - } - $GLOBALS['dbi']->selectDb($pmadb, $GLOBALS['controllink']); - if (! empty($insQuery)) { - foreach ($insQuery as $query) { - if (!$GLOBALS['dbi']->tryQuery($query, $GLOBALS['controllink'])) { - $message = Message::error(__('Could not add columns!')); - $message->addMessage( - Message::rawError( - $GLOBALS['dbi']->getError($GLOBALS['controllink']) - ) - ); - break; - } - } - } - return $message; -} - -/** - * if $isTable is true it removes all columns of given tables as $field_select from - * central columns list otherwise $field_select is columns list and it removes - * given columns if present in central list - * - * @param array $field_select if $isTable selected list of tables otherwise - * selected list of columns to remove from central list - * @param bool $isTable if passed array is of tables or columns - * - * @return true|PhpMyAdmin\Message - */ -function PMA_deleteColumnsFromList($field_select, $isTable=true) -{ - $cfgCentralColumns = PMA_centralColumnsGetParams(); - if (empty($cfgCentralColumns)) { - return PMA_configErrorMessage(); - } - $db = $_REQUEST['db']; - $pmadb = $cfgCentralColumns['db']; - $central_list_table = $cfgCentralColumns['table']; - $GLOBALS['dbi']->selectDb($db, $GLOBALS['userlink']); - $message = true; - $colNotExist = array(); - $fields = array(); - if ($isTable) { - $cols = ''; - foreach ($field_select as $table) { - $fields[$table] = (array) $GLOBALS['dbi']->getColumnNames( - $db, $table, $GLOBALS['userlink'] - ); - foreach ($fields[$table] as $col_select) { - $cols .= '\'' . $GLOBALS['dbi']->escapeString($col_select) . '\','; - } - } - $cols = trim($cols, ','); - $has_list = PMA_findExistingColNames($db, $cols); - foreach ($field_select as $table) { - foreach ($fields[$table] as $column) { - if (!in_array($column, $has_list)) { - $colNotExist[] = "'" . $column . "'"; - } - } - } - - } else { - $cols = ''; - foreach ($field_select as $col_select) { - $cols .= '\'' . $GLOBALS['dbi']->escapeString($col_select) . '\','; - } - $cols = trim($cols, ','); - $has_list = PMA_findExistingColNames($db, $cols); - foreach ($field_select as $column) { - if (!in_array($column, $has_list)) { - $colNotExist[] = "'" . $column . "'"; - } - } - } - if (!empty($colNotExist)) { - $colNotExist = implode(",", array_unique($colNotExist)); - $message = Message::notice( - sprintf( - __( - 'Couldn\'t remove Column(s) %1$s ' - . 'as they don\'t exist in central columns list!' - ), htmlspecialchars($colNotExist) - ) - ); - } - $GLOBALS['dbi']->selectDb($pmadb, $GLOBALS['controllink']); - - $query = 'DELETE FROM ' . Util::backquote($central_list_table) . ' ' - . 'WHERE db_name = \'' . $GLOBALS['dbi']->escapeString($db) . '\' AND col_name IN (' . $cols . ');'; - - if (!$GLOBALS['dbi']->tryQuery($query, $GLOBALS['controllink'])) { - $message = Message::error(__('Could not remove columns!')); - $message->addHtml('
' . htmlspecialchars($cols) . '
'); - $message->addMessage( - Message::rawError( - $GLOBALS['dbi']->getError($GLOBALS['controllink']) - ) - ); - } - return $message; -} - -/** - * make the columns of given tables consistent with central list of columns. - * Updates only those columns which are not being referenced. - * - * @param string $db current database - * @param array $selected_tables list of selected tables. - * - * @return true|PhpMyAdmin\Message - */ -function PMA_makeConsistentWithList($db, $selected_tables) -{ - $message = true; - foreach ($selected_tables as $table) { - $query = 'ALTER TABLE ' . Util::backquote($table); - $has_list = PMA_getCentralColumnsFromTable($db, $table, true); - $GLOBALS['dbi']->selectDb($db, $GLOBALS['userlink']); - foreach ($has_list as $column) { - $column_status = Relation::checkChildForeignReferences( - $db, $table, $column['col_name'] - ); - //column definition can only be changed if - //it is not referenced by another column - if ($column_status['isEditable']) { - $query .= ' MODIFY ' . Util::backquote($column['col_name']) . ' ' - . $GLOBALS['dbi']->escapeString($column['col_type']); - if ($column['col_length']) { - $query .= '(' . $column['col_length'] . ')'; - } - - $query .= ' ' . $column['col_attribute']; - if ($column['col_isNull']) { - $query .= ' NULL'; - } else { - $query .= ' NOT NULL'; - } - - $query .= ' ' . $column['col_extra']; - if ($column['col_default']) { - if ($column['col_default'] != 'CURRENT_TIMESTAMP') { - $query .= ' DEFAULT \'' . $GLOBALS['dbi']->escapeString( - $column['col_default'] - ) . '\''; - } else { - $query .= ' DEFAULT ' . $GLOBALS['dbi']->escapeString( - $column['col_default'] - ); - } - } - $query .= ','; - } - } - $query = trim($query, " ,") . ";"; - if (!$GLOBALS['dbi']->tryQuery($query, $GLOBALS['userlink'])) { - if ($message === true) { - $message = Message::error( - $GLOBALS['dbi']->getError($GLOBALS['userlink']) - ); - } else { - $message->addText( - $GLOBALS['dbi']->getError($GLOBALS['userlink']), - '
' - ); - } - } - } - return $message; -} - -/** - * return the columns present in central list of columns for a given - * table of a given database - * - * @param string $db given database - * @param string $table given table - * @param boolean $allFields set if need all the fields of existing columns, - * otherwise only column_name is returned - * - * @return array columns present in central list from given table of given db. - */ -function PMA_getCentralColumnsFromTable($db, $table, $allFields=false) -{ - $cfgCentralColumns = PMA_centralColumnsGetParams(); - if (empty($cfgCentralColumns)) { - return array(); - } - $GLOBALS['dbi']->selectDb($db, $GLOBALS['userlink']); - $fields = (array) $GLOBALS['dbi']->getColumnNames( - $db, $table, $GLOBALS['userlink'] - ); - $cols = ''; - foreach ($fields as $col_select) { - $cols .= '\'' . $GLOBALS['dbi']->escapeString($col_select) . '\','; - } - $cols = trim($cols, ','); - $has_list = PMA_findExistingColNames($db, $cols, $allFields); - if (! empty($has_list)) { - return (array)$has_list; - } else { - return array(); - } -} - -/** - * update a column in central columns list if a edit is requested - * - * @param string $db current database - * @param string $orig_col_name original column name before edit - * @param string $col_name new column name - * @param string $col_type new column type - * @param string $col_attribute new column attribute - * @param string $col_length new column length - * @param int $col_isNull value 1 if new column isNull is true, 0 otherwise - * @param string $collation new column collation - * @param string $col_extra new column extra property - * @param string $col_default new column default value - * - * @return true|PhpMyAdmin\Message - */ -function PMA_updateOneColumn($db, $orig_col_name, $col_name, $col_type, - $col_attribute,$col_length, $col_isNull, $collation, $col_extra, $col_default -) { - $cfgCentralColumns = PMA_centralColumnsGetParams(); - if (empty($cfgCentralColumns)) { - return PMA_configErrorMessage(); - } - $centralTable = $cfgCentralColumns['table']; - $GLOBALS['dbi']->selectDb($cfgCentralColumns['db'], $GLOBALS['controllink']); - if ($orig_col_name == "") { - $def = array(); - $def['Type'] = $col_type; - if ($col_length) { - $def['Type'] .= '(' . $col_length . ')'; - } - $def['Collation'] = $collation; - $def['Null'] = $col_isNull?__('YES'):__('NO'); - $def['Extra'] = $col_extra; - $def['Attribute'] = $col_attribute; - $def['Default'] = $col_default; - $query = PMA_getInsertQuery($col_name, $def, $db, $centralTable); - } else { - $query = 'UPDATE ' . Util::backquote($centralTable) - . ' SET col_type = \'' . $GLOBALS['dbi']->escapeString($col_type) . '\'' - . ', col_name = \'' . $GLOBALS['dbi']->escapeString($col_name) . '\'' - . ', col_length = \'' . $GLOBALS['dbi']->escapeString($col_length) . '\'' - . ', col_isNull = ' . $col_isNull - . ', col_collation = \'' . $GLOBALS['dbi']->escapeString($collation) . '\'' - . ', col_extra = \'' - . implode(',', array($col_extra, $col_attribute)) . '\'' - . ', col_default = \'' . $GLOBALS['dbi']->escapeString($col_default) . '\'' - . ' WHERE db_name = \'' . $GLOBALS['dbi']->escapeString($db) . '\' ' - . 'AND col_name = \'' . $GLOBALS['dbi']->escapeString($orig_col_name) - . '\''; - } - if (!$GLOBALS['dbi']->tryQuery($query, $GLOBALS['controllink'])) { - return Message::error( - $GLOBALS['dbi']->getError($GLOBALS['controllink']) - ); - } - return true; -} - -/** - * Update Multiple column in central columns list if a chnage is requested - * - * @return true|PhpMyAdmin\Message - */ -function PMA_updateMultipleColumn() -{ - $db = $_POST['db']; - $col_name = $_POST['field_name']; - $orig_col_name = $_POST['orig_col_name']; - $col_default = $_POST['field_default_type']; - $col_length = $_POST['field_length']; - $col_attribute = $_POST['field_attribute']; - $col_type = $_POST['field_type']; - $collation = $_POST['field_collation']; - $col_isNull = array(); - $col_extra = array(); - $num_central_fields = count($orig_col_name); - for ($i = 0; $i < $num_central_fields ; $i++) { - $col_isNull[$i] = isset($_POST['field_null'][$i]) ? 1 : 0; - $col_extra[$i] = isset($_POST['col_extra'][$i]) - ? $_POST['col_extra'][$i] : ''; - - if ($col_default[$i] == 'NONE') { - $col_default[$i] = ""; - } else if ($col_default[$i] == 'USER_DEFINED') { - $col_default[$i] = $_POST['field_default_value'][$i]; - } - - $message = PMA_updateOneColumn( - $db, $orig_col_name[$i], $col_name[$i], $col_type[$i], - $col_attribute[$i], $col_length[$i], $col_isNull[$i], $collation[$i], - $col_extra[$i], $col_default[$i] - ); - if (!is_bool($message)) { - return $message; - } - } - return true; -} - -/** - * get the html for table navigation in Central columns page - * - * @param int $total_rows total number of rows in complete result set - * @param int $pos offset of first result with complete result set - * @param string $db current database - * - * @return string html for table navigation in Central columns page - */ -function PMA_getHTMLforTableNavigation($total_rows, $pos, $db) -{ - $max_rows = $GLOBALS['cfg']['MaxRows']; - $pageNow = ($pos / $max_rows) + 1; - $nbTotalPage = ceil($total_rows / $max_rows); - $table_navigation_html = '' - . '' - . ''; - if ($pos - $max_rows >= 0) { - $table_navigation_html .= ''; - } - if ($nbTotalPage > 1) { - $table_navigation_html .= ''; - } - if ($pos + $max_rows < $total_rows) { - $table_navigation_html .= ''; - } - $table_navigation_html .= '' - . '' - . '' - . '' - . '' - . '' - . '
' - . '
' - . Url::getHiddenInputs( - $db - ) - . '' - . '' - . '' - . '
' - . '
'; - $table_navigation_html .= '
' - . Url::getHiddenInputs( - $db - ) - . ''; - $table_navigation_html .= Util::pageselector( - 'pos', $max_rows, $pageNow, $nbTotalPage - ); - $table_navigation_html .= '
' - . '
' - . '
' - . Url::getHiddenInputs( - $db - ) - . '' - . '' - . '' - . '
' - . '
' - . '' . __('Filter rows') . ':' - . '' - . '
'; - - return $table_navigation_html; -} - -/** - * function generate and return the table header for central columns page - * - * @param string $class styling class of 'th' elements - * @param string $title title of the 'th' elements - * @param integer $actionCount number of actions - * - * @return string html for table header in central columns view/edit page - */ -function PMA_getCentralColumnsTableHeader($class='', $title='', $actionCount=0) -{ - $action = ''; - if ($actionCount > 0) { - $action .= '' - . __('Action') . ''; - } - $tableheader = ''; - $tableheader .= '' - . '' - . '' - . $action - . '' - . __('Name') . '
' - . '' - . __('Type') . '
' - . '' - . __('Length/Values') . '
' - . '' - . __('Default') . '
' - . '' . __('Collation') . '
' - . '' - . __('Attribute') . '
' - . '' - . __('Null') . '
' - . '' - . __('A_I') . '
' - . ''; - $tableheader .= ''; - return $tableheader; -} - -/** - * Function generate and return the table header for - * multiple edit central columns page - * - * @param array $header_cells headers list - * - * @return string html for table header in central columns multi edit page - */ -function PMA_getCentralColumnsEditTableHeader($header_cells) -{ - $html = ''; - $html .= ''; - foreach ($header_cells as $header_val) { - $html .= ''; - } - $html .= ''; - return $html; -} - -/** - * build the dropdown select html for tables of given database - * - * @param string $db current database - * - * @return string html dropdown for selecting table - */ -function PMA_getHTMLforTableDropdown($db) -{ - $GLOBALS['dbi']->selectDb($db, $GLOBALS['userlink']); - $tables = $GLOBALS['dbi']->getTables($db, $GLOBALS['userlink']); - $selectHtml = ''; - return $selectHtml; -} - -/** - * build dropdown select html to select column in selected table, - * include only columns which are not already in central list - * - * @param string $db current database to which selected table belongs - * @param string $selected_tbl selected table - * - * @return string html to select column - */ -function PMA_getHTMLforColumnDropdown($db, $selected_tbl) -{ - $existing_cols = PMA_getCentralColumnsFromTable($db, $selected_tbl); - $GLOBALS['dbi']->selectDb($db, $GLOBALS['userlink']); - $columns = (array) $GLOBALS['dbi']->getColumnNames( - $db, $selected_tbl, $GLOBALS['userlink'] - ); - $selectColHtml = ""; - foreach ($columns as $column) { - if (!in_array($column, $existing_cols)) { - $selectColHtml .= ''; - } - } - return $selectColHtml; -} - -/** - * html to display the form that let user to add a column on Central columns page - * - * @param int $total_rows total number of rows in complete result set - * @param int $pos offset of first result with complete result set - * @param string $db current database - * - * @return string html to add a column in the central list - */ -function PMA_getHTMLforAddCentralColumn($total_rows, $pos, $db) -{ - $columnAdd = '
' . __('Structure'); - $html .= '
' . $header_val . '
' - . '' - . '' - . '' - . '' - . '' - . '
' - . Util::getIcon( - 'centralColumns_add.png', - __('Add column') - ) - . '
' - . Url::getHiddenInputs( - $db - ) - . '' - . '' - . '' - . PMA_getHTMLforTableDropdown($db) - . '
' - . '
'; - - return $columnAdd; -} - -/** - * build html for a row in central columns table - * - * @param array $row array contains complete information of a particular row of central list table - * @param int $row_num position the row in the table - * @param string $db current database - * - * @return string html of a particular row in the central columns table. - */ -function PMA_getHTMLforCentralColumnsTableRow($row, $row_num, $db) -{ - $tableHtml = '' - . Url::getHiddenInputs( - $db - ) - . '' - . '' - . '' - . '' - . '' - . '' . Util::getIcon('b_edit.png', __('Edit')) . '' - . '' - . '' . Util::getIcon('b_drop.png', __('Delete')) . '' - . '' - . '' - . ''; - - $tableHtml .= - '' - . '' . htmlspecialchars($row['col_name']) . '' - . '' - . PhpMyAdmin\Template::get('columns_definitions/column_name') - ->render( - array( - 'columnNumber' => $row_num, - 'ci' => 0, - 'ci_offset' => 0, - 'columnMeta' => array( - 'Field'=>$row['col_name'] - ), - 'cfgRelation' => array( - 'centralcolumnswork' => false - ) - ) - ) - . ''; - $tableHtml .= - '' - . htmlspecialchars($row['col_type']) . '' - . PhpMyAdmin\Template::get('columns_definitions/column_type') - ->render( - array( - 'column_number' => $row_num, - 'ci' => 1, - 'ci_offset' => 0, - 'type_upper' => mb_strtoupper($row['col_type']), - 'column_meta' => array() - ) - ) - . ''; - $tableHtml .= - '' - . '' . ($row['col_length']?htmlspecialchars($row['col_length']):"") - . '' - . PhpMyAdmin\Template::get('columns_definitions/column_length')->render( - array( - 'column_number' => $row_num, - 'ci' => 2, - 'ci_offset' => 0, - 'length_values_input_size' => 8, - 'length_to_display' => $row['col_length'] - ) - ) - . ''; - - $meta = array(); - if (!isset($row['col_default']) || $row['col_default'] == '') { - $meta['DefaultType'] = 'NONE'; - } else { - if ($row['col_default'] == 'CURRENT_TIMESTAMP' - || $row['col_default'] == 'NULL' - ) { - $meta['DefaultType'] = $row['col_default']; - } else { - $meta['DefaultType'] = 'USER_DEFINED'; - $meta['DefaultValue'] = $row['col_default']; - } - } - $tableHtml .= - '' . (isset($row['col_default']) - ? htmlspecialchars($row['col_default']) : 'None') - . '' - . PhpMyAdmin\Template::get('columns_definitions/column_default') - ->render( - array( - 'columnNumber' => $row_num, - 'ci' => 3, - 'ci_offset' => 0, - 'type_upper' => mb_strtoupper($row['col_type']), - 'columnMeta' => $meta - ) - ) - . ''; - - $tableHtml .= - '' - . '' . htmlspecialchars($row['col_collation']) . '' - . Charsets::getCollationDropdownBox( - 'field_collation[' . $row_num . ']', - 'field_' . $row_num . '_4', $row['col_collation'], false - ) - . ''; - $tableHtml .= - '' - . '' . - ($row['col_attribute'] - ? htmlspecialchars($row['col_attribute']) : "" ) - . '' - . PhpMyAdmin\Template::get('columns_definitions/column_attribute') - ->render( - array( - 'columnNumber' => $row_num, - 'ci' => 5, - 'ci_offset' => 0, - 'extracted_columnspec' => array(), - 'columnMeta' => $row['col_attribute'], - 'submit_attribute' => false, - ) - ) - . ''; - $tableHtml .= - '' - . '' . ($row['col_isNull'] ? __('Yes') : __('No')) - . '' - . PhpMyAdmin\Template::get('columns_definitions/column_null') - ->render( - array( - 'column_number' => $row_num, - 'ci' => 6, - 'ci_offset' => 0, - 'column_meta' => array( - 'Null' => $row['col_isNull'] - ) - ) - ) - . ''; - - $tableHtml .= - '' - . htmlspecialchars($row['col_extra']) . '' - . PhpMyAdmin\Template::get('columns_definitions/column_extra')->render( - array( - 'column_number' => $row_num, - 'ci' => 7, - 'ci_offset' => 0, - 'column_meta' => array('Extra'=>$row['col_extra']) - ) - ) - . ''; - - $tableHtml .= ''; - - return $tableHtml; -} - -/** - * build html for editing a row in central columns table - * - * @param array $row array contains complete information of a particular row of central list table - * @param int $row_num position the row in the table - * - * @return string html of a particular row in the central columns table. - */ -function PMA_getHTMLforCentralColumnsEditTableRow($row, $row_num) -{ - $tableHtml = '' - . '' - . '' - . PhpMyAdmin\Template::get('columns_definitions/column_name') - ->render( - array( - 'columnNumber' => $row_num, - 'ci' => 0, - 'ci_offset' => 0, - 'columnMeta' => array( - 'Field' => $row['col_name'] - ), - 'cfgRelation' => array( - 'centralcolumnswork' => false - ) - ) - ) - . ''; - $tableHtml .= - '' - . PhpMyAdmin\Template::get('columns_definitions/column_type') - ->render( - array( - 'column_number' => $row_num, - 'ci' => 1, - 'ci_offset' => 0, - 'type_upper' => mb_strtoupper($row['col_type']), - 'column_meta' => array() - ) - ) - . ''; - $tableHtml .= - '' - . PhpMyAdmin\Template::get('columns_definitions/column_length')->render( - array( - 'column_number' => $row_num, - 'ci' => 2, - 'ci_offset' => 0, - 'length_values_input_size' => 8, - 'length_to_display' => $row['col_length'] - ) - ) - . ''; - $meta = array(); - if (!isset($row['col_default']) || $row['col_default'] == '') { - $meta['DefaultType'] = 'NONE'; - } else { - if ($row['col_default'] == 'CURRENT_TIMESTAMP' - || $row['col_default'] == 'NULL' - ) { - $meta['DefaultType'] = $row['col_default']; - } else { - $meta['DefaultType'] = 'USER_DEFINED'; - $meta['DefaultValue'] = $row['col_default']; - } - } - $tableHtml .= - '' - . PhpMyAdmin\Template::get('columns_definitions/column_default') - ->render( - array( - 'columnNumber' => $row_num, - 'ci' => 3, - 'ci_offset' => 0, - 'type_upper' => mb_strtoupper($row['col_default']), - 'columnMeta' => $meta - ) - ) - . ''; - $tableHtml .= - '' - . Charsets::getCollationDropdownBox( - 'field_collation[' . $row_num . ']', - 'field_' . $row_num . '_4', $row['col_collation'], false - ) - . ''; - $tableHtml .= - '' - . PhpMyAdmin\Template::get('columns_definitions/column_attribute') - ->render( - array( - 'columnNumber' => $row_num, - 'ci' => 5, - 'ci_offset' => 0, - 'extracted_columnspec' => array( - 'attribute' => $row['col_attribute'] - ), - 'columnMeta' => array(), - 'submit_attribute' => false, - ) - ) - . ''; - $tableHtml .= - '' - . PhpMyAdmin\Template::get('columns_definitions/column_null') - ->render( - array( - 'column_number' => $row_num, - 'ci' => 6, - 'ci_offset' => 0, - 'column_meta' => array( - 'Null' => $row['col_isNull'] - ) - ) - ) - . ''; - - $tableHtml .= - '' - . PhpMyAdmin\Template::get('columns_definitions/column_extra')->render( - array( - 'column_number' => $row_num, - 'ci' => 7, - 'ci_offset' => 0, - 'column_meta' => array('Extra' => $row['col_extra']) - ) - ) - . ''; - $tableHtml .= ''; - return $tableHtml; -} - -/** - * get the list of columns in given database excluding - * the columns present in current table - * - * @param string $db selected database - * @param string $table current table name - * - * @return string encoded list of columns present in central list for the given - * database - */ -function PMA_getCentralColumnsListRaw($db, $table) -{ - $cfgCentralColumns = PMA_centralColumnsGetParams(); - if (empty($cfgCentralColumns)) { - return json_encode(array()); - } - $centralTable = $cfgCentralColumns['table']; - if (empty($table) || $table == '') { - $query = 'SELECT * FROM ' . Util::backquote($centralTable) . ' ' - . 'WHERE db_name = \'' . $GLOBALS['dbi']->escapeString($db) . '\';'; - } else { - $GLOBALS['dbi']->selectDb($db, $GLOBALS['userlink']); - $columns = (array) $GLOBALS['dbi']->getColumnNames( - $db, $table, $GLOBALS['userlink'] - ); - $cols = ''; - foreach ($columns as $col_select) { - $cols .= '\'' . $GLOBALS['dbi']->escapeString($col_select) . '\','; - } - $cols = trim($cols, ','); - $query = 'SELECT * FROM ' . Util::backquote($centralTable) . ' ' - . 'WHERE db_name = \'' . $GLOBALS['dbi']->escapeString($db) . '\''; - if ($cols) { - $query .= ' AND col_name NOT IN (' . $cols . ')'; - } - $query .= ';'; - } - $GLOBALS['dbi']->selectDb($cfgCentralColumns['db'], $GLOBALS['controllink']); - $columns_list = (array)$GLOBALS['dbi']->fetchResult( - $query, null, null, $GLOBALS['controllink'] - ); - PMA_handleColumnExtra($columns_list); - return json_encode($columns_list); -} - -/** - * Get HTML for "check all" check box with "with selected" dropdown - * - * @param string $pmaThemeImage pma theme image url - * @param string $text_dir url for text directory - * - * @return string $html_output - */ -function PMA_getCentralColumnsTableFooter($pmaThemeImage, $text_dir) -{ - $html_output = PhpMyAdmin\Template::get('select_all') - ->render( - array( - 'pma_theme_image' => $pmaThemeImage, - 'text_dir' => $text_dir, - 'form_name' => 'tableslistcontainer', - ) - ); - $html_output .= Util::getButtonOrImage( - 'edit_central_columns', 'mult_submit change_central_columns', - __('Edit'), 'b_edit.png', 'edit central columns' - ); - $html_output .= Util::getButtonOrImage( - 'delete_central_columns', 'mult_submit', - __('Delete'), 'b_drop.png', - 'remove_from_central_columns' - ); - return $html_output; -} - -/** - * function generate and return the table footer for - * multiple edit central columns page - * - * @return string html for table footer in central columns multi edit page - */ -function PMA_getCentralColumnsEditTableFooter() -{ - $html_output = '
' - . '' - . '
'; - return $html_output; -} -/** - * Column `col_extra` is used to store both extra and attributes for a column. - * This method separates them. - * - * @param array &$columns_list columns list - * - * @return void - */ -function PMA_handleColumnExtra(&$columns_list) -{ - foreach ($columns_list as &$row) { - $vals = explode(',', $row['col_extra']); - - if (in_array('BINARY', $vals)) { - $row['col_attribute'] = 'BINARY'; - } elseif (in_array('UNSIGNED', $vals)) { - $row['col_attribute'] = 'UNSIGNED'; - } elseif (in_array('UNSIGNED ZEROFILL', $vals)) { - $row['col_attribute'] = 'UNSIGNED ZEROFILL'; - } elseif (in_array('on update CURRENT_TIMESTAMP', $vals)) { - $row['col_attribute'] = 'on update CURRENT_TIMESTAMP'; - } else { - $row['col_attribute'] = ''; - } - - if (in_array('auto_increment', $vals)) { - $row['col_extra'] = 'auto_increment'; - } else { - $row['col_extra'] = ''; - } - } -} - -/** - * build html for adding a new user defined column to central list - * - * @param string $db current database - * @param integer $total_rows number of rows in central columns - * - * @return string html of the form to let user add a new user defined column to the - * list - */ -function PMA_getHTMLforAddNewColumn($db, $total_rows) -{ - $addNewColumn = '
' - . '+ ' . __('Add new column') . '' - . '
' - . Url::getHiddenInputs( - $db - ) - . '' - . '
' - . ''; - $addNewColumn .= PMA_getCentralColumnsTableHeader(); - $addNewColumn .= '' - . '' - . '' - . '' - . '' - . '' - . '' - . '' - . '' - . '' - . ' ' - . ''; - $addNewColumn .= '
' - . PhpMyAdmin\Template::get('columns_definitions/column_name') - ->render( - array( - 'columnNumber' => 0, - 'ci' => 0, - 'ci_offset' => 0, - 'columnMeta' => array(), - 'cfgRelation' => array( - 'centralcolumnswork' => false - ) - ) - ) - . '' - . PhpMyAdmin\Template::get('columns_definitions/column_type') - ->render( - array( - 'column_number' => 0, - 'ci' => 1, - 'ci_offset' => 0, - 'type_upper' => '', - 'column_meta' => array() - ) - ) - . '' - . PhpMyAdmin\Template::get('columns_definitions/column_length')->render( - array( - 'column_number' => 0, - 'ci' => 2, - 'ci_offset' => 0, - 'length_values_input_size' => 8, - 'length_to_display' => '' - ) - ) - . '' - . PhpMyAdmin\Template::get('columns_definitions/column_default') - ->render( - array( - 'columnNumber' => 0, - 'ci' => 3, - 'ci_offset' => 0, - 'type_upper' => '', - 'columnMeta' => array() - ) - ) - . '' - . Charsets::getCollationDropdownBox( - 'field_collation[0]', - 'field_0_4', null, false - ) - . '' - . PhpMyAdmin\Template::get('columns_definitions/column_attribute') - ->render( - array( - 'columnNumber' => 0, - 'ci' => 5, - 'ci_offset' => 0, - 'extracted_columnspec' => array(), - 'columnMeta' => array(), - 'submit_attribute' => false, - ) - ) - . '' - . PhpMyAdmin\Template::get('columns_definitions/column_null') - ->render( - array( - 'column_number' => 0, - 'ci' => 6, - 'ci_offset' => 0, - 'column_meta' => array() - ) - ) - . '' - . PhpMyAdmin\Template::get('columns_definitions/column_extra')->render( - array( - 'column_number' => 0, - 'ci' => 7, - 'ci_offset' => 0, - 'column_meta' => array() - ) - ) - . '' - . '
'; - return $addNewColumn; -} - -/** - * Get HTML for editing page central columns - * - * @param array $selected_fld Array containing the selected fields - * @param string $selected_db String containing the name of database - * - * @return string HTML for complete editing page for central columns - */ -function PMA_getHTMLforEditingPage($selected_fld,$selected_db) -{ - $html = '
'; - $header_cells = array( - __('Name'), __('Type'), __('Length/Values'), __('Default'), - __('Collation'), __('Attributes'), __('Null'), __('A_I') - ); - $html .= PMA_getCentralColumnsEditTableHeader($header_cells); - $selected_fld_safe = array(); - foreach ($selected_fld as $key) { - $selected_fld_safe[] = $GLOBALS['dbi']->escapeString($key); - } - $columns_list = implode("','", $selected_fld_safe); - $columns_list = "'" . $columns_list . "'"; - $list_detail_cols = PMA_findExistingColNames($selected_db, $columns_list, true); - $row_num = 0; - foreach ($list_detail_cols as $row) { - $tableHtmlRow = PMA_getHTMLforCentralColumnsEditTableRow( - $row, $row_num - ); - $html .= $tableHtmlRow; - $row_num++; - } - $html .= ''; - $html .= PMA_getCentralColumnsEditTableFooter(); - $html .= '
'; - return $html; -} diff --git a/libraries/classes/CentralColumns.php b/libraries/classes/CentralColumns.php new file mode 100644 index 0000000000..23e201ef1f --- /dev/null +++ b/libraries/classes/CentralColumns.php @@ -0,0 +1,1420 @@ + $GLOBALS['cfg']['Server']['user'], + 'db' => $cfgRelation['db'], + 'table' => $cfgRelation['central_columns'], + ); + } else { + $cfgCentralColumns = false; + } + + return $cfgCentralColumns; + } + + /** + * get $num columns of given database from central columns list + * starting at offset $from + * + * @param string $db selected database + * @param int $from starting offset of first result + * @param int $num maximum number of results to return + * + * @return array list of $num columns present in central columns list + * starting at offset $from for the given database + */ + public static function getColumnsList($db, $from=0, $num=25) + { + $cfgCentralColumns = self::getParams(); + if (empty($cfgCentralColumns)) { + return array(); + } + $pmadb = $cfgCentralColumns['db']; + $GLOBALS['dbi']->selectDb($pmadb, $GLOBALS['controllink']); + $central_list_table = $cfgCentralColumns['table']; + //get current values of $db from central column list + if ($num == 0) { + $query = 'SELECT * FROM ' . Util::backquote($central_list_table) . ' ' + . 'WHERE db_name = \'' . $GLOBALS['dbi']->escapeString($db) . '\';'; + } else { + $query = 'SELECT * FROM ' . Util::backquote($central_list_table) . ' ' + . 'WHERE db_name = \'' . $GLOBALS['dbi']->escapeString($db) . '\' ' + . 'LIMIT ' . $from . ', ' . $num . ';'; + } + $has_list = (array) $GLOBALS['dbi']->fetchResult( + $query, null, null, $GLOBALS['controllink'] + ); + self::handleColumnExtra($has_list); + return $has_list; + } + + /** + * get the number of columns present in central list for given db + * + * @param string $db current database + * + * @return int number of columns in central list of columns for $db + */ + public static function getCount($db) + { + $cfgCentralColumns = self::getParams(); + if (empty($cfgCentralColumns)) { + return 0; + } + $pmadb = $cfgCentralColumns['db']; + $GLOBALS['dbi']->selectDb($pmadb, $GLOBALS['controllink']); + $central_list_table = $cfgCentralColumns['table']; + $query = 'SELECT count(db_name) FROM ' . + Util::backquote($central_list_table) . ' ' + . 'WHERE db_name = \'' . $GLOBALS['dbi']->escapeString($db) . '\';'; + $res = $GLOBALS['dbi']->fetchResult( + $query, null, null, $GLOBALS['controllink'] + ); + if (isset($res[0])) { + return $res[0]; + } else { + return 0; + } + } + /** + * return the existing columns in central list among the given list of columns + * + * @param string $db the selected database + * @param string $cols comma separated list of given columns + * @param boolean $allFields set if need all the fields of existing columns, + * otherwise only column_name is returned + * + * @return array list of columns in central columns among given set of columns + */ + public static function findExistingColNames($db, $cols, $allFields=false) + { + $cfgCentralColumns = self::getParams(); + if (empty($cfgCentralColumns)) { + return array(); + } + $pmadb = $cfgCentralColumns['db']; + $GLOBALS['dbi']->selectDb($pmadb, $GLOBALS['controllink']); + $central_list_table = $cfgCentralColumns['table']; + if ($allFields) { + $query = 'SELECT * FROM ' . Util::backquote($central_list_table) . ' ' + . 'WHERE db_name = \'' . $GLOBALS['dbi']->escapeString($db) . '\' AND col_name IN (' . $cols . ');'; + $has_list = (array) $GLOBALS['dbi']->fetchResult( + $query, null, null, $GLOBALS['controllink'] + ); + self::handleColumnExtra($has_list); + } else { + $query = 'SELECT col_name FROM ' + . Util::backquote($central_list_table) . ' ' + . 'WHERE db_name = \'' . $GLOBALS['dbi']->escapeString($db) . '\' AND col_name IN (' . $cols . ');'; + $has_list = (array) $GLOBALS['dbi']->fetchResult( + $query, null, null, $GLOBALS['controllink'] + ); + } + + return $has_list; + } + + /** + * return error message to be displayed if central columns + * configuration storage is not completely configured + * + * @return Message + */ + public static function configErrorMessage() + { + return Message::error( + __( + 'The configuration storage is not ready for the central list' + . ' of columns feature.' + ) + ); + } + + /** + * build the insert query for central columns list given PMA storage + * db, central_columns table, column name and corresponding definition to be added + * + * @param string $column column to add into central list + * @param array $def list of attributes of the column being added + * @param string $db PMA configuration storage database name + * @param string $central_list_table central columns configuration storage table name + * + * @return string query string to insert the given column + * with definition into central list + */ + public static function getInsertQuery($column, $def, $db, $central_list_table) + { + $type = ""; + $length = 0; + $attribute = ""; + if (isset($def['Type'])) { + $extracted_columnspec = Util::extractColumnSpec($def['Type']); + $attribute = trim($extracted_columnspec[ 'attribute']); + $type = $extracted_columnspec['type']; + $length = $extracted_columnspec['spec_in_brackets']; + } + if (isset($def['Attribute'])) { + $attribute = $def['Attribute']; + }; + $collation = isset($def['Collation'])?$def['Collation']:""; + $isNull = ($def['Null'] == "NO")?0:1; + $extra = isset($def['Extra'])?$def['Extra']:""; + $default = isset($def['Default'])?$def['Default']:""; + $insQuery = 'INSERT INTO ' + . Util::backquote($central_list_table) . ' ' + . 'VALUES ( \'' . $GLOBALS['dbi']->escapeString($db) . '\' ,' + . '\'' . $GLOBALS['dbi']->escapeString($column) . '\',\'' + . $GLOBALS['dbi']->escapeString($type) . '\',' + . '\'' . $GLOBALS['dbi']->escapeString($length) . '\',\'' + . $GLOBALS['dbi']->escapeString($collation) . '\',' + . '\'' . $GLOBALS['dbi']->escapeString($isNull) . '\',' + . '\'' . implode(',', array($extra, $attribute)) + . '\',\'' . $GLOBALS['dbi']->escapeString($default) . '\');'; + return $insQuery; + } + + /** + * If $isTable is true then unique columns from given tables as $field_select + * are added to central list otherwise the $field_select is considered as + * list of columns and these columns are added to central list if not already added + * + * @param array $field_select if $isTable is true selected tables list + * otherwise selected columns list + * @param bool $isTable if passed array is of tables or columns + * @param string $table if $isTable is false, + * then table name to which columns belong + * + * @return true|PhpMyAdmin\Message + */ + public static function syncUniqueColumns($field_select, $isTable=true, $table=null) + { + $cfgCentralColumns = self::getParams(); + if (empty($cfgCentralColumns)) { + return self::configErrorMessage(); + } + $db = $_REQUEST['db']; + $pmadb = $cfgCentralColumns['db']; + $central_list_table = $cfgCentralColumns['table']; + $GLOBALS['dbi']->selectDb($db, $GLOBALS['userlink']); + $existingCols = array(); + $cols = ""; + $insQuery = array(); + $fields = array(); + $message = true; + if ($isTable) { + foreach ($field_select as $table) { + $fields[$table] = (array) $GLOBALS['dbi']->getColumns( + $db, $table, null, true, $GLOBALS['userlink'] + ); + foreach ($fields[$table] as $field => $def) { + $cols .= "'" . $GLOBALS['dbi']->escapeString($field) . "',"; + } + } + + $has_list = self::findExistingColNames($db, trim($cols, ',')); + foreach ($field_select as $table) { + foreach ($fields[$table] as $field => $def) { + if (!in_array($field, $has_list)) { + $has_list[] = $field; + $insQuery[] = self::getInsertQuery( + $field, $def, $db, $central_list_table + ); + } else { + $existingCols[] = "'" . $field . "'"; + } + } + } + } else { + if ($table === null) { + $table = $_REQUEST['table']; + } + foreach ($field_select as $column) { + $cols .= "'" . $GLOBALS['dbi']->escapeString($column) . "',"; + } + $has_list = self::findExistingColNames($db, trim($cols, ',')); + foreach ($field_select as $column) { + if (!in_array($column, $has_list)) { + $has_list[] = $column; + $field = (array) $GLOBALS['dbi']->getColumns( + $db, $table, $column, + true, $GLOBALS['userlink'] + ); + $insQuery[] = self::getInsertQuery( + $column, $field, $db, $central_list_table + ); + } else { + $existingCols[] = "'" . $column . "'"; + } + } + } + if (! empty($existingCols)) { + $existingCols = implode(",", array_unique($existingCols)); + $message = Message::notice( + sprintf( + __( + 'Could not add %1$s as they already exist in central list!' + ), htmlspecialchars($existingCols) + ) + ); + $message->addMessage( + Message::notice( + "Please remove them first " + . "from central list if you want to update above columns" + ) + ); + } + $GLOBALS['dbi']->selectDb($pmadb, $GLOBALS['controllink']); + if (! empty($insQuery)) { + foreach ($insQuery as $query) { + if (!$GLOBALS['dbi']->tryQuery($query, $GLOBALS['controllink'])) { + $message = Message::error(__('Could not add columns!')); + $message->addMessage( + Message::rawError( + $GLOBALS['dbi']->getError($GLOBALS['controllink']) + ) + ); + break; + } + } + } + return $message; + } + + /** + * if $isTable is true it removes all columns of given tables as $field_select from + * central columns list otherwise $field_select is columns list and it removes + * given columns if present in central list + * + * @param array $field_select if $isTable selected list of tables otherwise + * selected list of columns to remove from central list + * @param bool $isTable if passed array is of tables or columns + * + * @return true|PhpMyAdmin\Message + */ + public static function deleteColumnsFromList($field_select, $isTable=true) + { + $cfgCentralColumns = self::getParams(); + if (empty($cfgCentralColumns)) { + return self::configErrorMessage(); + } + $db = $_REQUEST['db']; + $pmadb = $cfgCentralColumns['db']; + $central_list_table = $cfgCentralColumns['table']; + $GLOBALS['dbi']->selectDb($db, $GLOBALS['userlink']); + $message = true; + $colNotExist = array(); + $fields = array(); + if ($isTable) { + $cols = ''; + foreach ($field_select as $table) { + $fields[$table] = (array) $GLOBALS['dbi']->getColumnNames( + $db, $table, $GLOBALS['userlink'] + ); + foreach ($fields[$table] as $col_select) { + $cols .= '\'' . $GLOBALS['dbi']->escapeString($col_select) . '\','; + } + } + $cols = trim($cols, ','); + $has_list = self::findExistingColNames($db, $cols); + foreach ($field_select as $table) { + foreach ($fields[$table] as $column) { + if (!in_array($column, $has_list)) { + $colNotExist[] = "'" . $column . "'"; + } + } + } + + } else { + $cols = ''; + foreach ($field_select as $col_select) { + $cols .= '\'' . $GLOBALS['dbi']->escapeString($col_select) . '\','; + } + $cols = trim($cols, ','); + $has_list = self::findExistingColNames($db, $cols); + foreach ($field_select as $column) { + if (!in_array($column, $has_list)) { + $colNotExist[] = "'" . $column . "'"; + } + } + } + if (!empty($colNotExist)) { + $colNotExist = implode(",", array_unique($colNotExist)); + $message = Message::notice( + sprintf( + __( + 'Couldn\'t remove Column(s) %1$s ' + . 'as they don\'t exist in central columns list!' + ), htmlspecialchars($colNotExist) + ) + ); + } + $GLOBALS['dbi']->selectDb($pmadb, $GLOBALS['controllink']); + + $query = 'DELETE FROM ' . Util::backquote($central_list_table) . ' ' + . 'WHERE db_name = \'' . $GLOBALS['dbi']->escapeString($db) . '\' AND col_name IN (' . $cols . ');'; + + if (!$GLOBALS['dbi']->tryQuery($query, $GLOBALS['controllink'])) { + $message = Message::error(__('Could not remove columns!')); + $message->addHtml('
' . htmlspecialchars($cols) . '
'); + $message->addMessage( + Message::rawError( + $GLOBALS['dbi']->getError($GLOBALS['controllink']) + ) + ); + } + return $message; + } + + /** + * make the columns of given tables consistent with central list of columns. + * Updates only those columns which are not being referenced. + * + * @param string $db current database + * @param array $selected_tables list of selected tables. + * + * @return true|PhpMyAdmin\Message + */ + public static function makeConsistentWithList($db, $selected_tables) + { + $message = true; + foreach ($selected_tables as $table) { + $query = 'ALTER TABLE ' . Util::backquote($table); + $has_list = self::getFromTable($db, $table, true); + $GLOBALS['dbi']->selectDb($db, $GLOBALS['userlink']); + foreach ($has_list as $column) { + $column_status = Relation::checkChildForeignReferences( + $db, $table, $column['col_name'] + ); + //column definition can only be changed if + //it is not referenced by another column + if ($column_status['isEditable']) { + $query .= ' MODIFY ' . Util::backquote($column['col_name']) . ' ' + . $GLOBALS['dbi']->escapeString($column['col_type']); + if ($column['col_length']) { + $query .= '(' . $column['col_length'] . ')'; + } + + $query .= ' ' . $column['col_attribute']; + if ($column['col_isNull']) { + $query .= ' NULL'; + } else { + $query .= ' NOT NULL'; + } + + $query .= ' ' . $column['col_extra']; + if ($column['col_default']) { + if ($column['col_default'] != 'CURRENT_TIMESTAMP') { + $query .= ' DEFAULT \'' . $GLOBALS['dbi']->escapeString( + $column['col_default'] + ) . '\''; + } else { + $query .= ' DEFAULT ' . $GLOBALS['dbi']->escapeString( + $column['col_default'] + ); + } + } + $query .= ','; + } + } + $query = trim($query, " ,") . ";"; + if (!$GLOBALS['dbi']->tryQuery($query, $GLOBALS['userlink'])) { + if ($message === true) { + $message = Message::error( + $GLOBALS['dbi']->getError($GLOBALS['userlink']) + ); + } else { + $message->addText( + $GLOBALS['dbi']->getError($GLOBALS['userlink']), + '
' + ); + } + } + } + return $message; + } + + /** + * return the columns present in central list of columns for a given + * table of a given database + * + * @param string $db given database + * @param string $table given table + * @param boolean $allFields set if need all the fields of existing columns, + * otherwise only column_name is returned + * + * @return array columns present in central list from given table of given db. + */ + public static function getFromTable($db, $table, $allFields=false) + { + $cfgCentralColumns = self::getParams(); + if (empty($cfgCentralColumns)) { + return array(); + } + $GLOBALS['dbi']->selectDb($db, $GLOBALS['userlink']); + $fields = (array) $GLOBALS['dbi']->getColumnNames( + $db, $table, $GLOBALS['userlink'] + ); + $cols = ''; + foreach ($fields as $col_select) { + $cols .= '\'' . $GLOBALS['dbi']->escapeString($col_select) . '\','; + } + $cols = trim($cols, ','); + $has_list = self::findExistingColNames($db, $cols, $allFields); + if (! empty($has_list)) { + return (array)$has_list; + } else { + return array(); + } + } + + /** + * update a column in central columns list if a edit is requested + * + * @param string $db current database + * @param string $orig_col_name original column name before edit + * @param string $col_name new column name + * @param string $col_type new column type + * @param string $col_attribute new column attribute + * @param string $col_length new column length + * @param int $col_isNull value 1 if new column isNull is true, 0 otherwise + * @param string $collation new column collation + * @param string $col_extra new column extra property + * @param string $col_default new column default value + * + * @return true|PhpMyAdmin\Message + */ + public static function updateOneColumn($db, $orig_col_name, $col_name, $col_type, + $col_attribute,$col_length, $col_isNull, $collation, $col_extra, $col_default + ) { + $cfgCentralColumns = self::getParams(); + if (empty($cfgCentralColumns)) { + return self::configErrorMessage(); + } + $centralTable = $cfgCentralColumns['table']; + $GLOBALS['dbi']->selectDb($cfgCentralColumns['db'], $GLOBALS['controllink']); + if ($orig_col_name == "") { + $def = array(); + $def['Type'] = $col_type; + if ($col_length) { + $def['Type'] .= '(' . $col_length . ')'; + } + $def['Collation'] = $collation; + $def['Null'] = $col_isNull?__('YES'):__('NO'); + $def['Extra'] = $col_extra; + $def['Attribute'] = $col_attribute; + $def['Default'] = $col_default; + $query = self::getInsertQuery($col_name, $def, $db, $centralTable); + } else { + $query = 'UPDATE ' . Util::backquote($centralTable) + . ' SET col_type = \'' . $GLOBALS['dbi']->escapeString($col_type) . '\'' + . ', col_name = \'' . $GLOBALS['dbi']->escapeString($col_name) . '\'' + . ', col_length = \'' . $GLOBALS['dbi']->escapeString($col_length) . '\'' + . ', col_isNull = ' . $col_isNull + . ', col_collation = \'' . $GLOBALS['dbi']->escapeString($collation) . '\'' + . ', col_extra = \'' + . implode(',', array($col_extra, $col_attribute)) . '\'' + . ', col_default = \'' . $GLOBALS['dbi']->escapeString($col_default) . '\'' + . ' WHERE db_name = \'' . $GLOBALS['dbi']->escapeString($db) . '\' ' + . 'AND col_name = \'' . $GLOBALS['dbi']->escapeString($orig_col_name) + . '\''; + } + if (!$GLOBALS['dbi']->tryQuery($query, $GLOBALS['controllink'])) { + return Message::error( + $GLOBALS['dbi']->getError($GLOBALS['controllink']) + ); + } + return true; + } + + /** + * Update Multiple column in central columns list if a chnage is requested + * + * @return true|PhpMyAdmin\Message + */ + public static function updateMultipleColumn() + { + $db = $_POST['db']; + $col_name = $_POST['field_name']; + $orig_col_name = $_POST['orig_col_name']; + $col_default = $_POST['field_default_type']; + $col_length = $_POST['field_length']; + $col_attribute = $_POST['field_attribute']; + $col_type = $_POST['field_type']; + $collation = $_POST['field_collation']; + $col_isNull = array(); + $col_extra = array(); + $num_central_fields = count($orig_col_name); + for ($i = 0; $i < $num_central_fields ; $i++) { + $col_isNull[$i] = isset($_POST['field_null'][$i]) ? 1 : 0; + $col_extra[$i] = isset($_POST['col_extra'][$i]) + ? $_POST['col_extra'][$i] : ''; + + if ($col_default[$i] == 'NONE') { + $col_default[$i] = ""; + } else if ($col_default[$i] == 'USER_DEFINED') { + $col_default[$i] = $_POST['field_default_value'][$i]; + } + + $message = self::updateOneColumn( + $db, $orig_col_name[$i], $col_name[$i], $col_type[$i], + $col_attribute[$i], $col_length[$i], $col_isNull[$i], $collation[$i], + $col_extra[$i], $col_default[$i] + ); + if (!is_bool($message)) { + return $message; + } + } + return true; + } + + /** + * get the html for table navigation in Central columns page + * + * @param int $total_rows total number of rows in complete result set + * @param int $pos offset of first result with complete result set + * @param string $db current database + * + * @return string html for table navigation in Central columns page + */ + public static function getHtmlForTableNavigation($total_rows, $pos, $db) + { + $max_rows = $GLOBALS['cfg']['MaxRows']; + $pageNow = ($pos / $max_rows) + 1; + $nbTotalPage = ceil($total_rows / $max_rows); + $table_navigation_html = '' + . '' + . ''; + if ($pos - $max_rows >= 0) { + $table_navigation_html .= ''; + } + if ($nbTotalPage > 1) { + $table_navigation_html .= ''; + } + if ($pos + $max_rows < $total_rows) { + $table_navigation_html .= ''; + } + $table_navigation_html .= '' + . '' + . '' + . '' + . '' + . '' + . '
' + . '
' + . Url::getHiddenInputs( + $db + ) + . '' + . '' + . '' + . '
' + . '
'; + $table_navigation_html .= '
' + . Url::getHiddenInputs( + $db + ) + . ''; + $table_navigation_html .= Util::pageselector( + 'pos', $max_rows, $pageNow, $nbTotalPage + ); + $table_navigation_html .= '
' + . '
' + . '
' + . Url::getHiddenInputs( + $db + ) + . '' + . '' + . '' + . '
' + . '
' + . '' . __('Filter rows') . ':' + . '' + . '
'; + + return $table_navigation_html; + } + + /** + * function generate and return the table header for central columns page + * + * @param string $class styling class of 'th' elements + * @param string $title title of the 'th' elements + * @param integer $actionCount number of actions + * + * @return string html for table header in central columns view/edit page + */ + public static function getTableHeader($class='', $title='', $actionCount=0) + { + $action = ''; + if ($actionCount > 0) { + $action .= '' + . __('Action') . ''; + } + $tableheader = ''; + $tableheader .= '' + . '' + . '' + . $action + . '' + . __('Name') . '
' + . '' + . __('Type') . '
' + . '' + . __('Length/Values') . '
' + . '' + . __('Default') . '
' + . '' . __('Collation') . '
' + . '' + . __('Attribute') . '
' + . '' + . __('Null') . '
' + . '' + . __('A_I') . '
' + . ''; + $tableheader .= ''; + return $tableheader; + } + + /** + * Function generate and return the table header for + * multiple edit central columns page + * + * @param array $header_cells headers list + * + * @return string html for table header in central columns multi edit page + */ + public static function getEditTableHeader($header_cells) + { + $html = ''; + $html .= ''; + foreach ($header_cells as $header_val) { + $html .= ''; + } + $html .= ''; + return $html; + } + + /** + * build the dropdown select html for tables of given database + * + * @param string $db current database + * + * @return string html dropdown for selecting table + */ + public static function getHtmlForTableDropdown($db) + { + $GLOBALS['dbi']->selectDb($db, $GLOBALS['userlink']); + $tables = $GLOBALS['dbi']->getTables($db, $GLOBALS['userlink']); + $selectHtml = ''; + return $selectHtml; + } + + /** + * build dropdown select html to select column in selected table, + * include only columns which are not already in central list + * + * @param string $db current database to which selected table belongs + * @param string $selected_tbl selected table + * + * @return string html to select column + */ + public static function getHtmlForColumnDropdown($db, $selected_tbl) + { + $existing_cols = self::getFromTable($db, $selected_tbl); + $GLOBALS['dbi']->selectDb($db, $GLOBALS['userlink']); + $columns = (array) $GLOBALS['dbi']->getColumnNames( + $db, $selected_tbl, $GLOBALS['userlink'] + ); + $selectColHtml = ""; + foreach ($columns as $column) { + if (!in_array($column, $existing_cols)) { + $selectColHtml .= ''; + } + } + return $selectColHtml; + } + + /** + * html to display the form that let user to add a column on Central columns page + * + * @param int $total_rows total number of rows in complete result set + * @param int $pos offset of first result with complete result set + * @param string $db current database + * + * @return string html to add a column in the central list + */ + public static function getHtmlForAddCentralColumn($total_rows, $pos, $db) + { + $columnAdd = '
' . __('Structure'); + $html .= '
' . $header_val . '
' + . '' + . '' + . '' + . '' + . '' + . '
' + . Util::getIcon( + 'centralColumns_add.png', + __('Add column') + ) + . '
' + . Url::getHiddenInputs( + $db + ) + . '' + . '' + . '' + . self::getHtmlForTableDropdown($db) + . '
' + . '
'; + + return $columnAdd; + } + + /** + * build html for a row in central columns table + * + * @param array $row array contains complete information of a particular row of central list table + * @param int $row_num position the row in the table + * @param string $db current database + * + * @return string html of a particular row in the central columns table. + */ + public static function getHtmlForCentralColumnsTableRow($row, $row_num, $db) + { + $tableHtml = '' + . Url::getHiddenInputs( + $db + ) + . '' + . '' + . '' + . '' + . '' + . '' . Util::getIcon('b_edit.png', __('Edit')) . '' + . '' + . '' . Util::getIcon('b_drop.png', __('Delete')) . '' + . '' + . '' + . ''; + + $tableHtml .= + '' + . '' . htmlspecialchars($row['col_name']) . '' + . '' + . Template::get('columns_definitions/column_name') + ->render( + array( + 'columnNumber' => $row_num, + 'ci' => 0, + 'ci_offset' => 0, + 'columnMeta' => array( + 'Field'=>$row['col_name'] + ), + 'cfgRelation' => array( + 'centralcolumnswork' => false + ) + ) + ) + . ''; + $tableHtml .= + '' + . htmlspecialchars($row['col_type']) . '' + . Template::get('columns_definitions/column_type') + ->render( + array( + 'column_number' => $row_num, + 'ci' => 1, + 'ci_offset' => 0, + 'type_upper' => mb_strtoupper($row['col_type']), + 'column_meta' => array() + ) + ) + . ''; + $tableHtml .= + '' + . '' . ($row['col_length']?htmlspecialchars($row['col_length']):"") + . '' + . Template::get('columns_definitions/column_length')->render( + array( + 'column_number' => $row_num, + 'ci' => 2, + 'ci_offset' => 0, + 'length_values_input_size' => 8, + 'length_to_display' => $row['col_length'] + ) + ) + . ''; + + $meta = array(); + if (!isset($row['col_default']) || $row['col_default'] == '') { + $meta['DefaultType'] = 'NONE'; + } else { + if ($row['col_default'] == 'CURRENT_TIMESTAMP' + || $row['col_default'] == 'NULL' + ) { + $meta['DefaultType'] = $row['col_default']; + } else { + $meta['DefaultType'] = 'USER_DEFINED'; + $meta['DefaultValue'] = $row['col_default']; + } + } + $tableHtml .= + '' . (isset($row['col_default']) + ? htmlspecialchars($row['col_default']) : 'None') + . '' + . Template::get('columns_definitions/column_default') + ->render( + array( + 'columnNumber' => $row_num, + 'ci' => 3, + 'ci_offset' => 0, + 'type_upper' => mb_strtoupper($row['col_type']), + 'columnMeta' => $meta + ) + ) + . ''; + + $tableHtml .= + '' + . '' . htmlspecialchars($row['col_collation']) . '' + . Charsets::getCollationDropdownBox( + 'field_collation[' . $row_num . ']', + 'field_' . $row_num . '_4', $row['col_collation'], false + ) + . ''; + $tableHtml .= + '' + . '' . + ($row['col_attribute'] + ? htmlspecialchars($row['col_attribute']) : "" ) + . '' + . Template::get('columns_definitions/column_attribute') + ->render( + array( + 'columnNumber' => $row_num, + 'ci' => 5, + 'ci_offset' => 0, + 'extracted_columnspec' => array(), + 'columnMeta' => $row['col_attribute'], + 'submit_attribute' => false, + ) + ) + . ''; + $tableHtml .= + '' + . '' . ($row['col_isNull'] ? __('Yes') : __('No')) + . '' + . Template::get('columns_definitions/column_null') + ->render( + array( + 'column_number' => $row_num, + 'ci' => 6, + 'ci_offset' => 0, + 'column_meta' => array( + 'Null' => $row['col_isNull'] + ) + ) + ) + . ''; + + $tableHtml .= + '' + . htmlspecialchars($row['col_extra']) . '' + . Template::get('columns_definitions/column_extra')->render( + array( + 'column_number' => $row_num, + 'ci' => 7, + 'ci_offset' => 0, + 'column_meta' => array('Extra'=>$row['col_extra']) + ) + ) + . ''; + + $tableHtml .= ''; + + return $tableHtml; + } + + /** + * build html for editing a row in central columns table + * + * @param array $row array contains complete information of a particular row of central list table + * @param int $row_num position the row in the table + * + * @return string html of a particular row in the central columns table. + */ + public static function getHtmlForCentralColumnsEditTableRow($row, $row_num) + { + $tableHtml = '' + . '' + . '' + . Template::get('columns_definitions/column_name') + ->render( + array( + 'columnNumber' => $row_num, + 'ci' => 0, + 'ci_offset' => 0, + 'columnMeta' => array( + 'Field' => $row['col_name'] + ), + 'cfgRelation' => array( + 'centralcolumnswork' => false + ) + ) + ) + . ''; + $tableHtml .= + '' + . Template::get('columns_definitions/column_type') + ->render( + array( + 'column_number' => $row_num, + 'ci' => 1, + 'ci_offset' => 0, + 'type_upper' => mb_strtoupper($row['col_type']), + 'column_meta' => array() + ) + ) + . ''; + $tableHtml .= + '' + . Template::get('columns_definitions/column_length')->render( + array( + 'column_number' => $row_num, + 'ci' => 2, + 'ci_offset' => 0, + 'length_values_input_size' => 8, + 'length_to_display' => $row['col_length'] + ) + ) + . ''; + $meta = array(); + if (!isset($row['col_default']) || $row['col_default'] == '') { + $meta['DefaultType'] = 'NONE'; + } else { + if ($row['col_default'] == 'CURRENT_TIMESTAMP' + || $row['col_default'] == 'NULL' + ) { + $meta['DefaultType'] = $row['col_default']; + } else { + $meta['DefaultType'] = 'USER_DEFINED'; + $meta['DefaultValue'] = $row['col_default']; + } + } + $tableHtml .= + '' + . Template::get('columns_definitions/column_default') + ->render( + array( + 'columnNumber' => $row_num, + 'ci' => 3, + 'ci_offset' => 0, + 'type_upper' => mb_strtoupper($row['col_default']), + 'columnMeta' => $meta + ) + ) + . ''; + $tableHtml .= + '' + . Charsets::getCollationDropdownBox( + 'field_collation[' . $row_num . ']', + 'field_' . $row_num . '_4', $row['col_collation'], false + ) + . ''; + $tableHtml .= + '' + . Template::get('columns_definitions/column_attribute') + ->render( + array( + 'columnNumber' => $row_num, + 'ci' => 5, + 'ci_offset' => 0, + 'extracted_columnspec' => array( + 'attribute' => $row['col_attribute'] + ), + 'columnMeta' => array(), + 'submit_attribute' => false, + ) + ) + . ''; + $tableHtml .= + '' + . Template::get('columns_definitions/column_null') + ->render( + array( + 'column_number' => $row_num, + 'ci' => 6, + 'ci_offset' => 0, + 'column_meta' => array( + 'Null' => $row['col_isNull'] + ) + ) + ) + . ''; + + $tableHtml .= + '' + . Template::get('columns_definitions/column_extra')->render( + array( + 'column_number' => $row_num, + 'ci' => 7, + 'ci_offset' => 0, + 'column_meta' => array('Extra' => $row['col_extra']) + ) + ) + . ''; + $tableHtml .= ''; + return $tableHtml; + } + + /** + * get the list of columns in given database excluding + * the columns present in current table + * + * @param string $db selected database + * @param string $table current table name + * + * @return string encoded list of columns present in central list for the given + * database + */ + public static function getListRaw($db, $table) + { + $cfgCentralColumns = self::getParams(); + if (empty($cfgCentralColumns)) { + return json_encode(array()); + } + $centralTable = $cfgCentralColumns['table']; + if (empty($table) || $table == '') { + $query = 'SELECT * FROM ' . Util::backquote($centralTable) . ' ' + . 'WHERE db_name = \'' . $GLOBALS['dbi']->escapeString($db) . '\';'; + } else { + $GLOBALS['dbi']->selectDb($db, $GLOBALS['userlink']); + $columns = (array) $GLOBALS['dbi']->getColumnNames( + $db, $table, $GLOBALS['userlink'] + ); + $cols = ''; + foreach ($columns as $col_select) { + $cols .= '\'' . $GLOBALS['dbi']->escapeString($col_select) . '\','; + } + $cols = trim($cols, ','); + $query = 'SELECT * FROM ' . Util::backquote($centralTable) . ' ' + . 'WHERE db_name = \'' . $GLOBALS['dbi']->escapeString($db) . '\''; + if ($cols) { + $query .= ' AND col_name NOT IN (' . $cols . ')'; + } + $query .= ';'; + } + $GLOBALS['dbi']->selectDb($cfgCentralColumns['db'], $GLOBALS['controllink']); + $columns_list = (array)$GLOBALS['dbi']->fetchResult( + $query, null, null, $GLOBALS['controllink'] + ); + self::handleColumnExtra($columns_list); + return json_encode($columns_list); + } + + /** + * Get HTML for "check all" check box with "with selected" dropdown + * + * @param string $pmaThemeImage pma theme image url + * @param string $text_dir url for text directory + * + * @return string $html_output + */ + public static function getTableFooter($pmaThemeImage, $text_dir) + { + $html_output = Template::get('select_all') + ->render( + array( + 'pma_theme_image' => $pmaThemeImage, + 'text_dir' => $text_dir, + 'form_name' => 'tableslistcontainer', + ) + ); + $html_output .= Util::getButtonOrImage( + 'edit_central_columns', 'mult_submit change_central_columns', + __('Edit'), 'b_edit.png', 'edit central columns' + ); + $html_output .= Util::getButtonOrImage( + 'delete_central_columns', 'mult_submit', + __('Delete'), 'b_drop.png', + 'remove_from_central_columns' + ); + return $html_output; + } + + /** + * function generate and return the table footer for + * multiple edit central columns page + * + * @return string html for table footer in central columns multi edit page + */ + public static function getEditTableFooter() + { + $html_output = '
' + . '' + . '
'; + return $html_output; + } + + /** + * Column `col_extra` is used to store both extra and attributes for a column. + * This method separates them. + * + * @param array &$columns_list columns list + * + * @return void + */ + public static function handleColumnExtra(&$columns_list) + { + foreach ($columns_list as &$row) { + $vals = explode(',', $row['col_extra']); + + if (in_array('BINARY', $vals)) { + $row['col_attribute'] = 'BINARY'; + } elseif (in_array('UNSIGNED', $vals)) { + $row['col_attribute'] = 'UNSIGNED'; + } elseif (in_array('UNSIGNED ZEROFILL', $vals)) { + $row['col_attribute'] = 'UNSIGNED ZEROFILL'; + } elseif (in_array('on update CURRENT_TIMESTAMP', $vals)) { + $row['col_attribute'] = 'on update CURRENT_TIMESTAMP'; + } else { + $row['col_attribute'] = ''; + } + + if (in_array('auto_increment', $vals)) { + $row['col_extra'] = 'auto_increment'; + } else { + $row['col_extra'] = ''; + } + } + } + + /** + * build html for adding a new user defined column to central list + * + * @param string $db current database + * @param integer $total_rows number of rows in central columns + * + * @return string html of the form to let user add a new user defined column to the + * list + */ + public static function getHtmlForAddNewColumn($db, $total_rows) + { + $addNewColumn = '
' + . '+ ' . __('Add new column') . '' + . '
' + . Url::getHiddenInputs( + $db + ) + . '' + . '
' + . ''; + $addNewColumn .= self::getTableHeader(); + $addNewColumn .= '' + . '' + . '' + . '' + . '' + . '' + . '' + . '' + . '' + . '' + . ' ' + . ''; + $addNewColumn .= '
' + . Template::get('columns_definitions/column_name') + ->render( + array( + 'columnNumber' => 0, + 'ci' => 0, + 'ci_offset' => 0, + 'columnMeta' => array(), + 'cfgRelation' => array( + 'centralcolumnswork' => false + ) + ) + ) + . '' + . Template::get('columns_definitions/column_type') + ->render( + array( + 'column_number' => 0, + 'ci' => 1, + 'ci_offset' => 0, + 'type_upper' => '', + 'column_meta' => array() + ) + ) + . '' + . Template::get('columns_definitions/column_length')->render( + array( + 'column_number' => 0, + 'ci' => 2, + 'ci_offset' => 0, + 'length_values_input_size' => 8, + 'length_to_display' => '' + ) + ) + . '' + . Template::get('columns_definitions/column_default') + ->render( + array( + 'columnNumber' => 0, + 'ci' => 3, + 'ci_offset' => 0, + 'type_upper' => '', + 'columnMeta' => array() + ) + ) + . '' + . Charsets::getCollationDropdownBox( + 'field_collation[0]', + 'field_0_4', null, false + ) + . '' + . Template::get('columns_definitions/column_attribute') + ->render( + array( + 'columnNumber' => 0, + 'ci' => 5, + 'ci_offset' => 0, + 'extracted_columnspec' => array(), + 'columnMeta' => array(), + 'submit_attribute' => false, + ) + ) + . '' + . Template::get('columns_definitions/column_null') + ->render( + array( + 'column_number' => 0, + 'ci' => 6, + 'ci_offset' => 0, + 'column_meta' => array() + ) + ) + . '' + . Template::get('columns_definitions/column_extra')->render( + array( + 'column_number' => 0, + 'ci' => 7, + 'ci_offset' => 0, + 'column_meta' => array() + ) + ) + . '' + . '
'; + return $addNewColumn; + } + + /** + * Get HTML for editing page central columns + * + * @param array $selected_fld Array containing the selected fields + * @param string $selected_db String containing the name of database + * + * @return string HTML for complete editing page for central columns + */ + public static function getHtmlForEditingPage($selected_fld,$selected_db) + { + $html = '
'; + $header_cells = array( + __('Name'), __('Type'), __('Length/Values'), __('Default'), + __('Collation'), __('Attributes'), __('Null'), __('A_I') + ); + $html .= self::getEditTableHeader($header_cells); + $selected_fld_safe = array(); + foreach ($selected_fld as $key) { + $selected_fld_safe[] = $GLOBALS['dbi']->escapeString($key); + } + $columns_list = implode("','", $selected_fld_safe); + $columns_list = "'" . $columns_list . "'"; + $list_detail_cols = self::findExistingColNames($selected_db, $columns_list, true); + $row_num = 0; + foreach ($list_detail_cols as $row) { + $tableHtmlRow = self::getHtmlForCentralColumnsEditTableRow( + $row, $row_num + ); + $html .= $tableHtmlRow; + $row_num++; + } + $html .= ''; + $html .= self::getEditTableFooter(); + $html .= '
'; + return $html; + } +} diff --git a/libraries/classes/Controllers/Table/TableStructureController.php b/libraries/classes/Controllers/Table/TableStructureController.php index 28a5b7f96d..8b799aab3f 100644 --- a/libraries/classes/Controllers/Table/TableStructureController.php +++ b/libraries/classes/Controllers/Table/TableStructureController.php @@ -7,6 +7,7 @@ */ namespace PhpMyAdmin\Controllers\Table; +use PhpMyAdmin\CentralColumns; use PhpMyAdmin\Config\PageSettings; use PhpMyAdmin\Controllers\TableController; use PhpMyAdmin\Core; @@ -21,8 +22,8 @@ use PhpMyAdmin\SqlParser\Utils\Table as SqlTable; use PhpMyAdmin\Table; use PhpMyAdmin\Template; use PhpMyAdmin\Transformations; -use PhpMyAdmin\Util; use PhpMyAdmin\Url; +use PhpMyAdmin\Util; require_once 'libraries/config/messages.inc.php'; require_once 'libraries/config/user_preferences.forms.php'; @@ -1178,8 +1179,7 @@ class TableStructureController extends TableController $mime_map = Transformations::getMIME($this->db, $this->table, true); } } - include_once 'libraries/central_columns.lib.php'; - $central_list = PMA_getCentralColumnsFromTable($this->db, $this->table); + $central_list = CentralColumns::getFromTable($this->db, $this->table); $columns_list = array(); $titles = array( @@ -1464,12 +1464,10 @@ class TableStructureController extends TableController $mult_btn = __('Yes'); break; case 'add_to_central_columns': - include_once 'libraries/central_columns.lib.php'; - $centralColsError = PMA_syncUniqueColumns($selected, false); + $centralColsError = CentralColumns::syncUniqueColumns($selected, false); break; case 'remove_from_central_columns': - include_once 'libraries/central_columns.lib.php'; - $centralColsError = PMA_deleteColumnsFromList($selected, false); + $centralColsError = CentralColumns::deleteColumnsFromList($selected, false); break; case 'change': $this->displayHtmlForColumnChange($selected, $action); diff --git a/libraries/mult_submits.inc.php b/libraries/mult_submits.inc.php index 307538bda5..946bfcc7f0 100644 --- a/libraries/mult_submits.inc.php +++ b/libraries/mult_submits.inc.php @@ -6,6 +6,7 @@ * @package PhpMyAdmin */ +use PhpMyAdmin\CentralColumns; use PhpMyAdmin\Message; use PhpMyAdmin\Response; use PhpMyAdmin\Sql; @@ -118,16 +119,13 @@ if (! empty($submit_mult) $response->addJSON('message', $show_create); exit; case 'sync_unique_columns_central_list': - include_once 'libraries/central_columns.lib.php'; - $centralColsError = PMA_syncUniqueColumns($selected); + $centralColsError = CentralColumns::syncUniqueColumns($selected); break; case 'delete_unique_columns_central_list': - include_once 'libraries/central_columns.lib.php'; - $centralColsError = PMA_deleteColumnsFromList($selected); + $centralColsError = CentralColumns::deleteColumnsFromList($selected); break; case 'make_consistent_with_central_list': - include_once 'libraries/central_columns.lib.php'; - $centralColsError = PMA_makeConsistentWithList( + $centralColsError = CentralColumns::makeConsistentWithList( $GLOBALS['db'], $selected ); diff --git a/test/libraries/PMA_central_columns_test.php b/test/classes/CentralColumnsTest.php similarity index 82% rename from test/libraries/PMA_central_columns_test.php rename to test/classes/CentralColumnsTest.php index b7b3004047..c099f8648c 100644 --- a/test/libraries/PMA_central_columns_test.php +++ b/test/classes/CentralColumnsTest.php @@ -1,29 +1,28 @@ 'phpmyadmin', 'table' => 'pma_central_columns' ), - PMA_centralColumnsGetParams() + CentralColumns::getParams() ); } /** - * Test for PMA_getColumnsList + * Test for CentralColumns::getColumnsList * * @return void */ @@ -161,16 +160,16 @@ class PMA_Central_Columns_Test extends PHPUnit_Framework_TestCase $this->assertEquals( $this->_modifiedColumnData, - PMA_getColumnsList('phpmyadmin') + CentralColumns::getColumnsList('phpmyadmin') ); $this->assertEquals( array_slice($this->_modifiedColumnData, 1, 2), - PMA_getColumnsList('phpmyadmin', 1, 2) + CentralColumns::getColumnsList('phpmyadmin', 1, 2) ); } /** - * Test for PMA_getCentralColumnsCount + * Test for CentralColumns::getCount * * @return void */ @@ -189,12 +188,12 @@ class PMA_Central_Columns_Test extends PHPUnit_Framework_TestCase $this->assertEquals( 3, - PMA_getCentralColumnsCount('phpmyadmin') + CentralColumns::getCount('phpmyadmin') ); } /** - * Test for PMA_syncUniqueColumns + * Test for CentralColumns::syncUniqueColumns * * @return void */ @@ -204,12 +203,12 @@ class PMA_Central_Columns_Test extends PHPUnit_Framework_TestCase $_REQUEST['table'] = 'PMA_table'; $this->assertTrue( - PMA_syncUniqueColumns(array('PMA_table')) + CentralColumns::syncUniqueColumns(array('PMA_table')) ); } /** - * Test for PMA_deleteColumnsFromList + * Test for CentralColumns::deleteColumnsFromList * * @return void */ @@ -242,21 +241,21 @@ class PMA_Central_Columns_Test extends PHPUnit_Framework_TestCase ); $this->assertTrue( - PMA_deleteColumnsFromList(array("col1"), false) + CentralColumns::deleteColumnsFromList(array("col1"), false) ); // when column does not exist in the central column list $this->assertInstanceOf( - 'PhpMyAdmin\Message', PMA_deleteColumnsFromList(array('column1'), false) + 'PhpMyAdmin\Message', CentralColumns::deleteColumnsFromList(array('column1'), false) ); $this->assertInstanceOf( - 'PhpMyAdmin\Message', PMA_deleteColumnsFromList(array('PMA_table')) + 'PhpMyAdmin\Message', CentralColumns::deleteColumnsFromList(array('PMA_table')) ); } /** - * Test for PMA_makeConsistentWithList + * Test for CentralColumns::makeConsistentWithList * * @return void */ @@ -273,12 +272,12 @@ class PMA_Central_Columns_Test extends PHPUnit_Framework_TestCase $this->returnValue('PMA_table=CREATE table `PMA_table` (id integer)') ); $this->assertTrue( - PMA_makeConsistentWithList("phpmyadmin", array('PMA_table')) + CentralColumns::makeConsistentWithList("phpmyadmin", array('PMA_table')) ); } /** - * Test for PMA_getCentralColumnsFromTable + * Test for CentralColumns::getFromTable * * @return void */ @@ -299,12 +298,12 @@ class PMA_Central_Columns_Test extends PHPUnit_Framework_TestCase ); $this->assertEquals( array("id", "col1"), - PMA_getCentralColumnsFromTable($db, $table) + CentralColumns::getFromTable($db, $table) ); } /** - * Test for PMA_getCentralColumnsFromTable with $allFields = true + * Test for CentralColumns::getFromTable with $allFields = true * * @return void */ @@ -325,31 +324,31 @@ class PMA_Central_Columns_Test extends PHPUnit_Framework_TestCase ); $this->assertEquals( array_slice($this->_modifiedColumnData, 0, 2), - PMA_getCentralColumnsFromTable($db, $table, true) + CentralColumns::getFromTable($db, $table, true) ); } /** - * Test for PMA_updateOneColumn + * Test for CentralColumns::updateOneColumn * * @return void */ public function testPMAUpdateOneColumn() { $this->assertTrue( - PMA_updateOneColumn( + CentralColumns::updateOneColumn( "phpmyadmin", "", "", "", "", "", "", "", "", "" ) ); $this->assertTrue( - PMA_updateOneColumn( + CentralColumns::updateOneColumn( "phpmyadmin", "col1", "", "", "", "", "", "", "", "" ) ); } /** - * Test for PMA_updateMultipleColumn + * Test for CentralColumns::updateMultipleColumn * * @return void */ @@ -365,13 +364,13 @@ class PMA_Central_Columns_Test extends PHPUnit_Framework_TestCase $_POST['field_type'] = array("",""); $_POST['field_collation'] = array("",""); $this->assertTrue( - PMA_updateMultipleColumn() + CentralColumns::updateMultipleColumn() ); } /** - * Test for PMA_getHTMLforEditingPage + * Test for CentralColumns::getHtmlForEditingPage * * @return void */ @@ -387,7 +386,7 @@ class PMA_Central_Columns_Test extends PHPUnit_Framework_TestCase ->will( $this->returnValue($this->_columnData) ); - $result = PMA_getHTMLforEditingPage( + $result = CentralColumns::getHtmlForEditingPage( array("col1", "col2"), 'phpmyadmin' ); $this->assertContains( @@ -399,30 +398,30 @@ class PMA_Central_Columns_Test extends PHPUnit_Framework_TestCase __('Collation'), __('Attributes'), __('Null'), __('A_I') ); $this->assertContains( - PMA_getCentralColumnsEditTableHeader($header_cells), $result + CentralColumns::getEditTableHeader($header_cells), $result ); - $list_detail_cols = PMA_findExistingColNames( + $list_detail_cols = CentralColumns::findExistingColNames( 'phpmyadmin', "'col1','col2'", true ); $this->assertContains( - PMA_getHTMLforCentralColumnsEditTableRow( + CentralColumns::getHtmlForCentralColumnsEditTableRow( $list_detail_cols[0], 0 ), $result ); $this->assertContains( - PMA_getCentralColumnsEditTableFooter(), $result + CentralColumns::getEditTableFooter(), $result ); } /** - * Test for PMA_getHTMLforTableNavigation + * Test for CentralColumns::getHtmlForTableNavigation * * @return void */ public function testPMAGetHTMLforTableNavigation() { - $result = PMA_getHTMLforTableNavigation(0, 0, 'phpmyadmin'); + $result = CentralColumns::getHtmlForTableNavigation(0, 0, 'phpmyadmin'); $this->assertContains( 'assertContains( '
' . Url::getHiddenInputs( @@ -446,7 +445,7 @@ class PMA_Central_Columns_Test extends PHPUnit_Framework_TestCase $result_1 ); $this->assertContains( - PhpMyAdmin\Util::pageselector( + Util::pageselector( 'pos', 10, 2, 3 ), $result_1 @@ -460,7 +459,7 @@ class PMA_Central_Columns_Test extends PHPUnit_Framework_TestCase } /** - * Test for PMA_getCentralColumnsTableHeader + * Test for CentralColumns::getTableHeader * * @return void */ @@ -468,14 +467,14 @@ class PMA_Central_Columns_Test extends PHPUnit_Framework_TestCase { $this->assertContains( 'assertEquals( json_encode($this->_modifiedColumnData), - PMA_getCentralColumnsListRaw('phpmyadmin', '') + CentralColumns::getListRaw('phpmyadmin', '') ); } /** - * Test for PMA_getCentralColumnsListRaw with a table name + * Test for CentralColumns::getListRaw with a table name * * @return void */ @@ -517,19 +516,19 @@ class PMA_Central_Columns_Test extends PHPUnit_Framework_TestCase ); $this->assertEquals( json_encode($this->_modifiedColumnData), - PMA_getCentralColumnsListRaw('phpmyadmin', 'table1') + CentralColumns::getListRaw('phpmyadmin', 'table1') ); } /** - * Test for PMA_getHTMLforAddNewColumn + * Test for CentralColumns::getHtmlForAddNewColumn * * @return void */ public function testPMAGetHTMLforAddNewColumn() { - $result = PMA_getHTMLforAddNewColumn('phpmyadmin', 0); + $result = CentralColumns::getHtmlForAddNewColumn('phpmyadmin', 0); $this->assertContains( 'assertInstanceOf( 'PhpMyAdmin\Message', - PMA_configErrorMessage() + CentralColumns::configErrorMessage() ); } /** - * Test for PMA_findExistingColNames + * Test for CentralColumns::findExistingColNames * * @return void */ @@ -580,19 +579,19 @@ class PMA_Central_Columns_Test extends PHPUnit_Framework_TestCase ); $this->assertEquals( array_slice($this->_modifiedColumnData, 1, 1), - PMA_findExistingColNames('phpmyadmin', "'col1'", true) + CentralColumns::findExistingColNames('phpmyadmin', "'col1'", true) ); } /** - * Test for PMA_getHTMLforTableDropdown + * Test for CentralColumns::getHtmlForTableDropdown * * @return void */ public function testPMAGetHTMLforTableDropdown() { $db = 'PMA_db'; - $result = PMA_getHTMLforTableDropdown($db); + $result = CentralColumns::getHtmlForTableDropdown($db); $this->assertContains( '