/** * 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; }
/** * 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; }