Exemple #1
0
 /**
  * Get the list and number of available databases.
  *
  * @param   string   the url to go back to in case of error
  *
  * @return  boolean  always true
  *
  * @global  array    the list of available databases
  * @global  integer  the number of available databases
  * @global  array    current configuration
  */
 function PMA_availableDatabases($error_url = '')
 {
     global $dblist;
     global $num_dbs;
     global $cfg;
     $num_dbs = count($dblist);
     // 1. A list of allowed databases has already been defined by the
     //    authentification process -> gets the available databases list
     if ($num_dbs) {
         $true_dblist = array();
         for ($i = 0; $i < $num_dbs; $i++) {
             $dblink = @PMA_DBI_select_db($dblist[$i]);
             if ($dblink) {
                 $true_dblist[] = $dblist[$i];
             }
             // end if
         }
         // end for
         $dblist = array();
         $dblist = $true_dblist;
         unset($true_dblist);
         $num_dbs = count($dblist);
     } else {
         if (!isset($cfg['Server']['only_db']) || $cfg['Server']['only_db'] == '') {
             $dblist = PMA_DBI_get_dblist();
             // needed? or PMA_mysqlDie('', 'SHOW DATABASES;', FALSE, $error_url);
             $num_dbs = count($dblist);
         }
     }
     // end else
     return TRUE;
 }
/**
 * returns detailed array with all columns for given table in database,
 * or all tables/databases
 *
 * @param   string  $database   name of database
 * @param   string  $table      name of table to retrieve columns from
 * @param   string  $column     name of specific column
 * @param   mixed   $link       mysql link resource
 */
function PMA_DBI_get_columns_full($database = null, $table = null, $column = null, $link = null)
{
    $columns = array();
    if (PMA_MYSQL_INT_VERSION >= 50002) {
        $sql_wheres = array();
        $array_keys = array();
        // get columns information from information_schema
        if (null !== $database) {
            $sql_wheres[] = '`TABLE_SCHEMA` = \'' . addslashes($database) . '\' ';
        } else {
            $array_keys[] = 'TABLE_SCHEMA';
        }
        if (null !== $table) {
            $sql_wheres[] = '`TABLE_NAME` = \'' . addslashes($table) . '\' ';
        } else {
            $array_keys[] = 'TABLE_NAME';
        }
        if (null !== $column) {
            $sql_wheres[] = '`COLUMN_NAME` = \'' . addslashes($column) . '\' ';
        } else {
            $array_keys[] = 'COLUMN_NAME';
        }
        // for PMA bc:
        // `[SCHEMA_FIELD_NAME]` AS `[SHOW_FULL_COLUMNS_FIELD_NAME]`
        $sql = '
             SELECT *,
                    `COLUMN_NAME`       AS `Field`,
                    `COLUMN_TYPE`       AS `Type`,
                    `COLLATION_NAME`    AS `Collation`,
                    `IS_NULLABLE`       AS `Null`,
                    `COLUMN_KEY`        AS `Key`,
                    `COLUMN_DEFAULT`    AS `Default`,
                    `EXTRA`             AS `Extra`,
                    `PRIVILEGES`        AS `Privileges`,
                    `COLUMN_COMMENT`    AS `Comment`
               FROM `information_schema`.`COLUMNS`';
        if (count($sql_wheres)) {
            $sql .= "\n" . ' WHERE ' . implode(' AND ', $sql_wheres);
        }
        $columns = PMA_DBI_fetch_result($sql, $array_keys, null, $link);
        unset($sql_wheres, $sql);
    } else {
        if (null === $database) {
            $databases = PMA_DBI_get_dblist();
            foreach ($databases as $database) {
                $columns[$database] = PMA_DBI_get_columns_full($database, null, null, $link);
            }
            return $columns;
        } elseif (null === $table) {
            $tables = PMA_DBI_get_tables($database);
            foreach ($tables as $table) {
                $columns[$table] = PMA_DBI_get_columns_full($database, $table, null, $link);
            }
            return $columns;
        }
        $sql = 'SHOW FULL COLUMNS FROM ' . PMA_backquote($database) . '.' . PMA_backquote($table);
        if (null !== $column) {
            $sql .= " LIKE '" . $column . "'";
        }
        $columns = PMA_DBI_fetch_result($sql, 'Field', null, $link);
        $ordinal_position = 1;
        foreach ($columns as $column_name => $each_column) {
            // MySQL forward compatibility
            // so pma could use this array as if every server is of version >5.0
            $columns[$column_name]['COLUMN_NAME'] =& $columns[$column_name]['Field'];
            $columns[$column_name]['COLUMN_TYPE'] =& $columns[$column_name]['Type'];
            $columns[$column_name]['COLLATION_NAME'] =& $columns[$column_name]['Collation'];
            $columns[$column_name]['IS_NULLABLE'] =& $columns[$column_name]['Null'];
            $columns[$column_name]['COLUMN_KEY'] =& $columns[$column_name]['Key'];
            $columns[$column_name]['COLUMN_DEFAULT'] =& $columns[$column_name]['Default'];
            $columns[$column_name]['EXTRA'] =& $columns[$column_name]['Extra'];
            $columns[$column_name]['PRIVILEGES'] =& $columns[$column_name]['Privileges'];
            $columns[$column_name]['COLUMN_COMMENT'] =& $columns[$column_name]['Comment'];
            $columns[$column_name]['TABLE_CATALOG'] = null;
            $columns[$column_name]['TABLE_SCHEMA'] = $database;
            $columns[$column_name]['TABLE_NAME'] = $table;
            $columns[$column_name]['ORDINAL_POSITION'] = $ordinal_position;
            $columns[$column_name]['DATA_TYPE'] = substr($columns[$column_name]['COLUMN_TYPE'], 0, strpos($columns[$column_name]['COLUMN_TYPE'], '('));
            // @TODO guess CHARACTER_MAXIMUM_LENGTH from COLUMN_TYPE
            $columns[$column_name]['CHARACTER_MAXIMUM_LENGTH'] = null;
            // @TODO guess CHARACTER_OCTET_LENGTH from CHARACTER_MAXIMUM_LENGTH
            $columns[$column_name]['CHARACTER_OCTET_LENGTH'] = null;
            $columns[$column_name]['NUMERIC_PRECISION'] = null;
            $columns[$column_name]['NUMERIC_SCALE'] = null;
            $columns[$column_name]['CHARACTER_SET_NAME'] = substr($columns[$column_name]['COLLATION_NAME'], 0, strpos($columns[$column_name]['COLLATION_NAME'], '_'));
            $ordinal_position++;
        }
        if (null !== $column) {
            reset($columns);
            $columns = current($columns);
        }
    }
    return $columns;
}
Exemple #3
0
 /**
  * Get the list and number of available databases.
  *
  * @param   string   the url to go back to in case of error
  *
  * @return  boolean  always true
  *
  * @global  array    the list of available databases
  * @global  integer  the number of available databases
  * @global  array    current configuration
  */
 function PMA_availableDatabases($error_url = '')
 {
     global $dblist;
     global $num_dbs;
     global $cfg;
     // 1. A list of allowed databases has already been defined by the
     //    authentication process -> gets the available databases list
     if (count($dblist)) {
         foreach ($dblist as $key => $db) {
             if (!@PMA_DBI_select_db($db) || !empty($GLOBALS['cfg']['Server']['hide_db']) && preg_match('/' . $GLOBALS['cfg']['Server']['hide_db'] . '/', $db)) {
                 unset($dblist[$key]);
             }
             // end if
         }
         // end for
     } elseif (empty($cfg['Server']['only_db'])) {
         $dblist = PMA_DBI_get_dblist();
         // needed? or PMA_mysqlDie('', 'SHOW DATABASES;', false, $error_url);
     }
     // end else
     $num_dbs = count($dblist);
     // natural order for db list; but do not sort if user asked
     // for a specific order with the 'only_db' mechanism
     if (!is_array($GLOBALS['cfg']['Server']['only_db']) && $GLOBALS['cfg']['NaturalOrder']) {
         natsort($dblist);
     }
     return true;
 }
/**
 * 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;
}