/**
  * Test for PMA_getDbCollation
  *
  * @return void
  * @test
  */
 public function testGetDbCollation()
 {
     $GLOBALS['server'] = 1;
     // test case for system schema
     $this->assertEquals('utf8_general_ci', PMA_getDbCollation("information_schema"));
     $GLOBALS['cfg']['Server']['DisableIS'] = false;
     $GLOBALS['cfg']['DBG']['sql'] = false;
     $this->assertEquals('utf8_general_ci', PMA_getDbCollation('pma_test'));
 }
Ejemplo n.º 2
0
/**
 * Outputs create database database
 *
 * @param   string      Database name
 *
 * @return  bool        Whether it suceeded
 *
 * @access  public
 */
function PMA_exportDBCreate($db)
{
    global $crlf;
    if (isset($GLOBALS['drop_database'])) {
        if (!PMA_exportOutputHandler('DROP DATABASE ' . (isset($GLOBALS['use_backquotes']) ? PMA_backquote($db) : $db) . ';' . $crlf)) {
            return FALSE;
        }
    }
    $create_query = 'CREATE DATABASE ' . (isset($GLOBALS['use_backquotes']) ? PMA_backquote($db) : $db);
    if (PMA_MYSQL_INT_VERSION >= 40101) {
        $collation = PMA_getDbCollation($db);
        if (strpos($collation, '_')) {
            $create_query .= ' DEFAULT CHARACTER SET ' . substr($collation, 0, strpos($collation, '_')) . ' COLLATE ' . $collation;
        } else {
            $create_query .= ' DEFAULT CHARACTER SET ' . $collation;
        }
    }
    $create_query .= ';' . $crlf;
    if (!PMA_exportOutputHandler($create_query)) {
        return FALSE;
    }
    return PMA_exportOutputHandler('USE ' . $db . ';' . $crlf);
}
/**
 * returns array with databases containing extended infos about them
 *
 * @param string   $database     database
 * @param boolean  $force_stats  retrieve stats also for MySQL < 5
 * @param resource $link         mysql link
 * @param string   $sort_by      column to order by
 * @param string   $sort_order   ASC or DESC
 * @param integer  $limit_offset starting offset for LIMIT
 * @param bool|int $limit_count  row count for LIMIT or true
 *                               for $GLOBALS['cfg']['MaxDbList']
 *
 * @todo    move into PMA_List_Database?
 *
 * @return array $databases
 */
function PMA_DBI_get_databases_full($database = null, $force_stats = false, $link = null, $sort_by = 'SCHEMA_NAME', $sort_order = 'ASC', $limit_offset = 0, $limit_count = false)
{
    $common_functions = PMA_CommonFunctions::getInstance();
    $sort_order = strtoupper($sort_order);
    if (true === $limit_count) {
        $limit_count = $GLOBALS['cfg']['MaxDbList'];
    }
    // initialize to avoid errors when there are no databases
    $databases = array();
    $apply_limit_and_order_manual = true;
    if (!$GLOBALS['cfg']['Server']['DisableIS']) {
        /**
         * if $GLOBALS['cfg']['NaturalOrder'] is enabled, we cannot use LIMIT
         * cause MySQL does not support natural ordering, we have to do it afterward
         */
        $limit = '';
        if (!$GLOBALS['cfg']['NaturalOrder']) {
            if ($limit_count) {
                $limit = ' LIMIT ' . $limit_count . ' OFFSET ' . $limit_offset;
            }
            $apply_limit_and_order_manual = false;
        }
        // get table information from information_schema
        if ($database) {
            $sql_where_schema = 'WHERE `SCHEMA_NAME` LIKE \'' . $common_functions->sqlAddSlashes($database) . '\'';
        } else {
            $sql_where_schema = '';
        }
        if (PMA_DRIZZLE) {
            // data_dictionary.table_cache may not contain any data for some
            // tables, it's just a table cache
            $sql = 'SELECT
                s.SCHEMA_NAME,
                s.DEFAULT_COLLATION_NAME';
            if ($force_stats) {
                // no TABLE_CACHE data, stable results are better than
                // constantly changing
                $sql .= ',
                    COUNT(t.TABLE_SCHEMA) AS SCHEMA_TABLES,
                    SUM(stat.NUM_ROWS)    AS SCHEMA_TABLE_ROWS';
            }
            $sql .= '
                   FROM data_dictionary.SCHEMAS s';
            if ($force_stats) {
                $engine_info = $common_functions->cacheGet('drizzle_engines', true);
                $stats_join = "LEFT JOIN (SELECT 0 NUM_ROWS) AS stat ON false";
                if (isset($engine_info['InnoDB']) && $engine_info['InnoDB']['module_library'] == 'innobase') {
                    $stats_join = "LEFT JOIN data_dictionary.INNODB_SYS_TABLESTATS" . " stat ON (t.ENGINE = 'InnoDB' AND stat.NAME" . " = (t.TABLE_SCHEMA || '/') || t.TABLE_NAME)";
                }
                $sql .= "\n                    LEFT JOIN data_dictionary.TABLES t\n                        ON t.TABLE_SCHEMA = s.SCHEMA_NAME\n                    {$stats_join}";
            }
            $sql .= $sql_where_schema . '
                    GROUP BY s.SCHEMA_NAME
                    ORDER BY ' . $common_functions->backquote($sort_by) . ' ' . $sort_order . $limit;
        } else {
            $sql = 'SELECT
                s.SCHEMA_NAME,
                s.DEFAULT_COLLATION_NAME';
            if ($force_stats) {
                $sql .= ',
                    COUNT(t.TABLE_SCHEMA)  AS SCHEMA_TABLES,
                    SUM(t.TABLE_ROWS)      AS SCHEMA_TABLE_ROWS,
                    SUM(t.DATA_LENGTH)     AS SCHEMA_DATA_LENGTH,
                    SUM(t.MAX_DATA_LENGTH) AS SCHEMA_MAX_DATA_LENGTH,
                    SUM(t.INDEX_LENGTH)    AS SCHEMA_INDEX_LENGTH,
                    SUM(t.DATA_LENGTH + t.INDEX_LENGTH)
                                           AS SCHEMA_LENGTH,
                    SUM(t.DATA_FREE)       AS SCHEMA_DATA_FREE';
            }
            $sql .= '
                   FROM `information_schema`.SCHEMATA s';
            if ($force_stats) {
                $sql .= '
                    LEFT JOIN `information_schema`.TABLES t
                        ON BINARY t.TABLE_SCHEMA = BINARY s.SCHEMA_NAME';
            }
            $sql .= $sql_where_schema . '
                    GROUP BY BINARY s.SCHEMA_NAME
                    ORDER BY BINARY ' . $common_functions->backquote($sort_by) . ' ' . $sort_order . $limit;
        }
        $databases = PMA_DBI_fetch_result($sql, 'SCHEMA_NAME', null, $link);
        $mysql_error = PMA_DBI_getError($link);
        if (!count($databases) && $GLOBALS['errno']) {
            $common_functions->mysqlDie($mysql_error, $sql);
        }
        // display only databases also in official database list
        // f.e. to apply hide_db and only_db
        $drops = array_diff(array_keys($databases), (array) $GLOBALS['pma']->databases);
        if (count($drops)) {
            foreach ($drops as $drop) {
                unset($databases[$drop]);
            }
            unset($drop);
        }
        unset($sql_where_schema, $sql, $drops);
    } else {
        foreach ($GLOBALS['pma']->databases as $database_name) {
            // MySQL forward compatibility
            // so pma could use this array as if every server is of version >5.0
            // todo : remove and check the rest of the code for usage,
            // MySQL 5.0 or higher is required for current PMA version
            $databases[$database_name]['SCHEMA_NAME'] = $database_name;
            if ($force_stats) {
                include_once './libraries/mysql_charsets.lib.php';
                $databases[$database_name]['DEFAULT_COLLATION_NAME'] = PMA_getDbCollation($database_name);
                // get additional info about tables
                $databases[$database_name]['SCHEMA_TABLES'] = 0;
                $databases[$database_name]['SCHEMA_TABLE_ROWS'] = 0;
                $databases[$database_name]['SCHEMA_DATA_LENGTH'] = 0;
                $databases[$database_name]['SCHEMA_MAX_DATA_LENGTH'] = 0;
                $databases[$database_name]['SCHEMA_INDEX_LENGTH'] = 0;
                $databases[$database_name]['SCHEMA_LENGTH'] = 0;
                $databases[$database_name]['SCHEMA_DATA_FREE'] = 0;
                $res = PMA_DBI_query('SHOW TABLE STATUS FROM ' . $common_functions->backquote($database_name) . ';');
                while ($row = PMA_DBI_fetch_assoc($res)) {
                    $databases[$database_name]['SCHEMA_TABLES']++;
                    $databases[$database_name]['SCHEMA_TABLE_ROWS'] += $row['Rows'];
                    $databases[$database_name]['SCHEMA_DATA_LENGTH'] += $row['Data_length'];
                    $databases[$database_name]['SCHEMA_MAX_DATA_LENGTH'] += $row['Max_data_length'];
                    $databases[$database_name]['SCHEMA_INDEX_LENGTH'] += $row['Index_length'];
                    // for InnoDB, this does not contain the number of
                    // overhead bytes but the total free space
                    if ('InnoDB' != $row['Engine']) {
                        $databases[$database_name]['SCHEMA_DATA_FREE'] += $row['Data_free'];
                    }
                    $databases[$database_name]['SCHEMA_LENGTH'] += $row['Data_length'] + $row['Index_length'];
                }
                PMA_DBI_free_result($res);
                unset($res);
            }
        }
    }
    /**
     * apply limit and order manually now
     * (caused by older MySQL < 5 or $GLOBALS['cfg']['NaturalOrder'])
     */
    if ($apply_limit_and_order_manual) {
        $GLOBALS['callback_sort_order'] = $sort_order;
        $GLOBALS['callback_sort_by'] = $sort_by;
        usort($databases, 'PMA_usort_comparison_callback');
        unset($GLOBALS['callback_sort_order'], $GLOBALS['callback_sort_by']);
        /**
         * now apply limit
         */
        if ($limit_count) {
            $databases = array_slice($databases, $limit_offset, $limit_count);
        }
    }
    return $databases;
}
Ejemplo n.º 4
0
 /**
  * Outputs CREATE DATABASE statement
  *
  * @param string $db          Database name
  * @param string $export_type 'server', 'database', 'table'
  * @param string $db_alias    Aliases of db
  *
  * @return bool Whether it succeeded
  */
 public function exportDBCreate($db, $export_type, $db_alias = '')
 {
     global $crlf;
     if (empty($db_alias)) {
         $db_alias = $db;
     }
     if (isset($GLOBALS['sql_compatibility'])) {
         $compat = $GLOBALS['sql_compatibility'];
     } else {
         $compat = 'NONE';
     }
     if (isset($GLOBALS['sql_drop_database'])) {
         if (!PMA_exportOutputHandler('DROP DATABASE ' . PMA_Util::backquoteCompat($db_alias, $compat, isset($GLOBALS['sql_backquotes'])) . ';' . $crlf)) {
             return false;
         }
     }
     if ($export_type == 'database' && !isset($GLOBALS['sql_create_database'])) {
         return true;
     }
     $create_query = 'CREATE DATABASE IF NOT EXISTS ' . PMA_Util::backquoteCompat($db_alias, $compat, isset($GLOBALS['sql_backquotes']));
     $collation = PMA_getDbCollation($db);
     if (mb_strpos($collation, '_')) {
         $create_query .= ' DEFAULT CHARACTER SET ' . mb_substr($collation, 0, mb_strpos($collation, '_')) . ' COLLATE ' . $collation;
     } else {
         $create_query .= ' DEFAULT CHARACTER SET ' . $collation;
     }
     $create_query .= ';' . $crlf;
     if (!PMA_exportOutputHandler($create_query)) {
         return false;
     }
     return $this->_exportUseStatement($db_alias, $compat);
 }
Ejemplo n.º 5
0
 * (must be done before displaying the menu tabs)
 */
if (isset($_REQUEST['comment'])) {
    PMA_setDbComment($GLOBALS['db'], $_REQUEST['comment']);
}
require 'libraries/db_common.inc.php';
$url_query .= '&amp;goto=db_operations.php';
// Gets the database structure
$sub_part = '_structure';
list($tables, $num_tables, $total_num_tables, $sub_part, $is_show_stats, $db_is_system_schema, $tooltip_truename, $tooltip_aliasname, $pos) = PMA\libraries\Util::getDbInfo($db, isset($sub_part) ? $sub_part : '');
echo "\n";
if (isset($message)) {
    echo PMA\libraries\Util::getMessage($message, $sql_query);
    unset($message);
}
$_REQUEST['db_collation'] = PMA_getDbCollation($GLOBALS['db']);
$is_information_schema = $GLOBALS['dbi']->isSystemSchema($GLOBALS['db']);
$response->addHTML('<div id="boxContainer" data-box-width="300">');
if (!$is_information_schema) {
    if ($cfgRelation['commwork']) {
        /**
         * database comment
         */
        $response->addHTML(PMA_getHtmlForDatabaseComment($GLOBALS['db']));
    }
    $response->addHTML('<div class="operations_half_width">');
    $response->addHTML(PMA_getHtmlForCreateTable($db));
    $response->addHTML('</div>');
    /**
     * rename database
     */
Ejemplo n.º 6
0
 * (must be done before displaying the menu tabs)
 */
if (isset($_REQUEST['comment'])) {
    PMA_setDbComment($db, $_REQUEST['comment']);
}
require 'libraries/db_common.inc.php';
$url_query .= '&amp;goto=db_operations.php';
// Gets the database structure
$sub_part = '_structure';
require 'libraries/db_info.inc.php';
echo "\n";
if (isset($message)) {
    echo PMA_Util::getMessage($message, $sql_query);
    unset($message);
}
$_REQUEST['db_collation'] = PMA_getDbCollation($db);
$is_information_schema = $GLOBALS['dbi']->isSystemSchema($db);
$response->addHTML('<div id="boxContainer" data-box-width="300">');
if (!$is_information_schema) {
    if ($cfgRelation['commwork']) {
        /**
         * database comment
         */
        $response->addHTML(PMA_getHtmlForDatabaseComment($db));
    }
    $response->addHTML('<div class="operations_half_width">');
    ob_start();
    include 'libraries/display_create_table.lib.php';
    $content = ob_get_contents();
    ob_end_clean();
    $response->addHTML($content);
 /**
  * Index action
  *
  * @return void
  */
 public function indexAction()
 {
     // Add/Remove favorite tables using Ajax request.
     if ($GLOBALS['is_ajax_request'] && !empty($_REQUEST['favorite_table'])) {
         $this->addRemoveFavoriteTablesAction();
         return;
     }
     $this->response->getHeader()->getScripts()->addFiles(array('db_structure.js', 'tbl_change.js', 'jquery/jquery-ui-timepicker-addon.js'));
     // Drops/deletes/etc. multiple tables if required
     if (!empty($_POST['submit_mult']) && isset($_POST['selected_tbl']) || isset($_POST['mult_btn'])) {
         $action = 'db_structure.php';
         $err_url = 'db_structure.php' . PMA_URL_getCommon(array('db' => $this->db));
         // see bug #2794840; in this case, code path is:
         // db_structure.php -> libraries/mult_submits.inc.php -> sql.php
         // -> db_structure.php and if we got an error on the multi submit,
         // we must display it here and not call again mult_submits.inc.php
         if (!isset($_POST['error']) || false === $_POST['error']) {
             include 'libraries/mult_submits.inc.php';
         }
         if (empty($_POST['message'])) {
             $_POST['message'] = PMA_Message::success();
         }
     }
     $this->_url_query .= '&amp;goto=db_structure.php';
     // Gets the database structure
     $sub_part = '_structure';
     list($tables, $num_tables, $total_num_tables, $sub_part, $is_show_stats, $db_is_system_schema, $tooltip_truename, $tooltip_aliasname, $pos) = PMA_Util::getDbInfo($GLOBALS['db'], isset($sub_part) ? $sub_part : '');
     $this->_tables = $tables;
     // updating $tables seems enough for #11376, but updating other
     // variables too in case they may cause some other problem.
     $this->_num_tables = $num_tables;
     $this->_pos = $pos;
     $this->_db_is_system_schema = $db_is_system_schema;
     $this->_total_num_tables = $total_num_tables;
     $this->_is_show_stats = $is_show_stats;
     // If there is an Ajax request for real row count of a table.
     if ($GLOBALS['is_ajax_request'] && isset($_REQUEST['real_row_count']) && $_REQUEST['real_row_count'] == true) {
         $this->handleRealRowCountRequestAction();
         return;
     }
     if (!PMA_DRIZZLE) {
         include_once 'libraries/replication.inc.php';
     } else {
         $GLOBALS['replication_info']['slave']['status'] = false;
     }
     PMA_PageSettings::showGroup('DbStructure');
     $db_collation = PMA_getDbCollation($this->db);
     $titles = PMA_Util::buildActionTitles();
     // 1. No tables
     if ($this->_num_tables == 0) {
         $this->response->addHTML(PMA_message::notice(__('No tables found in database.')));
         if (empty($db_is_system_schema)) {
             $this->response->addHTML(PMA_getHtmlForCreateTable($this->db));
         }
         return;
     }
     // else
     // 2. Shows table information
     /**
      * Displays the tables list
      */
     $this->response->addHTML('<div id="tableslistcontainer">');
     $_url_params = array('pos' => $this->_pos, 'db' => $this->db);
     // Add the sort options if they exists
     if (isset($_REQUEST['sort'])) {
         $_url_params['sort'] = $_REQUEST['sort'];
     }
     if (isset($_REQUEST['sort_order'])) {
         $_url_params['sort_order'] = $_REQUEST['sort_order'];
     }
     $this->response->addHTML(PMA_Util::getListNavigator($this->_total_num_tables, $this->_pos, $_url_params, 'db_structure.php', 'frame_content', $GLOBALS['cfg']['MaxTableList']));
     // table form
     $this->response->addHTML(Template::get('database/structure/table_header')->render(array('db' => $this->db, 'db_is_system_schema' => $this->_db_is_system_schema, 'replication' => $GLOBALS['replication_info']['slave']['status'])));
     $i = $sum_entries = 0;
     $overhead_check = '';
     $create_time_all = '';
     $update_time_all = '';
     $check_time_all = '';
     $num_columns = $GLOBALS['cfg']['PropertiesNumColumns'] > 1 ? ceil($this->_num_tables / $GLOBALS['cfg']['PropertiesNumColumns']) + 1 : 0;
     $row_count = 0;
     $sum_size = (double) 0;
     $overhead_size = (double) 0;
     $hidden_fields = array();
     $odd_row = true;
     $overall_approx_rows = false;
     // Instance of PMA_RecentFavoriteTable class.
     $fav_instance = PMA_RecentFavoriteTable::getInstance('favorite');
     foreach ($this->_tables as $keyname => $current_table) {
         // Get valid statistics whatever is the table type
         $drop_query = '';
         $drop_message = '';
         $already_favorite = false;
         $overhead = '';
         $table_is_view = false;
         $table_encoded = urlencode($current_table['TABLE_NAME']);
         // Sets parameters for links
         $tbl_url_query = $this->_url_query . '&amp;table=' . $table_encoded;
         // do not list the previous table's size info for a view
         list($current_table, $formatted_size, $unit, $formatted_overhead, $overhead_unit, $overhead_size, $table_is_view, $sum_size) = $this->getStuffForEngineTypeTable($current_table, $sum_size, $overhead_size);
         $curTable = $this->dbi->getTable($this->db, $current_table['TABLE_NAME']);
         if (!$curTable->isMerge()) {
             $sum_entries += $current_table['TABLE_ROWS'];
         }
         if (isset($current_table['Collation'])) {
             $collation = '<dfn title="' . PMA_getCollationDescr($current_table['Collation']) . '">' . $current_table['Collation'] . '</dfn>';
         } else {
             $collation = '---';
         }
         if ($this->_is_show_stats) {
             if ($formatted_overhead != '') {
                 $overhead = '<a href="tbl_structure.php' . $tbl_url_query . '#showusage">' . '<span>' . $formatted_overhead . '</span>&nbsp;' . '<span class="unit">' . $overhead_unit . '</span>' . '</a>' . "\n";
                 $overhead_check .= "markAllRows('row_tbl_" . ($i + 1) . "');";
             } else {
                 $overhead = '-';
             }
         }
         // end if
         $showtable = $this->dbi->getTable($this->db, $current_table['TABLE_NAME'])->getStatusInfo(null, true);
         if ($GLOBALS['cfg']['ShowDbStructureCreation']) {
             $create_time = isset($showtable['Create_time']) ? $showtable['Create_time'] : '';
             if ($create_time && (!$create_time_all || $create_time < $create_time_all)) {
                 $create_time_all = $create_time;
             }
         }
         if ($GLOBALS['cfg']['ShowDbStructureLastUpdate']) {
             // $showtable might already be set from ShowDbStructureCreation,
             // see above
             $update_time = isset($showtable['Update_time']) ? $showtable['Update_time'] : '';
             if ($update_time && (!$update_time_all || $update_time < $update_time_all)) {
                 $update_time_all = $update_time;
             }
         }
         if ($GLOBALS['cfg']['ShowDbStructureLastCheck']) {
             // $showtable might already be set from ShowDbStructureCreation,
             // see above
             $check_time = isset($showtable['Check_time']) ? $showtable['Check_time'] : '';
             if ($check_time && (!$check_time_all || $check_time < $check_time_all)) {
                 $check_time_all = $check_time;
             }
         }
         $alias = htmlspecialchars(!empty($tooltip_aliasname) && isset($tooltip_aliasname[$current_table['TABLE_NAME']]) ? $tooltip_aliasname[$current_table['TABLE_NAME']] : $current_table['TABLE_NAME']);
         $alias = str_replace(' ', '&nbsp;', $alias);
         $truename = htmlspecialchars(!empty($tooltip_truename) && isset($tooltip_truename[$current_table['TABLE_NAME']]) ? $tooltip_truename[$current_table['TABLE_NAME']] : $current_table['TABLE_NAME']);
         $truename = str_replace(' ', '&nbsp;', $truename);
         $i++;
         $row_count++;
         if ($table_is_view) {
             $hidden_fields[] = '<input type="hidden" name="views[]" value="' . htmlspecialchars($current_table['TABLE_NAME']) . '" />';
         }
         /*
          * Always activate links for Browse, Search and Empty, even if
          * the icons are greyed, because
          * 1. for views, we don't know the number of rows at this point
          * 2. for tables, another source could have populated them since the
          *    page was generated
          *
          * I could have used the PHP ternary conditional operator but I find
          * the code easier to read without this operator.
          */
         $may_have_rows = $current_table['TABLE_ROWS'] > 0 || $table_is_view;
         $browse_table = Template::get('database/structure/browse_table')->render(array('tbl_url_query' => $tbl_url_query, 'title' => $may_have_rows ? $titles['Browse'] : $titles['NoBrowse']));
         $search_table = Template::get('database/structure/search_table')->render(array('tbl_url_query' => $tbl_url_query, 'title' => $may_have_rows ? $titles['Search'] : $titles['NoSearch']));
         $browse_table_label = Template::get('database/structure/browse_table_label')->render(array('tbl_url_query' => $tbl_url_query, 'title' => htmlspecialchars($current_table['TABLE_COMMENT']), 'truename' => $truename));
         $empty_table = '';
         if (!$this->_db_is_system_schema) {
             $empty_table = '&nbsp;';
             if (!$table_is_view) {
                 $empty_table = Template::get('database/structure/empty_table')->render(array('tbl_url_query' => $tbl_url_query, 'sql_query' => urlencode('TRUNCATE ' . PMA_Util::backquote($current_table['TABLE_NAME'])), 'message_to_show' => urlencode(sprintf(__('Table %s has been emptied.'), htmlspecialchars($current_table['TABLE_NAME']))), 'title' => $may_have_rows ? $titles['Empty'] : $titles['NoEmpty']));
             }
             $drop_query = sprintf('DROP %s %s', $table_is_view || $current_table['ENGINE'] == null ? 'VIEW' : 'TABLE', PMA_Util::backquote($current_table['TABLE_NAME']));
             $drop_message = sprintf($table_is_view || $current_table['ENGINE'] == null ? __('View %s has been dropped.') : __('Table %s has been dropped.'), str_replace(' ', '&nbsp;', htmlspecialchars($current_table['TABLE_NAME'])));
         }
         $tracking_icon = '';
         if (PMA_Tracker::isActive()) {
             $is_tracked = PMA_Tracker::isTracked($GLOBALS["db"], $truename);
             if ($is_tracked || PMA_Tracker::getVersion($GLOBALS["db"], $truename) > 0) {
                 $tracking_icon = Template::get('database/structure/tracking_icon')->render(array('url_query' => $this->_url_query, 'truename' => $truename, 'is_tracked' => $is_tracked));
             }
         }
         if ($num_columns > 0 && $this->_num_tables > $num_columns && $row_count % $num_columns == 0) {
             $row_count = 1;
             $odd_row = true;
             $this->response->addHTML('</tr></tbody></table>');
             $this->response->addHTML(Template::get('database/structure/table_header')->render(array('db_is_system_schema' => false, 'replication' => $GLOBALS['replication_info']['slave']['status'])));
         }
         $do = $ignored = false;
         if ($GLOBALS['replication_info']['slave']['status']) {
             $nbServSlaveDoDb = count($GLOBALS['replication_info']['slave']['Do_DB']);
             $nbServSlaveIgnoreDb = count($GLOBALS['replication_info']['slave']['Ignore_DB']);
             $searchDoDBInTruename = array_search($truename, $GLOBALS['replication_info']['slave']['Do_DB']);
             $searchDoDBInDB = array_search($this->db, $GLOBALS['replication_info']['slave']['Do_DB']);
             $do = strlen($searchDoDBInTruename) > 0 || strlen($searchDoDBInDB) > 0 || $nbServSlaveDoDb == 1 && $nbServSlaveIgnoreDb == 1 || $this->hasTable($GLOBALS['replication_info']['slave']['Wild_Do_Table'], $truename);
             $searchDb = array_search($this->db, $GLOBALS['replication_info']['slave']['Ignore_DB']);
             $searchTable = array_search($truename, $GLOBALS['replication_info']['slave']['Ignore_Table']);
             $ignored = strlen($searchTable) > 0 || strlen($searchDb) > 0 || $this->hasTable($GLOBALS['replication_info']['slave']['Wild_Ignore_Table'], $truename);
         }
         // Handle favorite table list. ----START----
         $already_favorite = $this->checkFavoriteTable($current_table['TABLE_NAME']);
         if (isset($_REQUEST['remove_favorite'])) {
             if ($already_favorite) {
                 // If already in favorite list, remove it.
                 $favorite_table = $_REQUEST['favorite_table'];
                 $fav_instance->remove($this->db, $favorite_table);
             }
         }
         if (isset($_REQUEST['add_favorite'])) {
             if (!$already_favorite) {
                 // Otherwise add to favorite list.
                 $favorite_table = $_REQUEST['favorite_table'];
                 $fav_instance->add($this->db, $favorite_table);
             }
         }
         // Handle favorite table list. ----ENDS----
         $show_superscript = '';
         // there is a null value in the ENGINE
         // - when the table needs to be repaired, or
         // - when it's a view
         //  so ensure that we'll display "in use" below for a table
         //  that needs to be repaired
         $approx_rows = false;
         if (isset($current_table['TABLE_ROWS']) && ($current_table['ENGINE'] != null || $table_is_view)) {
             // InnoDB table: we did not get an accurate row count
             $approx_rows = !$table_is_view && $current_table['ENGINE'] == 'InnoDB' && !$current_table['COUNTED'];
             // Drizzle views use FunctionEngine, and the only place where
             // they are available are I_S and D_D schemas, where we do exact
             // counting
             if ($table_is_view && $current_table['TABLE_ROWS'] >= $GLOBALS['cfg']['MaxExactCountViews'] && $current_table['ENGINE'] != 'FunctionEngine') {
                 $approx_rows = true;
                 $show_superscript = PMA_Util::showHint(PMA_sanitize(sprintf(__('This view has at least this number of ' . 'rows. Please refer to %sdocumentation%s.'), '[doc@cfg_MaxExactCountViews]', '[/doc]')));
             }
         }
         $this->response->addHTML(Template::get('database/structure/structure_table_row')->render(array('db' => $this->db, 'curr' => $i, 'odd_row' => $odd_row, 'table_is_view' => $table_is_view, 'current_table' => $current_table, 'browse_table_label' => $browse_table_label, 'tracking_icon' => $tracking_icon, 'server_slave_status' => $GLOBALS['replication_info']['slave']['status'], 'browse_table' => $browse_table, 'tbl_url_query' => $tbl_url_query, 'search_table' => $search_table, 'db_is_system_schema' => $this->_db_is_system_schema, 'titles' => $titles, 'empty_table' => $empty_table, 'drop_query' => $drop_query, 'drop_message' => $drop_message, 'collation' => $collation, 'formatted_size' => $formatted_size, 'unit' => $unit, 'overhead' => $overhead, 'create_time' => isset($create_time) ? $create_time : '', 'update_time' => isset($update_time) ? $update_time : '', 'check_time' => isset($check_time) ? $check_time : '', 'is_show_stats' => $this->_is_show_stats, 'ignored' => $ignored, 'do' => $do, 'colspan_for_structure' => $GLOBALS['colspan_for_structure'], 'approx_rows' => $approx_rows, 'show_superscript' => $show_superscript, 'already_favorite' => $this->checkFavoriteTable($current_table['TABLE_NAME']))));
         $odd_row = !$odd_row;
         $overall_approx_rows = $overall_approx_rows || $approx_rows;
     }
     // end foreach
     // Show Summary
     $this->response->addHTML('</tbody>');
     $this->response->addHTML(Template::get('database/structure/body_for_table_summary')->render(array('num_tables' => $this->_num_tables, 'server_slave_status' => $GLOBALS['replication_info']['slave']['status'], 'db_is_system_schema' => $this->_db_is_system_schema, 'sum_entries' => $sum_entries, 'db_collation' => $db_collation, 'is_show_stats' => $this->_is_show_stats, 'sum_size' => $sum_size, 'overhead_size' => $overhead_size, 'create_time_all' => $create_time_all, 'update_time_all' => $update_time_all, 'check_time_all' => $check_time_all, 'approx_rows' => $overall_approx_rows)));
     $this->response->addHTML('</table>');
     //check all
     $this->response->addHTML(Template::get('database/structure/check_all_tables')->render(array('pmaThemeImage' => $GLOBALS['pmaThemeImage'], 'text_dir' => $GLOBALS['text_dir'], 'overhead_check' => $overhead_check, 'db_is_system_schema' => $this->_db_is_system_schema, 'hidden_fields' => $hidden_fields)));
     $this->response->addHTML('</form>');
     //end of form
     // display again the table list navigator
     $this->response->addHTML(PMA_Util::getListNavigator($this->_total_num_tables, $this->_pos, $_url_params, 'db_structure.php', 'frame_content', $GLOBALS['cfg']['MaxTableList']));
     $this->response->addHTML('</div><hr />');
     /**
      * Work on the database
      */
     /* DATABASE WORK */
     /* Printable view of a table */
     $this->response->addHTML(Template::get('database/structure/print_view_data_dictionary_link')->render(array('url_query' => $this->_url_query)));
     if (empty($db_is_system_schema)) {
         $this->response->addHTML(PMA_getHtmlForCreateTable($this->db));
     }
 }
 /**
  * Displays the list of tables
  *
  * @return void
  */
 protected function displayTableList()
 {
     // table form
     $this->response->addHTML(Template::get('database/structure/table_header')->render(array('db' => $this->db, 'db_is_system_schema' => $this->_db_is_system_schema, 'replication' => $GLOBALS['replication_info']['slave']['status'])));
     $i = $sum_entries = 0;
     $overhead_check = '';
     $create_time_all = '';
     $update_time_all = '';
     $check_time_all = '';
     $num_columns = $GLOBALS['cfg']['PropertiesNumColumns'] > 1 ? ceil($this->_num_tables / $GLOBALS['cfg']['PropertiesNumColumns']) + 1 : 0;
     $row_count = 0;
     $sum_size = (double) 0;
     $overhead_size = (double) 0;
     $hidden_fields = array();
     $odd_row = true;
     $overall_approx_rows = false;
     foreach ($this->_tables as $keyname => $current_table) {
         // Get valid statistics whatever is the table type
         $drop_query = '';
         $drop_message = '';
         $overhead = '';
         $table_is_view = false;
         $table_encoded = urlencode($current_table['TABLE_NAME']);
         // Sets parameters for links
         $tbl_url_query = $this->_url_query . '&amp;table=' . $table_encoded;
         // do not list the previous table's size info for a view
         list($current_table, $formatted_size, $unit, $formatted_overhead, $overhead_unit, $overhead_size, $table_is_view, $sum_size) = $this->getStuffForEngineTypeTable($current_table, $sum_size, $overhead_size);
         $curTable = $this->dbi->getTable($this->db, $current_table['TABLE_NAME']);
         if (!$curTable->isMerge()) {
             $sum_entries += $current_table['TABLE_ROWS'];
         }
         if (isset($current_table['Collation'])) {
             $collation = '<dfn title="' . PMA_getCollationDescr($current_table['Collation']) . '">' . $current_table['Collation'] . '</dfn>';
         } else {
             $collation = '---';
         }
         if ($this->_is_show_stats) {
             if ($formatted_overhead != '') {
                 $overhead = '<a href="tbl_structure.php' . $tbl_url_query . '#showusage">' . '<span>' . $formatted_overhead . '</span>&nbsp;' . '<span class="unit">' . $overhead_unit . '</span>' . '</a>' . "\n";
                 $overhead_check .= "markAllRows('row_tbl_" . ($i + 1) . "');";
             } else {
                 $overhead = '-';
             }
         }
         // end if
         $showtable = $this->dbi->getTable($this->db, $current_table['TABLE_NAME'])->getStatusInfo(null, true);
         if ($GLOBALS['cfg']['ShowDbStructureCreation']) {
             $create_time = isset($showtable['Create_time']) ? $showtable['Create_time'] : '';
             if ($create_time && (!$create_time_all || $create_time < $create_time_all)) {
                 $create_time_all = $create_time;
             }
         }
         if ($GLOBALS['cfg']['ShowDbStructureLastUpdate']) {
             // $showtable might already be set from ShowDbStructureCreation,
             // see above
             $update_time = isset($showtable['Update_time']) ? $showtable['Update_time'] : '';
             if ($update_time && (!$update_time_all || $update_time < $update_time_all)) {
                 $update_time_all = $update_time;
             }
         }
         if ($GLOBALS['cfg']['ShowDbStructureLastCheck']) {
             // $showtable might already be set from ShowDbStructureCreation,
             // see above
             $check_time = isset($showtable['Check_time']) ? $showtable['Check_time'] : '';
             if ($check_time && (!$check_time_all || $check_time < $check_time_all)) {
                 $check_time_all = $check_time;
             }
         }
         $truename = htmlspecialchars(!empty($tooltip_truename) && isset($tooltip_truename[$current_table['TABLE_NAME']]) ? $tooltip_truename[$current_table['TABLE_NAME']] : $current_table['TABLE_NAME']);
         $truename = str_replace(' ', '&nbsp;', $truename);
         $i++;
         $row_count++;
         if ($table_is_view) {
             $hidden_fields[] = '<input type="hidden" name="views[]" value="' . htmlspecialchars($current_table['TABLE_NAME']) . '" />';
         }
         /*
          * Always activate links for Browse, Search and Empty, even if
          * the icons are greyed, because
          * 1. for views, we don't know the number of rows at this point
          * 2. for tables, another source could have populated them since the
          *    page was generated
          *
          * I could have used the PHP ternary conditional operator but I find
          * the code easier to read without this operator.
          */
         $may_have_rows = $current_table['TABLE_ROWS'] > 0 || $table_is_view;
         $titles = Util::buildActionTitles();
         $browse_table = Template::get('database/structure/browse_table')->render(array('tbl_url_query' => $tbl_url_query, 'title' => $may_have_rows ? $titles['Browse'] : $titles['NoBrowse']));
         $search_table = Template::get('database/structure/search_table')->render(array('tbl_url_query' => $tbl_url_query, 'title' => $may_have_rows ? $titles['Search'] : $titles['NoSearch']));
         $browse_table_label = Template::get('database/structure/browse_table_label')->render(array('tbl_url_query' => $tbl_url_query, 'title' => htmlspecialchars($current_table['TABLE_COMMENT']), 'truename' => $truename));
         $empty_table = '';
         if (!$this->_db_is_system_schema) {
             $empty_table = '&nbsp;';
             if (!$table_is_view) {
                 $empty_table = Template::get('database/structure/empty_table')->render(array('tbl_url_query' => $tbl_url_query, 'sql_query' => urlencode('TRUNCATE ' . Util::backquote($current_table['TABLE_NAME'])), 'message_to_show' => urlencode(sprintf(__('Table %s has been emptied.'), htmlspecialchars($current_table['TABLE_NAME']))), 'title' => $may_have_rows ? $titles['Empty'] : $titles['NoEmpty']));
             }
             $drop_query = sprintf('DROP %s %s', $table_is_view || $current_table['ENGINE'] == null ? 'VIEW' : 'TABLE', Util::backquote($current_table['TABLE_NAME']));
             $drop_message = sprintf($table_is_view || $current_table['ENGINE'] == null ? __('View %s has been dropped.') : __('Table %s has been dropped.'), str_replace(' ', '&nbsp;', htmlspecialchars($current_table['TABLE_NAME'])));
         }
         if ($num_columns > 0 && $this->_num_tables > $num_columns && $row_count % $num_columns == 0) {
             $row_count = 1;
             $odd_row = true;
             $this->response->addHTML('</tr></tbody></table></form>');
             $this->response->addHTML(Template::get('database/structure/table_header')->render(array('db' => $this->db, 'db_is_system_schema' => $this->_db_is_system_schema, 'replication' => $GLOBALS['replication_info']['slave']['status'])));
         }
         list($approx_rows, $show_superscript) = $this->isRowCountApproximated($current_table, $table_is_view);
         list($do, $ignored) = $this->getReplicationStatus($truename);
         $this->response->addHTML(Template::get('database/structure/structure_table_row')->render(array('db' => $this->db, 'curr' => $i, 'odd_row' => $odd_row, 'table_is_view' => $table_is_view, 'current_table' => $current_table, 'browse_table_label' => $browse_table_label, 'tracking_icon' => $this->getTrackingIcon($truename), 'server_slave_status' => $GLOBALS['replication_info']['slave']['status'], 'browse_table' => $browse_table, 'tbl_url_query' => $tbl_url_query, 'search_table' => $search_table, 'db_is_system_schema' => $this->_db_is_system_schema, 'titles' => $titles, 'empty_table' => $empty_table, 'drop_query' => $drop_query, 'drop_message' => $drop_message, 'collation' => $collation, 'formatted_size' => $formatted_size, 'unit' => $unit, 'overhead' => $overhead, 'create_time' => isset($create_time) ? $create_time : '', 'update_time' => isset($update_time) ? $update_time : '', 'check_time' => isset($check_time) ? $check_time : '', 'is_show_stats' => $this->_is_show_stats, 'ignored' => $ignored, 'do' => $do, 'colspan_for_structure' => $GLOBALS['colspan_for_structure'], 'approx_rows' => $approx_rows, 'show_superscript' => $show_superscript, 'already_favorite' => $this->checkFavoriteTable($current_table['TABLE_NAME']))));
         $odd_row = !$odd_row;
         $overall_approx_rows = $overall_approx_rows || $approx_rows;
     }
     // end foreach
     $this->response->addHTML('</tbody>');
     $db_collation = PMA_getDbCollation($this->db);
     // Show Summary
     $this->response->addHTML(Template::get('database/structure/body_for_table_summary')->render(array('num_tables' => $this->_num_tables, 'server_slave_status' => $GLOBALS['replication_info']['slave']['status'], 'db_is_system_schema' => $this->_db_is_system_schema, 'sum_entries' => $sum_entries, 'db_collation' => $db_collation, 'is_show_stats' => $this->_is_show_stats, 'sum_size' => $sum_size, 'overhead_size' => $overhead_size, 'create_time_all' => $create_time_all, 'update_time_all' => $update_time_all, 'check_time_all' => $check_time_all, 'approx_rows' => $overall_approx_rows)));
     $this->response->addHTML('</table>');
     //check all
     $this->response->addHTML(Template::get('database/structure/check_all_tables')->render(array('pmaThemeImage' => $GLOBALS['pmaThemeImage'], 'text_dir' => $GLOBALS['text_dir'], 'overhead_check' => $overhead_check, 'db_is_system_schema' => $this->_db_is_system_schema, 'hidden_fields' => $hidden_fields)));
     $this->response->addHTML('</form>');
     //end of form
 }
Ejemplo n.º 9
0
function convert_one_db($db)
{
    global $alterdatabasecharset;
    global $altertablecharset;
    global $charset;
    global $collate;
    global $printonly;
    global $db_handle;
    $db_cha = PMA_getDbCollation($db);
    if (substr($db_cha[0], 0, 4) == 'utf8') {
        // This doesn't work for me, but isn't a big deal, as the table
        // check below works
        echo "Skipping utf8 database '{$db}'\n";
        return;
    }
    sql_command("USE {$db}", $db_handle);
    $rs = sql_query("SHOW TABLES", $db_handle);
    if (!$rs) {
        echo "\n\n" . sql_error($db_handle) . "\n\n";
    } else {
        for ($i = 0; $data = sql_row($rs, $i, $db_handle); $i++) {
            echo "Converting '{$data['0']}' table...\n";
            $rs1 = sql_query("show FULL columns from {$data['0']}", $db_handle);
            if (!$rs1) {
                echo "\n\n" . sql_error($db_handle) . "\n\n";
            } else {
                for ($j = 0; $data1 = sql_row_keyed($rs1, $j, $db_handle); $j++) {
                    if (in_array(array_shift(split("\\(", $data1['Type'], 2)), array('char', 'varchar', 'tinytext', 'text', 'mediumtext', 'longtext', 'enum', 'set'))) {
                        if (substr($data1['Collation'], 0, 4) != 'utf8') {
                            $sq = "ALTER TABLE `{$data['0']}` CHANGE `" . $data1['Field'] . '` `' . $data1['Field'] . '` ' . $data1['Type'] . ' CHARACTER SET binary ' . ($data1['Default'] == '' ? '' : ($data1['Default'] == 'NULL' ? ' DEFAULT NULL' : ' DEFAULT \'' . addslashes($data1['Default']) . '\'')) . ($data1['Null'] == 'YES' ? ' NULL ' : ' NOT NULL');
                            if (!$printonly && !sql_query($sq, $db_handle)) {
                                echo "\n\n" . $sq . "\n" . sql_error($db_handle) . "\n\n";
                            } else {
                                if ($printonly) {
                                    echo $sq . "\n";
                                }
                                $sq = "ALTER TABLE `{$data['0']}` CHANGE `" . $data1['Field'] . '` `' . $data1['Field'] . '` ' . $data1['Type'] . " CHARACTER SET {$charset} " . ($collate == '' ? '' : "COLLATE {$collate}") . ($data1['Default'] == '' ? '' : ($data1['Default'] == 'NULL' ? ' DEFAULT NULL' : ' DEFAULT \'' . addslashes($data1['Default']) . '\'')) . ($data1['Null'] == 'YES' ? ' NULL ' : ' NOT NULL') . ($data1['Comment'] == '' ? '' : ' COMMENT \'' . addslashes($data1['Comment']) . '\'');
                                if (!$printonly && !sql_query($sq, $db_handle)) {
                                    echo "\n\n" . $sq . "\n" . sql_error($db_handle) . "\n\n";
                                } else {
                                    if ($printonly) {
                                        echo $sq . "\n";
                                    }
                                }
                            }
                            // end of if (!$printonly)
                        }
                        // end of if (substr)
                    }
                    // end of if (in_array)
                }
                // end of inner for
            }
            // end of if ($rs1)
            if ($altertablecharset) {
                $sq = 'ALTER TABLE `' . $data[0] . "` " . "DEFAULT CHARACTER SET {$charset} " . ($collate == '' ? '' : "COLLATE {$collate}");
                if ($printonly) {
                    echo $sq . "\n";
                } else {
                    if (!sql_query($sq, $db_handle)) {
                        echo "\n\n" . $sq . "\n" . sql_error($db_handle) . "\n\n";
                    }
                }
            }
            // end of if ($altertablecharset)
            print "done.<br>\n";
        }
        // end of outer for
    }
    // end of if (!$rs)
    if ($alterdatabasecharset) {
        $sq = 'ALTER DATABASE `' . $db . "` " . "DEFAULT CHARACTER SET {$charset} " . ($collate == '' ? '' : "COLLATE {$collate}");
        if ($printonly) {
            echo $sq . "\n";
        } else {
            if (!sql_query($sq, $db_handle)) {
                echo "\n\n" . $sq . "\n" . sql_error($db_handle) . "\n\n";
            }
        }
    }
    // end of if ($alterdatabasecharset)
}
 /**
  * Test for PMA_getDbCollation
  *
  * @return void
  * @test
  */
 public function testGetDbCollation()
 {
     if (!PMA_HAS_RUNKIT) {
         $this->markTestSkipped('Cannot redefine constant - missing runkit extension');
     } else {
         $GLOBALS['server'] = 1;
         // test case for system schema
         $this->assertEquals('utf8_general_ci', PMA_getDbCollation("information_schema"));
         $restoreDrizzle = '';
         // test case with no pma drizzle
         if (defined('PMA_DRIZZLE')) {
             $restoreDrizzle = PMA_DRIZZLE;
             runkit_constant_redefine('PMA_DRIZZLE', false);
         } else {
             $restoreDrizzle = 'PMA_TEST_CONSTANT_REMOVE';
             define('PMA_DRIZZLE', false);
         }
         $GLOBALS['cfg']['Server']['DisableIS'] = false;
         $GLOBALS['cfg']['DBG']['sql'] = false;
         $this->assertEquals('utf8_general_ci', PMA_getDbCollation('pma_test'));
         // test case with pma drizzle as true
         runkit_constant_redefine('PMA_DRIZZLE', true);
         $this->assertEquals('utf8_general_ci_pma_drizzle', PMA_getDbCollation('pma_test'));
         $GLOBALS['cfg']['Server']['DisableIS'] = true;
         $GLOBALS['db'] = 'pma_test2';
         $this->assertEquals('bar', PMA_getDbCollation('pma_test'));
         $this->assertNotEquals('pma_test', $GLOBALS['dummy_db']);
         if ($restoreDrizzle === 'PMA_TEST_CONSTANT_REMOVE') {
             runkit_constant_remove('PMA_DRIZZLE');
         } else {
             runkit_constant_redefine('PMA_DRIZZLE', $restoreDrizzle);
         }
     }
 }
/**
 * returns array with databases containing extended infos about them
 *
 * @param   string          $databases      database
 * @param   boolean         $force_stats    retrieve stats also for MySQL < 5
 * @param   resource        $link           mysql link
 * @param   string          $sort_by        collumn to order by
 * @param   string          $sort_order     ASC or DESC
 * @param   integer         $limit_offset   starting offset for LIMIT
 * @param   bool|int        $limit_count    row count for LIMIT or true for $GLOBALS['cfg']['MaxDbList']
 * @return  array       $databases
 */
function PMA_DBI_get_databases_full($database = null, $force_stats = false, $link = null, $sort_by = 'SCHEMA_NAME', $sort_order = 'ASC', $limit_offset = 0, $limit_count = false)
{
    $sort_order = strtoupper($sort_order);
    if (true === $limit_count) {
        $limit_count = $GLOBALS['cfg']['MaxDbList'];
    }
    // initialize to avoid errors when there are no databases
    $databases = array();
    $apply_limit_and_order_manual = true;
    if (PMA_MYSQL_INT_VERSION >= 50002) {
        /**
         * if $GLOBALS['cfg']['NaturalOrder'] is enabled, we cannot use LIMIT
         * cause MySQL does not support natural ordering, we have to do it afterward
         */
        if ($GLOBALS['cfg']['NaturalOrder']) {
            $limit = '';
        } else {
            if ($limit_count) {
                $limit = ' LIMIT ' . $limit_count . ' OFFSET ' . $limit_offset;
            }
            $apply_limit_and_order_manual = false;
        }
        // get table information from information_schema
        if ($database) {
            $sql_where_schema = 'WHERE `SCHEMA_NAME` LIKE \'' . addslashes($database) . '\'';
        } else {
            $sql_where_schema = '';
        }
        // for PMA bc:
        // `SCHEMA_FIELD_NAME` AS `SHOW_TABLE_STATUS_FIELD_NAME`
        $sql = '
             SELECT `information_schema`.`SCHEMATA`.*';
        if ($force_stats) {
            $sql .= ',
                    COUNT(`information_schema`.`TABLES`.`TABLE_SCHEMA`)
                        AS `SCHEMA_TABLES`,
                    SUM(`information_schema`.`TABLES`.`TABLE_ROWS`)
                        AS `SCHEMA_TABLE_ROWS`,
                    SUM(`information_schema`.`TABLES`.`DATA_LENGTH`)
                        AS `SCHEMA_DATA_LENGTH`,
                    SUM(`information_schema`.`TABLES`.`MAX_DATA_LENGTH`)
                        AS `SCHEMA_MAX_DATA_LENGTH`,
                    SUM(`information_schema`.`TABLES`.`INDEX_LENGTH`)
                        AS `SCHEMA_INDEX_LENGTH`,
                    SUM(`information_schema`.`TABLES`.`DATA_LENGTH`
                      + `information_schema`.`TABLES`.`INDEX_LENGTH`)
                        AS `SCHEMA_LENGTH`,
                    SUM(`information_schema`.`TABLES`.`DATA_FREE`)
                        AS `SCHEMA_DATA_FREE`';
        }
        $sql .= '
               FROM `information_schema`.`SCHEMATA`';
        if ($force_stats) {
            $sql .= '
          LEFT JOIN `information_schema`.`TABLES`
                 ON `information_schema`.`TABLES`.`TABLE_SCHEMA`
                  = `information_schema`.`SCHEMATA`.`SCHEMA_NAME`';
        }
        $sql .= '
              ' . $sql_where_schema . '
           GROUP BY `information_schema`.`SCHEMATA`.`SCHEMA_NAME`
           ORDER BY ' . PMA_backquote($sort_by) . ' ' . $sort_order . $limit;
        $databases = PMA_DBI_fetch_result($sql, 'SCHEMA_NAME', null, $link);
        unset($sql_where_schema, $sql);
    } else {
        foreach (PMA_DBI_get_dblist($link) as $database_name) {
            // MySQL forward compatibility
            // so pma could use this array as if every server is of version >5.0
            $databases[$database_name]['SCHEMA_NAME'] = $database_name;
            if ($force_stats) {
                require_once 'mysql_charsets.lib.php';
                $databases[$database_name]['DEFAULT_COLLATION_NAME'] = PMA_getDbCollation($database_name);
                // get additonal info about tables
                $databases[$database_name]['SCHEMA_TABLES'] = 0;
                $databases[$database_name]['SCHEMA_TABLE_ROWS'] = 0;
                $databases[$database_name]['SCHEMA_DATA_LENGTH'] = 0;
                $databases[$database_name]['SCHEMA_MAX_DATA_LENGTH'] = 0;
                $databases[$database_name]['SCHEMA_INDEX_LENGTH'] = 0;
                $databases[$database_name]['SCHEMA_LENGTH'] = 0;
                $databases[$database_name]['SCHEMA_DATA_FREE'] = 0;
                $res = PMA_DBI_query('SHOW TABLE STATUS FROM ' . PMA_backquote($database_name) . ';');
                while ($row = PMA_DBI_fetch_assoc($res)) {
                    $databases[$database_name]['SCHEMA_TABLES']++;
                    $databases[$database_name]['SCHEMA_TABLE_ROWS'] += $row['Rows'];
                    $databases[$database_name]['SCHEMA_DATA_LENGTH'] += $row['Data_length'];
                    $databases[$database_name]['SCHEMA_MAX_DATA_LENGTH'] += $row['Max_data_length'];
                    $databases[$database_name]['SCHEMA_INDEX_LENGTH'] += $row['Index_length'];
                    $databases[$database_name]['SCHEMA_DATA_FREE'] += $row['Data_free'];
                    $databases[$database_name]['SCHEMA_LENGTH'] += $row['Data_length'] + $row['Index_length'];
                }
                PMA_DBI_free_result($res);
                unset($res);
            }
        }
    }
    /**
     * apply limit and order manually now
     * (caused by older MySQL < 5 or $GLOBALS['cfg']['NaturalOrder'])
     */
    if ($apply_limit_and_order_manual) {
        /**
         * first apply ordering
         */
        if ($GLOBALS['cfg']['NaturalOrder']) {
            $sorter = 'strnatcasecmp';
        } else {
            $sorter = 'strcasecmp';
        }
        // produces f.e.:
        // return -1 * strnatcasecmp($a["SCHEMA_TABLES"], $b["SCHEMA_TABLES"])
        $sort_function = '
            return ' . ($sort_order == 'ASC' ? 1 : -1) . ' * ' . $sorter . '($a["' . $sort_by . '"], $b["' . $sort_by . '"]);
        ';
        usort($databases, create_function('$a, $b', $sort_function));
        /**
         * now apply limit
         */
        if ($limit_count) {
            $databases = array_slice($databases, $limit_offset, $limit_count);
        }
    }
    return $databases;
}
/**
 * returns array with databases containing extended infos about them
 *
 * @param   string          $databases      database
 * @param   boolean         $force_stats    retrieve stats also for MySQL < 5
 * @param   resource        $link           mysql link
 * @return  array       $databases
 */
function PMA_DBI_get_databases_full($database = NULL, $force_stats = false, $link = NULL)
{
    // initialize to avoid errors when there are no databases
    $databases = array();
    if (PMA_MYSQL_INT_VERSION >= 50002) {
        // get table information from information_schema
        if ($database) {
            $sql_where_schema = 'WHERE `SCHEMA_NAME` LIKE \'' . addslashes($database) . '\'';
        } else {
            $sql_where_schema = '';
        }
        // for PMA bc:
        // `SCHEMA_FIELD_NAME` AS `SHOW_TABLE_STATUS_FIELD_NAME`
        $sql = '
             SELECT `information_schema`.`SCHEMATA`.*,
                    COUNT(`information_schema`.`TABLES`.`TABLE_SCHEMA`)
                        AS `SCHEMA_TABLES`,
                    SUM(`information_schema`.`TABLES`.`TABLE_ROWS`)
                        AS `SCHEMA_TABLE_ROWS`,
                    SUM(`information_schema`.`TABLES`.`DATA_LENGTH`)
                        AS `SCHEMA_DATA_LENGTH`,
                    SUM(`information_schema`.`TABLES`.`MAX_DATA_LENGTH`)
                        AS `SCHEMA_MAX_DATA_LENGTH`,
                    SUM(`information_schema`.`TABLES`.`INDEX_LENGTH`)
                        AS `SCHEMA_INDEX_LENGTH`,
                    SUM(`information_schema`.`TABLES`.`DATA_LENGTH`
                      + `information_schema`.`TABLES`.`INDEX_LENGTH`)
                        AS `SCHEMA_LENGTH`,
                    SUM(`information_schema`.`TABLES`.`DATA_FREE`)
                        AS `SCHEMA_DATA_FREE`
               FROM `information_schema`.`SCHEMATA`
          LEFT JOIN `information_schema`.`TABLES`
                 ON `information_schema`.`TABLES`.`TABLE_SCHEMA`
                  = `information_schema`.`SCHEMATA`.`SCHEMA_NAME`
              ' . $sql_where_schema . '
           GROUP BY `information_schema`.`SCHEMATA`.`SCHEMA_NAME`';
        $databases = PMA_DBI_fetch_result($sql, 'SCHEMA_NAME', NULL, $link);
        unset($sql_where_schema, $sql);
    } else {
        foreach (PMA_DBI_get_dblist($link) as $database_name) {
            // MySQL forward compatibility
            // so pma could use this array as if every server is of version >5.0
            $databases[$database_name]['SCHEMA_NAME'] = $database_name;
            if ($force_stats) {
                require_once 'mysql_charsets.lib.php';
                $databases[$database_name]['DEFAULT_COLLATION_NAME'] = PMA_getDbCollation($database_name);
                // get additonal info about tables
                $databases[$database_name]['SCHEMA_TABLES'] = 0;
                $databases[$database_name]['SCHEMA_TABLE_ROWS'] = 0;
                $databases[$database_name]['SCHEMA_DATA_LENGTH'] = 0;
                $databases[$database_name]['SCHEMA_MAX_DATA_LENGTH'] = 0;
                $databases[$database_name]['SCHEMA_INDEX_LENGTH'] = 0;
                $databases[$database_name]['SCHEMA_LENGTH'] = 0;
                $databases[$database_name]['SCHEMA_DATA_FREE'] = 0;
                $res = PMA_DBI_query('SHOW TABLE STATUS FROM ' . PMA_backquote($database_name) . ';');
                while ($row = PMA_DBI_fetch_assoc($res)) {
                    $databases[$database_name]['SCHEMA_TABLES']++;
                    $databases[$database_name]['SCHEMA_TABLE_ROWS'] += $row['Rows'];
                    $databases[$database_name]['SCHEMA_DATA_LENGTH'] += $row['Data_length'];
                    $databases[$database_name]['SCHEMA_MAX_DATA_LENGTH'] += $row['Max_data_length'];
                    $databases[$database_name]['SCHEMA_INDEX_LENGTH'] += $row['Index_length'];
                    $databases[$database_name]['SCHEMA_DATA_FREE'] += $row['Data_free'];
                    $databases[$database_name]['SCHEMA_LENGTH'] += $row['Data_length'] + $row['Index_length'];
                }
                PMA_DBI_free_result($res);
                unset($res);
            }
        }
    }
    if ($GLOBALS['cfg']['NaturalOrder']) {
        uksort($databases, 'strnatcasecmp');
    }
    return $databases;
}
Ejemplo n.º 13
0
 /**
  * Outputs CREATE DATABASE database
  *
  * @param   string      Database name
  *
  * @return  bool        Whether it suceeded
  *
  * @access  public
  */
 function PMA_exportDBCreate($db)
 {
     global $crlf;
     if (isset($GLOBALS['sql_drop_database'])) {
         if (!PMA_exportOutputHandler('DROP DATABASE ' . (isset($GLOBALS['sql_backquotes']) ? PMA_backquote($db) : $db) . ';' . $crlf)) {
             return FALSE;
         }
     }
     $create_query = 'CREATE DATABASE ' . (isset($GLOBALS['sql_backquotes']) ? PMA_backquote($db) : $db);
     $collation = PMA_getDbCollation($db);
     if (strpos($collation, '_')) {
         $create_query .= ' DEFAULT CHARACTER SET ' . substr($collation, 0, strpos($collation, '_')) . ' COLLATE ' . $collation;
     } else {
         $create_query .= ' DEFAULT CHARACTER SET ' . $collation;
     }
     $create_query .= ';' . $crlf;
     if (!PMA_exportOutputHandler($create_query)) {
         return FALSE;
     }
     if (isset($GLOBALS['sql_backquotes']) && isset($GLOBALS['sql_compatibility']) && $GLOBALS['sql_compatibility'] == 'NONE') {
         $result = PMA_exportOutputHandler('USE ' . PMA_backquote($db) . ';' . $crlf);
     } else {
         $result = PMA_exportOutputHandler('USE ' . $db . ';' . $crlf);
     }
     if ($result && isset($GLOBALS['sql_structure']) && isset($GLOBALS['sql_procedure_function'])) {
         $text = '';
         $delimiter = '$$';
         $procedure_names = PMA_DBI_get_procedures_or_functions($db, 'PROCEDURE');
         $function_names = PMA_DBI_get_procedures_or_functions($db, 'FUNCTION');
         if ($procedure_names || $function_names) {
             $text .= $crlf . 'DELIMITER ' . $delimiter . $crlf;
         }
         if ($procedure_names) {
             $text .= PMA_exportComment() . PMA_exportComment($GLOBALS['strProcedures']) . PMA_exportComment();
             foreach ($procedure_names as $procedure_name) {
                 if (!empty($GLOBALS['sql_drop_table'])) {
                     $text .= 'DROP PROCEDURE IF EXISTS ' . PMA_backquote($procedure_name) . $delimiter . $crlf;
                 }
                 $text .= PMA_DBI_get_definition($db, 'PROCEDURE', $procedure_name) . $delimiter . $crlf . $crlf;
             }
         }
         if ($function_names) {
             $text .= PMA_exportComment() . PMA_exportComment($GLOBALS['strFunctions']) . PMA_exportComment();
             foreach ($function_names as $function_name) {
                 if (!empty($GLOBALS['sql_drop_table'])) {
                     $text .= 'DROP FUNCTION IF EXISTS ' . PMA_backquote($function_name) . $delimiter . $crlf;
                 }
                 $text .= PMA_DBI_get_definition($db, 'FUNCTION', $function_name) . $delimiter . $crlf . $crlf;
             }
         }
         if ($procedure_names || $function_names) {
             $text .= 'DELIMITER ;' . $crlf;
         }
         if (!empty($text)) {
             $result = PMA_exportOutputHandler($text);
         }
     }
     return $result;
 }
 /**
  * Index action
  *
  * @return void
  */
 public function indexAction()
 {
     // Database structure
     if ($this->_type == 'db') {
         // Add/Remove favorite tables using Ajax request.
         if ($GLOBALS['is_ajax_request'] && !empty($_REQUEST['favorite_table'])) {
             $this->addRemoveFavoriteTables();
             return;
         }
         $this->response->getHeader()->getScripts()->addFiles(array('db_structure.js', 'tbl_change.js', 'jquery/jquery-ui-timepicker-addon.js'));
         // Drops/deletes/etc. multiple tables if required
         if (!empty($_POST['submit_mult']) && isset($_POST['selected_tbl']) || isset($_POST['mult_btn'])) {
             $action = 'db_structure.php';
             $err_url = 'db_structure.php' . PMA_URL_getCommon(array('db' => $this->_db));
             // see bug #2794840; in this case, code path is:
             // db_structure.php -> libraries/mult_submits.inc.php -> sql.php
             // -> db_structure.php and if we got an error on the multi submit,
             // we must display it here and not call again mult_submits.inc.php
             if (!isset($_POST['error']) || false === $_POST['error']) {
                 include 'libraries/mult_submits.inc.php';
             }
             if (empty($_POST['message'])) {
                 $_POST['message'] = PMA_Message::success();
             }
         }
         $this->_url_query .= '&amp;goto=db_structure.php';
         // Gets the database structure
         $sub_part = '_structure';
         // If there is an Ajax request for real row count of a table.
         if ($GLOBALS['is_ajax_request'] && isset($_REQUEST['real_row_count']) && $_REQUEST['real_row_count'] == true) {
             $this->handleRealRowCountRequestAction();
             return;
         }
         if (!PMA_DRIZZLE) {
             include_once 'libraries/replication.inc.php';
         } else {
             $GLOBALS['replication_info']['slave']['status'] = false;
         }
         PMA_PageSettings::showGroup('DbStructure');
         $db_collation = PMA_getDbCollation($this->_db);
         $titles = PMA_Util::buildActionTitles();
         // 1. No tables
         if ($this->_num_tables == 0) {
             $this->response->addHTML(PMA_message::notice(__('No tables found in database.')));
             if (empty($db_is_system_schema)) {
                 $this->response->addHTML(PMA_getHtmlForCreateTable($this->_db));
             }
             return;
         }
         // else
         // 2. Shows table information
         /**
          * Displays the tables list
          */
         $this->response->addHTML('<div id="tableslistcontainer">');
         $_url_params = array('pos' => $this->_pos, 'db' => $this->_db);
         // Add the sort options if they exists
         if (isset($_REQUEST['sort'])) {
             $_url_params['sort'] = $_REQUEST['sort'];
         }
         if (isset($_REQUEST['sort_order'])) {
             $_url_params['sort_order'] = $_REQUEST['sort_order'];
         }
         $this->response->addHTML(PMA_Util::getListNavigator($this->_total_num_tables, $this->_pos, $_url_params, 'db_structure.php', 'frame_content', $GLOBALS['cfg']['MaxTableList']));
         // table form
         $this->response->addHTML(Template::get('structure/table_header')->render(array('db' => $this->_db, 'db_is_system_schema' => $this->_db_is_system_schema, 'replication' => $GLOBALS['replication_info']['slave']['status'])));
         $i = $sum_entries = 0;
         $overhead_check = '';
         $create_time_all = '';
         $update_time_all = '';
         $check_time_all = '';
         $num_columns = $GLOBALS['cfg']['PropertiesNumColumns'] > 1 ? ceil($this->_num_tables / $GLOBALS['cfg']['PropertiesNumColumns']) + 1 : 0;
         $row_count = 0;
         $sum_size = (double) 0;
         $overhead_size = (double) 0;
         $hidden_fields = array();
         $odd_row = true;
         $overall_approx_rows = false;
         // Instance of PMA_RecentFavoriteTable class.
         $fav_instance = PMA_RecentFavoriteTable::getInstance('favorite');
         foreach ($this->_tables as $keyname => $current_table) {
             // Get valid statistics whatever is the table type
             $drop_query = '';
             $drop_message = '';
             $already_favorite = false;
             $overhead = '';
             $table_is_view = false;
             $table_encoded = urlencode($current_table['TABLE_NAME']);
             // Sets parameters for links
             $tbl_url_query = $this->_url_query . '&amp;table=' . $table_encoded;
             // do not list the previous table's size info for a view
             list($current_table, $formatted_size, $unit, $formatted_overhead, $overhead_unit, $overhead_size, $table_is_view, $sum_size) = $this->getStuffForEngineTypeTable($current_table, $this->_db_is_system_schema, $this->_is_show_stats, $sum_size, $overhead_size);
             if (!$this->dbi->getTable($this->_db, $current_table['TABLE_NAME'])->isMerge()) {
                 $sum_entries += $current_table['TABLE_ROWS'];
             }
             if (isset($current_table['Collation'])) {
                 $collation = '<dfn title="' . PMA_getCollationDescr($current_table['Collation']) . '">' . $current_table['Collation'] . '</dfn>';
             } else {
                 $collation = '---';
             }
             if ($this->_is_show_stats) {
                 if ($formatted_overhead != '') {
                     $overhead = '<a href="tbl_structure.php' . $tbl_url_query . '#showusage">' . '<span>' . $formatted_overhead . '</span>&nbsp;' . '<span class="unit">' . $overhead_unit . '</span>' . '</a>' . "\n";
                     $overhead_check .= "markAllRows('row_tbl_" . ($i + 1) . "');";
                 } else {
                     $overhead = '-';
                 }
             }
             // end if
             $showtable = $this->dbi->getTable($this->_db, $current_table['TABLE_NAME'])->sGetStatusInfo(null, true);
             if ($GLOBALS['cfg']['ShowDbStructureCreation']) {
                 $create_time = isset($showtable['Create_time']) ? $showtable['Create_time'] : '';
                 if ($create_time && (!$create_time_all || $create_time < $create_time_all)) {
                     $create_time_all = $create_time;
                 }
             }
             if ($GLOBALS['cfg']['ShowDbStructureLastUpdate']) {
                 // $showtable might already be set from ShowDbStructureCreation,
                 // see above
                 $update_time = isset($showtable['Update_time']) ? $showtable['Update_time'] : '';
                 if ($update_time && (!$update_time_all || $update_time < $update_time_all)) {
                     $update_time_all = $update_time;
                 }
             }
             if ($GLOBALS['cfg']['ShowDbStructureLastCheck']) {
                 // $showtable might already be set from ShowDbStructureCreation,
                 // see above
                 $check_time = isset($showtable['Check_time']) ? $showtable['Check_time'] : '';
                 if ($check_time && (!$check_time_all || $check_time < $check_time_all)) {
                     $check_time_all = $check_time;
                 }
             }
             $alias = htmlspecialchars(!empty($tooltip_aliasname) && isset($tooltip_aliasname[$current_table['TABLE_NAME']]) ? $tooltip_aliasname[$current_table['TABLE_NAME']] : $current_table['TABLE_NAME']);
             $alias = str_replace(' ', '&nbsp;', $alias);
             $truename = htmlspecialchars(!empty($tooltip_truename) && isset($tooltip_truename[$current_table['TABLE_NAME']]) ? $tooltip_truename[$current_table['TABLE_NAME']] : $current_table['TABLE_NAME']);
             $truename = str_replace(' ', '&nbsp;', $truename);
             $i++;
             $row_count++;
             if ($table_is_view) {
                 $hidden_fields[] = '<input type="hidden" name="views[]" value="' . htmlspecialchars($current_table['TABLE_NAME']) . '" />';
             }
             /*
              * Always activate links for Browse, Search and Empty, even if
              * the icons are greyed, because
              * 1. for views, we don't know the number of rows at this point
              * 2. for tables, another source could have populated them since the
              *    page was generated
              *
              * I could have used the PHP ternary conditional operator but I find
              * the code easier to read without this operator.
              */
             $may_have_rows = $current_table['TABLE_ROWS'] > 0 || $table_is_view;
             $browse_table = Template::get('structure/browse_table')->render(array('tbl_url_query' => $tbl_url_query, 'title' => $may_have_rows ? $titles['Browse'] : $titles['NoBrowse']));
             $search_table = Template::get('structure/search_table')->render(array('tbl_url_query' => $tbl_url_query, 'title' => $may_have_rows ? $titles['Search'] : $titles['NoSearch']));
             $browse_table_label = Template::get('structure/browse_table_label')->render(array('tbl_url_query' => $tbl_url_query, 'title' => htmlspecialchars($current_table['TABLE_COMMENT']), 'truename' => $truename));
             $empty_table = '';
             if (!$this->_db_is_system_schema) {
                 $empty_table = '&nbsp;';
                 if (!$table_is_view) {
                     $empty_table = Template::get('structure/empty_table')->render(array('tbl_url_query' => $tbl_url_query, 'sql_query' => urlencode('TRUNCATE ' . PMA_Util::backquote($current_table['TABLE_NAME'])), 'message_to_show' => urlencode(sprintf(__('Table %s has been emptied.'), htmlspecialchars($current_table['TABLE_NAME']))), 'title' => $may_have_rows ? $titles['Empty'] : $titles['NoEmpty']));
                 }
                 $drop_query = sprintf('DROP %s %s', $table_is_view || $current_table['ENGINE'] == null ? 'VIEW' : 'TABLE', PMA_Util::backquote($current_table['TABLE_NAME']));
                 $drop_message = sprintf($table_is_view || $current_table['ENGINE'] == null ? __('View %s has been dropped.') : __('Table %s has been dropped.'), str_replace(' ', '&nbsp;', htmlspecialchars($current_table['TABLE_NAME'])));
             }
             $tracking_icon = '';
             if (PMA_Tracker::isActive()) {
                 $is_tracked = PMA_Tracker::isTracked($GLOBALS["db"], $truename);
                 if ($is_tracked || PMA_Tracker::getVersion($GLOBALS["db"], $truename) > 0) {
                     $tracking_icon = Template::get('structure/tracking_icon')->render(array('url_query' => $this->_url_query, 'truename' => $truename, 'is_tracked' => $is_tracked));
                 }
             }
             if ($num_columns > 0 && $this->_num_tables > $num_columns && $row_count % $num_columns == 0) {
                 $row_count = 1;
                 $odd_row = true;
                 $this->response->addHTML('</tr></tbody></table>');
                 $this->response->addHTML(Template::get('structure/table_header')->render(array('db_is_system_schema' => false, 'replication' => $GLOBALS['replication_info']['slave']['status'])));
             }
             $do = $ignored = false;
             $server_slave_status = $GLOBALS['replication_info']['slave']['status'];
             include_once 'libraries/replication.inc.php';
             if ($server_slave_status) {
                 $nbServSlaveDoDb = count($GLOBALS['replication_info']['slave']['Do_DB']);
                 $nbServSlaveIgnoreDb = count($GLOBALS['replication_info']['slave']['Ignore_DB']);
                 $searchDoDBInTruename = array_search($truename, $GLOBALS['replication_info']['slave']['Do_DB']);
                 $searchDoDBInDB = array_search($this->_db, $GLOBALS['replication_info']['slave']['Do_DB']);
                 $do = strlen($searchDoDBInTruename) > 0 || strlen($searchDoDBInDB) > 0 || $nbServSlaveDoDb == 1 && $nbServSlaveIgnoreDb == 1 || $this->hasTable($GLOBALS['replication_info']['slave']['Wild_Do_Table'], $truename);
                 $searchDb = array_search($this->_db, $GLOBALS['replication_info']['slave']['Ignore_DB']);
                 $searchTable = array_search($truename, $GLOBALS['replication_info']['slave']['Ignore_Table']);
                 $ignored = strlen($searchTable) > 0 || strlen($searchDb) > 0 || $this->hasTable($GLOBALS['replication_info']['slave']['Wild_Ignore_Table'], $truename);
             }
             // Handle favorite table list. ----START----
             $already_favorite = $this->checkFavoriteTable($current_table['TABLE_NAME']);
             if (isset($_REQUEST['remove_favorite'])) {
                 if ($already_favorite) {
                     // If already in favorite list, remove it.
                     $favorite_table = $_REQUEST['favorite_table'];
                     $fav_instance->remove($this->_db, $favorite_table);
                 }
             }
             if (isset($_REQUEST['add_favorite'])) {
                 if (!$already_favorite) {
                     // Otherwise add to favorite list.
                     $favorite_table = $_REQUEST['favorite_table'];
                     $fav_instance->add($this->_db, $favorite_table);
                 }
             }
             // Handle favorite table list. ----ENDS----
             $show_superscript = '';
             // there is a null value in the ENGINE
             // - when the table needs to be repaired, or
             // - when it's a view
             //  so ensure that we'll display "in use" below for a table
             //  that needs to be repaired
             $approx_rows = false;
             if (isset($current_table['TABLE_ROWS']) && ($current_table['ENGINE'] != null || $table_is_view)) {
                 // InnoDB table: we did not get an accurate row count
                 $approx_rows = !$table_is_view && $current_table['ENGINE'] == 'InnoDB' && !$current_table['COUNTED'];
                 // Drizzle views use FunctionEngine, and the only place where
                 // they are available are I_S and D_D schemas, where we do exact
                 // counting
                 if ($table_is_view && $current_table['TABLE_ROWS'] >= $GLOBALS['cfg']['MaxExactCountViews'] && $current_table['ENGINE'] != 'FunctionEngine') {
                     $approx_rows = true;
                     $show_superscript = PMA_Util::showHint(PMA_sanitize(sprintf(__('This view has at least this number of ' . 'rows. Please refer to %sdocumentation%s.'), '[doc@cfg_MaxExactCountViews]', '[/doc]')));
                 }
             }
             $this->response->addHTML(Template::get('structure/structure_table_row')->render(array('db' => $this->_db, 'curr' => $i, 'odd_row' => $odd_row, 'table_is_view' => $table_is_view, 'current_table' => $current_table, 'browse_table_label' => $browse_table_label, 'tracking_icon' => $tracking_icon, 'server_slave_status' => $GLOBALS['replication_info']['slave']['status'], 'browse_table' => $browse_table, 'tbl_url_query' => $tbl_url_query, 'search_table' => $search_table, 'db_is_system_schema' => $this->_db_is_system_schema, 'titles' => $titles, 'empty_table' => $empty_table, 'drop_query' => $drop_query, 'drop_message' => $drop_message, 'collation' => $collation, 'formatted_size' => $formatted_size, 'unit' => $unit, 'overhead' => $overhead, 'create_time' => isset($create_time) ? $create_time : '', 'update_time' => isset($update_time) ? $update_time : '', 'check_time' => isset($check_time) ? $check_time : '', 'is_show_stats' => $this->_is_show_stats, 'ignored' => $ignored, 'do' => $do, 'colspan_for_structure' => $GLOBALS['colspan_for_structure'], 'approx_rows' => $approx_rows, 'show_superscript' => $show_superscript, 'already_favorite' => $this->checkFavoriteTable($current_table['TABLE_NAME']))));
             $odd_row = !$odd_row;
             $overall_approx_rows = $overall_approx_rows || $approx_rows;
         }
         // end foreach
         // Show Summary
         $this->response->addHTML('</tbody>');
         $this->response->addHTML(Template::get('structure/body_for_table_summary')->render(array('num_tables' => $this->_num_tables, 'server_slave_status' => $GLOBALS['replication_info']['slave']['status'], 'db_is_system_schema' => $this->_db_is_system_schema, 'sum_entries' => $sum_entries, 'db_collation' => $db_collation, 'is_show_stats' => $this->_is_show_stats, 'sum_size' => $sum_size, 'overhead_size' => $overhead_size, 'create_time_all' => $create_time_all, 'update_time_all' => $update_time_all, 'check_time_all' => $check_time_all, 'approx_rows' => $overall_approx_rows)));
         $this->response->addHTML('</table>');
         //check all
         $this->response->addHTML(Template::get('structure/check_all_tables')->render(array('pmaThemeImage' => $GLOBALS['pmaThemeImage'], 'text_dir' => $GLOBALS['text_dir'], 'overhead_check' => $overhead_check, 'db_is_system_schema' => $this->_db_is_system_schema, 'hidden_fields' => $hidden_fields)));
         $this->response->addHTML('</form>');
         //end of form
         // display again the table list navigator
         $this->response->addHTML(PMA_Util::getListNavigator($this->_total_num_tables, $this->_pos, $_url_params, 'db_structure.php', 'frame_content', $GLOBALS['cfg']['MaxTableList']));
         $this->response->addHTML('</div><hr />');
         /**
          * Work on the database
          */
         /* DATABASE WORK */
         /* Printable view of a table */
         $this->response->addHTML(Template::get('structure/print_view_data_dictionary_link')->render(array('url_query' => $this->_url_query)));
         if (empty($db_is_system_schema)) {
             $this->response->addHTML(PMA_getHtmlForCreateTable($this->_db));
         }
     } elseif ($this->_type == 'table') {
         // Table structure
         PMA_PageSettings::showGroup('TableStructure');
         /**
          * Function implementations for this script
          */
         require_once 'libraries/check_user_privileges.lib.php';
         require_once 'libraries/index.lib.php';
         require_once 'libraries/sql.lib.php';
         require_once 'libraries/bookmark.lib.php';
         $this->response->getHeader()->getScripts()->addFiles(array('tbl_structure.js', 'indexes.js'));
         /**
          * Handle column moving
          */
         if (isset($_REQUEST['move_columns']) && is_array($_REQUEST['move_columns']) && $this->response->isAjax()) {
             $this->moveColumns();
             return;
         }
         /**
          * handle MySQL reserved words columns check
          */
         if (isset($_REQUEST['reserved_word_check'])) {
             if ($GLOBALS['cfg']['ReservedWordDisableWarning'] === false) {
                 $columns_names = $_REQUEST['field_name'];
                 $reserved_keywords_names = array();
                 foreach ($columns_names as $column) {
                     if (SqlParser\Context::isKeyword(trim($column), true)) {
                         $reserved_keywords_names[] = trim($column);
                     }
                 }
                 if (SqlParser\Context::isKeyword(trim($this->_table), true)) {
                     $reserved_keywords_names[] = trim($this->_table);
                 }
                 if (count($reserved_keywords_names) == 0) {
                     $this->response->isSuccess(false);
                 }
                 $this->response->addJSON('message', sprintf(_ngettext('The name \'%s\' is a MySQL reserved keyword.', 'The names \'%s\' are MySQL reserved keywords.', count($reserved_keywords_names)), implode(',', $reserved_keywords_names)));
             } else {
                 $this->response->isSuccess(false);
             }
             return;
         }
         /**
          * A click on Change has been made for one column
          */
         if (isset($_REQUEST['change_column'])) {
             $this->displayHtmlForColumnChange(null, 'tbl_structure.php');
             return;
         }
         /**
          * handle multiple field commands if required
          *
          * submit_mult_*_x comes from IE if <input type="img" ...> is used
          */
         $submit_mult = $this->getMultipleFieldCommandType();
         if (!empty($submit_mult)) {
             if (isset($_REQUEST['selected_fld'])) {
                 if ($submit_mult == 'browse') {
                     // browsing the table displaying only selected columns
                     $this->displayTableBrowseForSelectedColumns($GLOBALS['goto'], $GLOBALS['pmaThemeImage']);
                 } else {
                     // handle multiple field commands
                     // handle confirmation of deleting multiple columns
                     $action = 'tbl_structure.php';
                     $GLOBALS['selected'] = $_REQUEST['selected_fld'];
                     list($what_ret, $query_type_ret, $is_unset_submit_mult, $mult_btn_ret, $centralColsError) = $this->getDataForSubmitMult($submit_mult, $_REQUEST['selected_fld'], $action);
                     //update the existing variables
                     // todo: refactor mult_submits.inc.php such as
                     // below globals are not needed anymore
                     if (isset($what_ret)) {
                         $GLOBALS['what'] = $what_ret;
                         global $what;
                     }
                     if (isset($query_type_ret)) {
                         $GLOBALS['query_type'] = $query_type_ret;
                         global $query_type;
                     }
                     if ($is_unset_submit_mult) {
                         unset($submit_mult);
                     }
                     if (isset($mult_btn_ret)) {
                         $GLOBALS['mult_btn'] = $mult_btn_ret;
                         global $mult_btn;
                     }
                     include 'libraries/mult_submits.inc.php';
                     /**
                      * if $submit_mult == 'change', execution will have stopped
                      * at this point
                      */
                     if (empty($message)) {
                         $message = PMA_Message::success();
                     }
                     $this->response->addHTML(PMA_Util::getMessage($message, $sql_query));
                 }
             } else {
                 $this->response->isSuccess(false);
                 $this->response->addJSON('message', __('No column selected.'));
             }
         }
         // display secondary level tabs if necessary
         $engine = $this->_table_obj->sGetStatusInfo('ENGINE');
         $this->response->addHTML(Template::get('structure/secondary_tabs')->render(array('url_params' => array('db' => $this->_db, 'table' => $this->_table), 'engine' => $engine)));
         $this->response->addHTML('<div id="structure_content">');
         /**
          * Modifications have been submitted -> updates the table
          */
         if (isset($_REQUEST['do_save_data'])) {
             $regenerate = $this->updateColumns();
             if ($regenerate) {
                 // This happens when updating failed
                 // @todo: do something appropriate
             } else {
                 // continue to show the table's structure
                 unset($_REQUEST['selected']);
             }
         }
         /**
          * Adding indexes
          */
         if (isset($_REQUEST['add_key'])) {
             //todo: set some variables for sql.php include, to be eliminated
             //after refactoring sql.php
             $db = $this->_db;
             $table = $this->_table;
             $cfg = $GLOBALS['cfg'];
             $is_superuser = $GLOBALS['dbi']->isSuperuser();
             $pmaThemeImage = $GLOBALS['pmaThemeImage'];
             include 'sql.php';
             $GLOBALS['reload'] = true;
         }
         /**
          * Gets the relation settings
          */
         $cfgRelation = PMA_getRelationsParam();
         /**
          * Runs common work
          */
         // set db, table references, for require_once that follows
         // got to be eliminated in long run
         $db =& $this->_db;
         $table =& $this->_table;
         require_once 'libraries/tbl_common.inc.php';
         $this->_url_query = $url_query . '&amp;goto=tbl_structure.php&amp;back=tbl_structure.php';
         $url_params['goto'] = 'tbl_structure.php';
         $url_params['back'] = 'tbl_structure.php';
         /**
          * Gets tables information
          */
         require_once 'libraries/tbl_info.inc.php';
         require_once 'libraries/Index.class.php';
         // 2. Gets table keys and retains them
         // @todo should be: $server->db($db)->table($table)->primary()
         $primary = PMA_Index::getPrimary($this->_table, $this->_db);
         $columns_with_index = $this->dbi->getTable($this->_db, $this->_table)->getColumnsWithIndex(PMA_Index::UNIQUE | PMA_Index::INDEX | PMA_Index::SPATIAL | PMA_Index::FULLTEXT);
         $columns_with_unique_index = $this->dbi->getTable($this->_db, $this->_table)->getColumnsWithIndex(PMA_Index::UNIQUE);
         // 3. Get fields
         $fields = (array) $this->dbi->getColumns($this->_db, $this->_table, null, true);
         // Get more complete field information
         // For now, this is done just for MySQL 4.1.2+ new TIMESTAMP options
         // but later, if the analyser returns more information, it
         // could be executed for any MySQL version and replace
         // the info given by SHOW FULL COLUMNS FROM.
         //
         // We also need this to correctly learn if a TIMESTAMP is NOT NULL, since
         // SHOW FULL COLUMNS or INFORMATION_SCHEMA incorrectly says NULL
         // and SHOW CREATE TABLE says NOT NULL (tested
         // in MySQL 4.0.25 and 5.0.21, http://bugs.mysql.com/20910).
         $show_create_table = $this->_table_obj->showCreate();
         $parser = new SqlParser\Parser($show_create_table);
         /**
          * @var CreateStatement $stmt
          */
         $stmt = $parser->statements[0];
         $create_table_fields = SqlParser\Utils\Table::getFields($stmt);
         //display table structure
         $this->response->addHTML($this->displayStructure($cfgRelation, $columns_with_unique_index, $url_params, $primary, $fields, $columns_with_index, $create_table_fields));
         $this->response->addHTML('</div>');
     }
 }
Ejemplo n.º 15
0
/**
 * returns array with databases containing extended infos about them
 *
 * @todo    move into PMA_List_Database?
 * @param   string      $databases      database
 * @param   boolean     $force_stats    retrieve stats also for MySQL < 5
 * @param   resource    $link           mysql link
 * @param   string      $sort_by        column to order by
 * @param   string      $sort_order     ASC or DESC
 * @param   integer     $limit_offset   starting offset for LIMIT
 * @param   bool|int    $limit_count    row count for LIMIT or true for $GLOBALS['cfg']['MaxDbList']
 * @return  array       $databases
 */
function PMA_DBI_get_databases_full($database = null, $force_stats = false, $link = null, $sort_by = 'SCHEMA_NAME', $sort_order = 'ASC', $limit_offset = 0, $limit_count = false)
{
    $sort_order = strtoupper($sort_order);
    if (true === $limit_count) {
        $limit_count = $GLOBALS['cfg']['MaxDbList'];
    }
    // initialize to avoid errors when there are no databases
    $databases = array();
    $apply_limit_and_order_manual = true;
    if (!$GLOBALS['cfg']['Server']['DisableIS']) {
        /**
         * if $GLOBALS['cfg']['NaturalOrder'] is enabled, we cannot use LIMIT
         * cause MySQL does not support natural ordering, we have to do it afterward
         */
        if ($GLOBALS['cfg']['NaturalOrder']) {
            $limit = '';
        } else {
            if ($limit_count) {
                $limit = ' LIMIT ' . $limit_count . ' OFFSET ' . $limit_offset;
            }
            $apply_limit_and_order_manual = false;
        }
        // get table information from information_schema
        if ($database) {
            $sql_where_schema = 'WHERE `SCHEMA_NAME` LIKE \'' . addslashes($database) . '\'';
        } else {
            $sql_where_schema = '';
        }
        // for PMA bc:
        // `SCHEMA_FIELD_NAME` AS `SHOW_TABLE_STATUS_FIELD_NAME`
        $sql = '
             SELECT `information_schema`.`SCHEMATA`.*';
        if ($force_stats) {
            $sql .= ',
                    COUNT(`information_schema`.`TABLES`.`TABLE_SCHEMA`)
                        AS `SCHEMA_TABLES`,
                    SUM(`information_schema`.`TABLES`.`TABLE_ROWS`)
                        AS `SCHEMA_TABLE_ROWS`,
                    SUM(`information_schema`.`TABLES`.`DATA_LENGTH`)
                        AS `SCHEMA_DATA_LENGTH`,
                    SUM(`information_schema`.`TABLES`.`MAX_DATA_LENGTH`)
                        AS `SCHEMA_MAX_DATA_LENGTH`,
                    SUM(`information_schema`.`TABLES`.`INDEX_LENGTH`)
                        AS `SCHEMA_INDEX_LENGTH`,
                    SUM(`information_schema`.`TABLES`.`DATA_LENGTH`
                      + `information_schema`.`TABLES`.`INDEX_LENGTH`)
                        AS `SCHEMA_LENGTH`,
                    SUM(`information_schema`.`TABLES`.`DATA_FREE`)
                        AS `SCHEMA_DATA_FREE`';
        }
        $sql .= '
               FROM `information_schema`.`SCHEMATA`';
        if ($force_stats) {
            $sql .= '
          LEFT JOIN `information_schema`.`TABLES`
                 ON BINARY `information_schema`.`TABLES`.`TABLE_SCHEMA`
                  = BINARY `information_schema`.`SCHEMATA`.`SCHEMA_NAME`';
        }
        $sql .= '
              ' . $sql_where_schema . '
           GROUP BY BINARY `information_schema`.`SCHEMATA`.`SCHEMA_NAME`
           ORDER BY BINARY ' . PMA_backquote($sort_by) . ' ' . $sort_order . $limit;
        $databases = PMA_DBI_fetch_result($sql, 'SCHEMA_NAME', null, $link);
        $mysql_error = PMA_DBI_getError($link);
        if (!count($databases) && $GLOBALS['errno']) {
            PMA_mysqlDie($mysql_error, $sql);
        }
        // display only databases also in official database list
        // f.e. to apply hide_db and only_db
        $drops = array_diff(array_keys($databases), (array) $GLOBALS['pma']->databases);
        if (count($drops)) {
            foreach ($drops as $drop) {
                unset($databases[$drop]);
            }
            unset($drop);
        }
        unset($sql_where_schema, $sql, $drops);
    } else {
        foreach ($GLOBALS['pma']->databases as $database_name) {
            // MySQL forward compatibility
            // so pma could use this array as if every server is of version >5.0
            $databases[$database_name]['SCHEMA_NAME'] = $database_name;
            if ($force_stats) {
                require_once './libraries/mysql_charsets.lib.php';
                $databases[$database_name]['DEFAULT_COLLATION_NAME'] = PMA_getDbCollation($database_name);
                // get additional info about tables
                $databases[$database_name]['SCHEMA_TABLES'] = 0;
                $databases[$database_name]['SCHEMA_TABLE_ROWS'] = 0;
                $databases[$database_name]['SCHEMA_DATA_LENGTH'] = 0;
                $databases[$database_name]['SCHEMA_MAX_DATA_LENGTH'] = 0;
                $databases[$database_name]['SCHEMA_INDEX_LENGTH'] = 0;
                $databases[$database_name]['SCHEMA_LENGTH'] = 0;
                $databases[$database_name]['SCHEMA_DATA_FREE'] = 0;
                $res = PMA_DBI_query('SHOW TABLE STATUS FROM ' . PMA_backquote($database_name) . ';');
                while ($row = PMA_DBI_fetch_assoc($res)) {
                    $databases[$database_name]['SCHEMA_TABLES']++;
                    $databases[$database_name]['SCHEMA_TABLE_ROWS'] += $row['Rows'];
                    $databases[$database_name]['SCHEMA_DATA_LENGTH'] += $row['Data_length'];
                    $databases[$database_name]['SCHEMA_MAX_DATA_LENGTH'] += $row['Max_data_length'];
                    $databases[$database_name]['SCHEMA_INDEX_LENGTH'] += $row['Index_length'];
                    // for InnoDB, this does not contain the number of
                    // overhead bytes but the total free space
                    if ('InnoDB' != $row['Engine']) {
                        $databases[$database_name]['SCHEMA_DATA_FREE'] += $row['Data_free'];
                    }
                    $databases[$database_name]['SCHEMA_LENGTH'] += $row['Data_length'] + $row['Index_length'];
                }
                PMA_DBI_free_result($res);
                unset($res);
            }
        }
    }
    /**
     * apply limit and order manually now
     * (caused by older MySQL < 5 or $GLOBALS['cfg']['NaturalOrder'])
     */
    if ($apply_limit_and_order_manual) {
        $GLOBALS['callback_sort_order'] = $sort_order;
        $GLOBALS['callback_sort_by'] = $sort_by;
        usort($databases, 'PMA_usort_comparison_callback');
        unset($GLOBALS['callback_sort_order'], $GLOBALS['callback_sort_by']);
        /**
         * now apply limit
         */
        if ($limit_count) {
            $databases = array_slice($databases, $limit_offset, $limit_count);
        }
    }
    return $databases;
}
Ejemplo n.º 16
0
 /**
  * returns array with databases containing extended infos about them
  *
  * @param string   $database     database
  * @param boolean  $force_stats  retrieve stats also for MySQL < 5
  * @param object   $link         mysql link
  * @param string   $sort_by      column to order by
  * @param string   $sort_order   ASC or DESC
  * @param integer  $limit_offset starting offset for LIMIT
  * @param bool|int $limit_count  row count for LIMIT or true
  *                               for $GLOBALS['cfg']['MaxDbList']
  *
  * @todo    move into ListDatabase?
  *
  * @return array $databases
  */
 public function getDatabasesFull($database = null, $force_stats = false, $link = null, $sort_by = 'SCHEMA_NAME', $sort_order = 'ASC', $limit_offset = 0, $limit_count = false)
 {
     $sort_order = strtoupper($sort_order);
     if (true === $limit_count) {
         $limit_count = $GLOBALS['cfg']['MaxDbList'];
     }
     $apply_limit_and_order_manual = true;
     if (!$GLOBALS['cfg']['Server']['DisableIS']) {
         /**
          * if $GLOBALS['cfg']['NaturalOrder'] is enabled, we cannot use LIMIT
          * cause MySQL does not support natural ordering,
          * we have to do it afterward
          */
         $limit = '';
         if (!$GLOBALS['cfg']['NaturalOrder']) {
             if ($limit_count) {
                 $limit = ' LIMIT ' . $limit_count . ' OFFSET ' . $limit_offset;
             }
             $apply_limit_and_order_manual = false;
         }
         // get table information from information_schema
         if (!empty($database)) {
             $sql_where_schema = 'WHERE `SCHEMA_NAME` LIKE \'' . Util::sqlAddSlashes($database) . '\'';
         } else {
             $sql_where_schema = '';
         }
         $sql = 'SELECT *,
                 CAST(BIN_NAME AS CHAR CHARACTER SET utf8) AS SCHEMA_NAME
             FROM (';
         $sql .= 'SELECT
             BINARY s.SCHEMA_NAME AS BIN_NAME,
             s.DEFAULT_COLLATION_NAME';
         if ($force_stats) {
             $sql .= ',
                 COUNT(t.TABLE_SCHEMA)  AS SCHEMA_TABLES,
                 SUM(t.TABLE_ROWS)      AS SCHEMA_TABLE_ROWS,
                 SUM(t.DATA_LENGTH)     AS SCHEMA_DATA_LENGTH,
                 SUM(t.MAX_DATA_LENGTH) AS SCHEMA_MAX_DATA_LENGTH,
                 SUM(t.INDEX_LENGTH)    AS SCHEMA_INDEX_LENGTH,
                 SUM(t.DATA_LENGTH + t.INDEX_LENGTH)
                                        AS SCHEMA_LENGTH,
                 SUM(t.DATA_FREE)       AS SCHEMA_DATA_FREE';
         }
         $sql .= '
                FROM `information_schema`.SCHEMATA s';
         if ($force_stats) {
             $sql .= '
                 LEFT JOIN `information_schema`.TABLES t
                     ON BINARY t.TABLE_SCHEMA = BINARY s.SCHEMA_NAME';
         }
         $sql .= $sql_where_schema . '
                 GROUP BY BINARY s.SCHEMA_NAME, s.DEFAULT_COLLATION_NAME
                 ORDER BY ';
         if ($sort_by == 'SCHEMA_NAME' || $sort_by == 'DEFAULT_COLLATION_NAME') {
             $sql .= 'BINARY ';
         }
         $sql .= Util::backquote($sort_by) . ' ' . $sort_order . $limit;
         $sql .= ') a';
         $databases = $this->fetchResult($sql, 'SCHEMA_NAME', null, $link);
         $mysql_error = $this->getError($link);
         if (!count($databases) && $GLOBALS['errno']) {
             Util::mysqlDie($mysql_error, $sql);
         }
         // display only databases also in official database list
         // f.e. to apply hide_db and only_db
         $drops = array_diff(array_keys($databases), (array) $GLOBALS['pma']->databases);
         foreach ($drops as $drop) {
             unset($databases[$drop]);
         }
     } else {
         $databases = array();
         foreach ($GLOBALS['pma']->databases as $database_name) {
             // MySQL forward compatibility
             // so pma could use this array as if every server is of version >5.0
             // todo : remove and check the rest of the code for usage,
             // MySQL 5.0 or higher is required for current PMA version
             $databases[$database_name]['SCHEMA_NAME'] = $database_name;
             include_once './libraries/mysql_charsets.inc.php';
             $databases[$database_name]['DEFAULT_COLLATION_NAME'] = PMA_getDbCollation($database_name);
             if (!$force_stats) {
                 continue;
             }
             // get additional info about tables
             $databases[$database_name]['SCHEMA_TABLES'] = 0;
             $databases[$database_name]['SCHEMA_TABLE_ROWS'] = 0;
             $databases[$database_name]['SCHEMA_DATA_LENGTH'] = 0;
             $databases[$database_name]['SCHEMA_MAX_DATA_LENGTH'] = 0;
             $databases[$database_name]['SCHEMA_INDEX_LENGTH'] = 0;
             $databases[$database_name]['SCHEMA_LENGTH'] = 0;
             $databases[$database_name]['SCHEMA_DATA_FREE'] = 0;
             $res = $this->query('SHOW TABLE STATUS FROM ' . Util::backquote($database_name) . ';');
             if ($res === false) {
                 unset($res);
                 continue;
             }
             while ($row = $this->fetchAssoc($res)) {
                 $databases[$database_name]['SCHEMA_TABLES']++;
                 $databases[$database_name]['SCHEMA_TABLE_ROWS'] += $row['Rows'];
                 $databases[$database_name]['SCHEMA_DATA_LENGTH'] += $row['Data_length'];
                 $databases[$database_name]['SCHEMA_MAX_DATA_LENGTH'] += $row['Max_data_length'];
                 $databases[$database_name]['SCHEMA_INDEX_LENGTH'] += $row['Index_length'];
                 // for InnoDB, this does not contain the number of
                 // overhead bytes but the total free space
                 if ('InnoDB' != $row['Engine']) {
                     $databases[$database_name]['SCHEMA_DATA_FREE'] += $row['Data_free'];
                 }
                 $databases[$database_name]['SCHEMA_LENGTH'] += $row['Data_length'] + $row['Index_length'];
             }
             $this->freeResult($res);
             unset($res);
         }
     }
     /**
      * apply limit and order manually now
      * (caused by older MySQL < 5 or $GLOBALS['cfg']['NaturalOrder'])
      */
     if ($apply_limit_and_order_manual) {
         $GLOBALS['callback_sort_order'] = $sort_order;
         $GLOBALS['callback_sort_by'] = $sort_by;
         usort($databases, array('PMA\\libraries\\DatabaseInterface', '_usortComparisonCallback'));
         unset($GLOBALS['callback_sort_order'], $GLOBALS['callback_sort_by']);
         /**
          * now apply limit
          */
         if ($limit_count) {
             $databases = array_slice($databases, $limit_offset, $limit_count);
         }
     }
     return $databases;
 }
Ejemplo n.º 17
0
 /**
  * Outputs CREATE DATABASE database
  *
  * @param   string      Database name
  *
  * @return  bool        Whether it suceeded
  *
  * @access  public
  */
 function PMA_exportDBCreate($db)
 {
     global $crlf;
     if (isset($GLOBALS['sql_drop_database'])) {
         if (!PMA_exportOutputHandler('DROP DATABASE ' . (isset($GLOBALS['sql_backquotes']) ? PMA_backquote($db) : $db) . ';' . $crlf)) {
             return FALSE;
         }
     }
     $create_query = 'CREATE DATABASE ' . (isset($GLOBALS['sql_backquotes']) ? PMA_backquote($db) : $db);
     $collation = PMA_getDbCollation($db);
     if (strpos($collation, '_')) {
         $create_query .= ' DEFAULT CHARACTER SET ' . substr($collation, 0, strpos($collation, '_')) . ' COLLATE ' . $collation;
     } else {
         $create_query .= ' DEFAULT CHARACTER SET ' . $collation;
     }
     $create_query .= ';' . $crlf;
     if (!PMA_exportOutputHandler($create_query)) {
         return FALSE;
     }
     if (isset($GLOBALS['sql_backquotes']) && isset($GLOBALS['sql_compatibility']) && $GLOBALS['sql_compatibility'] == 'NONE') {
         return PMA_exportOutputHandler('USE ' . PMA_backquote($db) . ';' . $crlf);
     }
     return PMA_exportOutputHandler('USE ' . $db . ';' . $crlf);
 }
Ejemplo n.º 18
0
 /**
  * Outputs CREATE DATABASE statement
  *
  * @param string $db Database name
  *
  * @return bool Whether it succeeded
  */
 public function exportDBCreate($db)
 {
     global $crlf;
     if (isset($GLOBALS['sql_compatibility'])) {
         $compat = $GLOBALS['sql_compatibility'];
     } else {
         $compat = 'NONE';
     }
     if (isset($GLOBALS['sql_drop_database'])) {
         if (!PMA_exportOutputHandler('DROP DATABASE ' . (isset($GLOBALS['sql_backquotes']) ? PMA_Util::backquoteCompat($db, $compat) : $db) . ';' . $crlf)) {
             return false;
         }
     }
     if (isset($GLOBALS['sql_create_database'])) {
         $create_query = 'CREATE DATABASE IF NOT EXISTS ' . (isset($GLOBALS['sql_backquotes']) ? PMA_Util::backquoteCompat($db, $compat) : $db);
         $collation = PMA_getDbCollation($db);
         if (PMA_DRIZZLE) {
             $create_query .= ' COLLATE ' . $collation;
         } else {
             if (strpos($collation, '_')) {
                 $create_query .= ' DEFAULT CHARACTER SET ' . substr($collation, 0, strpos($collation, '_')) . ' COLLATE ' . $collation;
             } else {
                 $create_query .= ' DEFAULT CHARACTER SET ' . $collation;
             }
         }
         $create_query .= ';' . $crlf;
         if (!PMA_exportOutputHandler($create_query)) {
             return false;
         }
         if (isset($GLOBALS['sql_backquotes']) && (isset($GLOBALS['sql_compatibility']) && $GLOBALS['sql_compatibility'] == 'NONE' || PMA_DRIZZLE)) {
             $result = PMA_exportOutputHandler('USE ' . PMA_Util::backquoteCompat($db, $compat) . ';' . $crlf);
         } else {
             $result = PMA_exportOutputHandler('USE ' . $db . ';' . $crlf);
         }
         return $result;
     } else {
         return true;
     }
 }
Ejemplo n.º 19
0
     list($data_size, $data_unit) = PMA_formatByteDown($current['data_sz'], 3, 1);
     list($idx_size, $idx_unit) = PMA_formatByteDown($current['idx_sz'], 3, 1);
     list($tot_size, $tot_unit) = PMA_formatByteDown($current['tot_sz'], 3, 1);
     $total_calc['db_cnt']++;
     $total_calc['tbl_cnt'] += $current['tbl_cnt'];
     $total_calc['data_sz'] += $current['data_sz'];
     $total_calc['idx_sz'] += $current['idx_sz'];
     $total_calc['tot_sz'] += $current['tot_sz'];
     echo '        <tr>' . "\n";
     if ($is_superuser || $cfg['AllowUserDropDatabase']) {
         echo '            <td bgcolor="' . ($useBgcolorOne ? $cfg['BgcolorOne'] : $cfg['BgcolorTwo']) . '">' . "\n" . '                <input type="checkbox" name="selected_db[]" title="' . htmlspecialchars($current['db_name']) . '" value="' . htmlspecialchars($current['db_name']) . '" ' . (empty($checkall) ? '' : 'checked="checked" ') . '/>' . "\n" . '            </td>' . "\n";
     }
     echo '            <td bgcolor="' . ($useBgcolorOne ? $cfg['BgcolorOne'] : $cfg['BgcolorTwo']) . '">' . "\n" . '                <a onclick="reload_window(\'' . urlencode($current['db_name']) . '\'); return true;" href="' . $cfg['DefaultTabDatabase'] . '?' . $url_query . '&amp;db=' . urlencode($current['db_name']) . '" title="' . sprintf($strJumpToDB, htmlspecialchars($current['db_name'])) . '">' . "\n" . '                    ' . htmlspecialchars($current['db_name']) . "\n" . '                </a>' . "\n" . '            </td>' . "\n";
     if (!empty($dbstats)) {
         if (PMA_MYSQL_INT_VERSION >= 40101) {
             $current_collation = PMA_getDbCollation($current['db_name']);
             echo '            <td bgcolor="' . ($useBgcolorOne ? $cfg['BgcolorOne'] : $cfg['BgcolorTwo']) . '">' . "\n" . '                <dfn title="' . htmlspecialchars(PMA_getCollationDescr($current_collation)) . '">' . "\n" . '                    ' . htmlspecialchars($current_collation) . "\n" . '                </dfn>' . "\n" . '            </td>' . "\n";
         }
         echo '            <td bgcolor="' . ($useBgcolorOne ? $cfg['BgcolorOne'] : $cfg['BgcolorTwo']) . '" align="right">' . "\n" . '                ' . $current['tbl_cnt'] . "\n" . '            </td>' . "\n" . '            <td bgcolor="' . ($useBgcolorOne ? $cfg['BgcolorOne'] : $cfg['BgcolorTwo']) . '" align="right">' . "\n" . '                ' . $data_size . "\n" . '            </td>' . "\n" . '            <td bgcolor="' . ($useBgcolorOne ? $cfg['BgcolorOne'] : $cfg['BgcolorTwo']) . '">' . "\n" . '                ' . $data_unit . "\n" . '            </td>' . "\n" . '            <td bgcolor="' . ($useBgcolorOne ? $cfg['BgcolorOne'] : $cfg['BgcolorTwo']) . '" align="right">' . "\n" . '                ' . $idx_size . "\n" . '            </td>' . "\n" . '            <td bgcolor="' . ($useBgcolorOne ? $cfg['BgcolorOne'] : $cfg['BgcolorTwo']) . '">' . "\n" . '                ' . $idx_unit . "\n" . '            </td>' . "\n" . '            <td bgcolor="' . ($useBgcolorOne ? $cfg['BgcolorOne'] : $cfg['BgcolorTwo']) . '" align="right">' . "\n" . '                <b>' . "\n" . '                    ' . $tot_size . "\n" . '                </b>' . "\n" . '            </td>' . "\n" . '            <td bgcolor="' . ($useBgcolorOne ? $cfg['BgcolorOne'] : $cfg['BgcolorTwo']) . '">' . "\n" . '                <b>' . "\n" . '                    ' . $tot_unit . "\n" . '                </b>' . "\n" . '            </td>' . "\n";
     }
     if ($is_superuser) {
         echo '            <td bgcolor="' . ($useBgcolorOne ? $cfg['BgcolorOne'] : $cfg['BgcolorTwo']) . '" align="center">' . "\n" . '                <a onclick="reload_window(\'' . urlencode($current['db_name']) . '\'); return true;" href="./server_privileges.php?' . $url_query . '&amp;checkprivs=' . urlencode($current['db_name']) . '" title="' . sprintf($strCheckPrivsLong, htmlspecialchars($current['db_name'])) . '">' . "\n" . '                    ' . ($cfg['PropertiesIconic'] ? '<img src="' . $pmaThemeImage . 's_rights.png" width="16" height="16" hspace="2" border="0" alt=" ' . $strCheckPrivs . '" /> ' : $strCheckPrivs) . "\n" . '                </a>' . "\n" . '            </td>' . "\n";
     }
     echo '        </tr>' . "\n";
     $useBgcolorOne = !$useBgcolorOne;
 }
 // end while
 if (!empty($dbstats)) {
     list($data_size, $data_unit) = PMA_formatByteDown($total_calc['data_sz'], 3, 1);
     list($idx_size, $idx_unit) = PMA_formatByteDown($total_calc['idx_sz'], 3, 1);
     list($tot_size, $tot_unit) = PMA_formatByteDown($total_calc['tot_sz'], 3, 1);
Ejemplo n.º 20
0
    }
}
/**
 * Prepares the tables list if the user where not redirected to this script
 * because there is no table in the database ($is_info is TRUE)
 */
if (empty($is_info)) {
    require './db_details_common.php';
    $url_query .= '&amp;goto=db_operations.php';
    // Gets the database structure
    $sub_part = '_structure';
    require './db_details_db_info.php';
    echo "\n";
}
if (PMA_MYSQL_INT_VERSION >= 40101) {
    $db_collation = PMA_getDbCollation($db);
}
?>

<table border="0" cellpadding="2" cellspacing="0">
    <!-- Create a new table -->
        <form method="post" action="tbl_create.php" onsubmit="return (emptyFormElements(this, 'table') && checkFormElementInRange(this, 'num_fields', 1))">
     <tr>
     <td class="tblHeaders" colspan="3" nowrap="nowrap"><?php 
echo PMA_generate_common_hidden_inputs($db);
if ($cfg['PropertiesIconic']) {
    echo '<img src="' . $pmaThemeImage . 'b_newtbl.png" border="0" width="16" height="16" hspace="2" align="middle" />';
}
// if you want navigation:
$strDBLink = '<a href="' . $GLOBALS['cfg']['DefaultTabDatabase'] . '?' . PMA_generate_common_url() . '&amp;db=' . urlencode($GLOBALS['db']) . '">' . htmlspecialchars($GLOBALS['db']) . '</a>';
// else use
Ejemplo n.º 21
0
 /**
  * Outputs CREATE DATABASE statement
  *
  * @param string $db Database name
  *
  * @return bool Whether it succeeded
  */
 public function exportDBCreate($db)
 {
     global $crlf;
     $common_functions = PMA_CommonFunctions::getInstance();
     if (isset($GLOBALS['sql_drop_database'])) {
         if (!PMA_exportOutputHandler('DROP DATABASE ' . (isset($GLOBALS['sql_backquotes']) ? $common_functions->backquote($db) : $db) . ';' . $crlf)) {
             return false;
         }
     }
     $create_query = 'CREATE DATABASE ' . (isset($GLOBALS['sql_backquotes']) ? $common_functions->backquote($db) : $db);
     $collation = PMA_getDbCollation($db);
     if (PMA_DRIZZLE) {
         $create_query .= ' COLLATE ' . $collation;
     } else {
         if (strpos($collation, '_')) {
             $create_query .= ' DEFAULT CHARACTER SET ' . substr($collation, 0, strpos($collation, '_')) . ' COLLATE ' . $collation;
         } else {
             $create_query .= ' DEFAULT CHARACTER SET ' . $collation;
         }
     }
     $create_query .= ';' . $crlf;
     if (!PMA_exportOutputHandler($create_query)) {
         return false;
     }
     if (isset($GLOBALS['sql_backquotes']) && (isset($GLOBALS['sql_compatibility']) && $GLOBALS['sql_compatibility'] == 'NONE' || PMA_DRIZZLE)) {
         $result = PMA_exportOutputHandler('USE ' . $common_functions->backquote($db) . ';' . $crlf);
     } else {
         $result = PMA_exportOutputHandler('USE ' . $db . ';' . $crlf);
     }
     return $result;
 }