diff options
Diffstat (limited to 'libraries/List_Database.class.php')
-rw-r--r-- | libraries/List_Database.class.php | 530 |
1 files changed, 0 insertions, 530 deletions
diff --git a/libraries/List_Database.class.php b/libraries/List_Database.class.php deleted file mode 100644 index 17df2d80a3..0000000000 --- a/libraries/List_Database.class.php +++ /dev/null @@ -1,530 +0,0 @@ -<?php -/* vim: set expandtab sw=4 ts=4 sts=4: */ -/** - * holds the PMA_List_Database class - * - * @version $Id$ - * @package phpMyAdmin - */ - -/** - * the list base class - */ -require_once './libraries/List.class.php'; - -/** - * handles database lists - * - * <code> - * $PMA_List_Database = new PMA_List_Database($userlink, $controllink); - * </code> - * - * @todo this object should be attached to the PMA_Server object - * @todo ? make use of INFORMATION_SCHEMA - * @todo ? support --skip-showdatabases and user has only global rights - * @access public - * @since phpMyAdmin 2.9.10 - * @package phpMyAdmin - */ -/*public*/ class PMA_List_Database extends PMA_List -{ - /** - * @var mixed database link resource|object to be used - */ - protected $_db_link = null; - - /** - * @var mixed user database link resource|object - */ - protected $_db_link_user = null; - - /** - * @var mixed controluser database link resource|object - */ - protected $_db_link_control = null; - - /** - * @var boolean whether SHOW DATABASES is disabled or not - * @access protected - */ - protected $_show_databases_disabled = false; - - /** - * @var string command to retrieve databases from server - */ - protected $_command = null; - - /** - * Constructor - * - * @uses PMA_List_Database::$_db_link - * @uses PMA_List_Database::$_db_link_user - * @uses PMA_List_Database::$_db_link_control - * @uses PMA_List_Database::build() - * @param mixed $db_link_user user database link resource|object - * @param mixed $db_link_control control database link resource|object - */ - public function __construct($db_link_user = null, $db_link_control = null) - { - $this->_db_link = $db_link_user; - $this->_db_link_user = $db_link_user; - $this->_db_link_control = $db_link_control; - - parent::__construct(); - $this->build(); - } - - /** - * checks if the configuration wants to hide some databases - * - * @todo temporaly use this docblock to test how to doc $GLOBALS - * @uses PMA_List_Database::$items - * @uses preg_match() - * @uses $cfg['Server']['hide_db'] - */ - protected function _checkHideDatabase() - { - if (empty($GLOBALS['cfg']['Server']['hide_db'])) { - return; - } - - foreach ($this->getArrayCopy() as $key => $db) { - if (preg_match('/' . $GLOBALS['cfg']['Server']['hide_db'] . '/', $db)) { - $this->offsetUnset($key); - } - } - } - - /** - * retrieves database list from server - * - * @todo we could also search mysql tables if all fail? - * @uses PMA_List_Database::$_show_databases_disabled for not retrying if SHOW DATABASES is disabled - * @uses PMA_List_Database::$_db_link - * @uses PMA_List_Database::$_db_link_control in case of SHOW DATABASES is disabled for userlink - * @uses PMA_DBI_fetch_result() - * @uses PMA_DBI_getError() - * @uses $GLOBALS['error_showdatabases'] - * @uses $GLOBALS['errno'] - * @param string $like_db_name usally a db_name containing wildcards - */ - protected function _retrieve($like_db_name = null) - { - if ($this->_show_databases_disabled) { - return array(); - } - - if (null !== $like_db_name) { - $command = "SHOW DATABASES LIKE '" . $like_db_name . "'"; - } elseif (null === $this->_command) { - $command = str_replace('#user#', $GLOBALS['cfg']['Server']['user'], - $GLOBALS['cfg']['Server']['ShowDatabasesCommand']); - $this->_command = $command; - } else { - $command = $this->_command; - } - - $database_list = PMA_DBI_fetch_result($command, null, null, $this->_db_link); - PMA_DBI_getError(); - - if ($GLOBALS['errno'] !== 0) { - // failed to get database list, try the control user - // (hopefully there is one and he has SHOW DATABASES right) - $this->_db_link = $this->_db_link_control; - $database_list = PMA_DBI_fetch_result($command, null, null, $this->_db_link); - - PMA_DBI_getError(); - - if ($GLOBALS['errno'] !== 0) { - // failed! we will display a warning that phpMyAdmin could not safely - // retrieve database list, the admin has to setup a control user or - // allow SHOW DATABASES - $GLOBALS['error_showdatabases'] = true; - $this->_show_databases_disabled = true; - } - } - - return $database_list; - } - - /** - * builds up the list - * - * @uses PMA_List_Database::$items to initialize it - * @uses PMA_List_Database::_checkOnlyDatabase() - * @uses PMA_List_Database::_retrieve() - * @uses PMA_List_Database::_checkHideDatabase() - * @uses array_values() - * @uses natsort() - * @uses $cfg['NaturalOrder'] - */ - public function build() - { - if (! $this->_checkOnlyDatabase()) { - $items = $this->_retrieve(); - if ($GLOBALS['cfg']['NaturalOrder']) { - natsort($items); - } - $this->exchangeArray($items); - } - - $this->_checkHideDatabase(); - } - - /** - * checks the only_db configuration - * - * @uses PMA_List_Database::$_show_databases_disabled - * @uses PMA_List_Database::$items - * @uses PMA_List_Database::_retrieve() - * @uses PMA_unescape_mysql_wildcards() - * @uses preg_match() - * @uses array_diff() - * @uses array_merge() - * @uses is_array() - * @uses strlen() - * @uses is_string() - * @uses $cfg['Server']['only_db'] - * @return boolean false if there is no only_db, otherwise true - */ - protected function _checkOnlyDatabase() - { - if (is_string($GLOBALS['cfg']['Server']['only_db']) - && strlen($GLOBALS['cfg']['Server']['only_db'])) { - $GLOBALS['cfg']['Server']['only_db'] = array( - $GLOBALS['cfg']['Server']['only_db'] - ); - } - - if (! is_array($GLOBALS['cfg']['Server']['only_db'])) { - return false; - } - - $items = array(); - - foreach ($GLOBALS['cfg']['Server']['only_db'] as $each_only_db) { - if ($each_only_db === '*' && ! $this->_show_databases_disabled) { - // append all not already listed dbs to the list - $items = array_merge($items, - array_diff($this->_retrieve(), $items)); - // there can only be one '*', and this can only be last - break; - } - - // check if the db name contains wildcard, - // thus containing not escaped _ or % - if (! preg_match('/(^|[^\\\\])(_|%)/', $each_only_db)) { - // ... not contains wildcard - $items[] = PMA_unescape_mysql_wildcards($each_only_db); - continue; - } - - if (! $this->_show_databases_disabled) { - $items = array_merge($items, $this->_retrieve($each_only_db)); - continue; - } - - // @todo induce error, about not using wildcards with SHOW DATABASE disabled? - } - - $this->exchangeArray($items); - - return true; - } - - /** - * returns default item - * - * @uses PMA_List::getEmpty() - * @uses $GLOBALS['db'] - * @uses strlen() - * @return string default item - */ - public function getDefault() - { - if (strlen($GLOBALS['db'])) { - return $GLOBALS['db']; - } - - return $this->getEmpty(); - } - - /** - * returns array with dbs grouped with extended infos - * - * @uses $GLOBALS['PMA_List_Database'] - * @uses $GLOBALS['cfgRelation']['commwork'] - * @uses $cfg['ShowTooltip'] - * @uses $cfg['LeftFrameDBTree'] - * @uses $cfg['LeftFrameDBSeparator'] - * @uses $cfg['ShowTooltipAliasDB'] - * @uses PMA_getTableCount() - * @uses PMA_getDbComment() - * @uses is_array() - * @uses implode() - * @uses strstr() - * @uses explode() - * @param integer $offset - * @param integer $count - * @return array db list - */ - public function getGroupedDetails($offset, $count) - { - $dbgroups = array(); - $parts = array(); - - if ($GLOBALS['cfg']['ShowTooltip'] - && $GLOBALS['cfgRelation']['commwork']) { - $db_tooltips = PMA_getDbComments(); - } - - if (!$GLOBALS['cfg']['LeftFrameDBTree']) { - $separators = array(); - } elseif (is_array($GLOBALS['cfg']['LeftFrameDBSeparator'])) { - $separators = $GLOBALS['cfg']['LeftFrameDBSeparator']; - } elseif (!empty($GLOBALS['cfg']['LeftFrameDBSeparator'])) { - $separators = array($GLOBALS['cfg']['LeftFrameDBSeparator']); - } else { - $separators = array(); - } - - foreach ($this->getLimitedItems($offset, $count) as $key => $db) { - // garvin: Get comments from PMA comments table - $db_tooltip = ''; - - if (isset($db_tooltips[$db])) { - $db_tooltip = $db_tooltips[$db]; - } - - $pos = false; - - foreach($separators as $separator) { - // use strpos instead of strrpos; it seems more common to - // have the db name, the separator, then the rest which - // might contain a separator - // like dbname_the_rest - $pos = strpos($db, $separator); - - if ($pos !== false) { - break; - } - } - - if ($pos !== false) { - $group = substr($db, 0, $pos); - $disp_name_cut = substr($db, $pos); - } else { - $group = $db; - $disp_name_cut = $db; - } - - $disp_name = $db; - if ($db_tooltip && $GLOBALS['cfg']['ShowTooltipAliasDB']) { - $disp_name = $db_tooltip; - $disp_name_cut = $db_tooltip; - $db_tooltip = $db; - } - - $dbgroups[$group][$db] = array( - 'name' => $db, - 'disp_name_cut' => $disp_name_cut, - 'disp_name' => $disp_name, - 'comment' => $db_tooltip, - ); - - if ($GLOBALS['cfg']['Server']['CountTables']) { - $dbgroups[$group][$db]['num_tables'] = PMA_getTableCount($db); - } - } // end foreach ($GLOBALS['PMA_List_Database']->items as $db) - return $dbgroups; - } - - /** - * returns a part of the items - * - * @uses array_slice() - * @param integer $offset - * @param integer $count - * @return array some items - */ - public function getLimitedItems($offset, $count) - { - return array_slice($this->getArrayCopy(), $offset, $count); - } - - /** - * returns html code for list with dbs - * - * @return string html code list - */ - public function getHtmlListGrouped($selected = '', $offset, $count) - { - if (true === $selected) { - $selected = $this->getDefault(); - } - - $return = '<ul id="databaseList" xml:lang="en" dir="ltr">' . "\n"; - foreach ($this->getGroupedDetails($offset, $count) as $group => $dbs) { - if (count($dbs) > 1) { - $return .= '<li>' . htmlspecialchars($group) . '<ul>' . "\n"; - // whether display db_name cut by the group part - $cut = true; - } else { - // .. or full - $cut = false; - } - foreach ($dbs as $db) { - $return .= '<li'; - if ($db['name'] == $selected) { - $return .= ' class="selected"'; - } - $return .= '><a'; - if (! empty($db['comment'])) { - $return .= ' title="' . htmlspecialchars($db['comment']) . '"'; - } - $return .= ' href="index.php?' . PMA_generate_common_url($db['name']) - . '" target="_parent">'; - if ($cut) { - $return .= htmlspecialchars($db['disp_name_cut']); - } else { - $return .= htmlspecialchars($db['disp_name']); - } - - if (! empty($db['num_tables'])) { - $return .= ' (' . $db['num_tables'] . ')'; - } - $return .= '</a></li>' . "\n"; - } - if (count($dbs) > 1) { - $return .= '</ul></li>' . "\n"; - } - } - $return .= '</ul>'; - - return $return; - } - - /** - * returns html code for select form element with dbs - * - * @todo IE can not handle different text directions in select boxes so, - * as mostly names will be in english, we set the whole selectbox to LTR - * and EN - * - * @return string html code select - */ - public function getHtmlSelectGrouped($selected = '', $offset, $count) - { - if (true === $selected) { - $selected = $this->getDefault(); - } - - $return = '<select name="db" id="lightm_db" xml:lang="en" dir="ltr"' - . ' onchange="if (this.value != \'\') window.parent.openDb(this.value);">' . "\n" - . '<option value="" dir="' . $GLOBALS['text_dir'] . '">' - . '(' . $GLOBALS['strDatabases'] . ') ...</option>' . "\n"; - foreach ($this->getGroupedDetails($offset, $count) as $group => $dbs) { - if (count($dbs) > 1) { - $return .= '<optgroup label="' . htmlspecialchars($group) - . '">' . "\n"; - // whether display db_name cuted by the group part - $cut = true; - } else { - // .. or full - $cut = false; - } - foreach ($dbs as $db) { - $return .= '<option value="' . htmlspecialchars($db['name']) . '"' - .' title="' . htmlspecialchars($db['comment']) . '"'; - if ($db['name'] == $selected) { - $return .= ' selected="selected"'; - } - $return .= '>' . htmlspecialchars($cut ? $db['disp_name_cut'] : $db['disp_name']); - if (! empty($db['num_tables'])) { - $return .= ' (' . $db['num_tables'] . ')'; - } - $return .= '</option>' . "\n"; - } - if (count($dbs) > 1) { - $return .= '</optgroup>' . "\n"; - } - } - $return .= '</select>'; - - return $return; - } - - /** - * this is just a backup, if all is fine this can be deleted later - * - * @deprecated - */ - protected function _checkAgainstPrivTables() - { - // 1. get allowed dbs from the "mysql.db" table - // lem9: User can be blank (anonymous user) - $local_query = " - SELECT DISTINCT `Db` FROM `mysql`.`db` - WHERE `Select_priv` = 'Y' - AND `User` - IN ('" . PMA_sqlAddslashes($GLOBALS['cfg']['Server']['user']) . "', '')"; - $tmp_mydbs = PMA_DBI_fetch_result($local_query, null, null, - $GLOBALS['controllink']); - if ($tmp_mydbs) { - // Will use as associative array of the following 2 code - // lines: - // the 1st is the only line intact from before - // correction, - // the 2nd replaces $dblist[] = $row['Db']; - - // Code following those 2 lines in correction continues - // populating $dblist[], as previous code did. But it is - // now populated with actual database names instead of - // with regular expressions. - $tmp_alldbs = PMA_DBI_query('SHOW DATABASES;', $GLOBALS['controllink']); - // loic1: all databases cases - part 2 - if (isset($tmp_mydbs['%'])) { - while ($tmp_row = PMA_DBI_fetch_row($tmp_alldbs)) { - $dblist[] = $tmp_row[0]; - } // end while - } else { - while ($tmp_row = PMA_DBI_fetch_row($tmp_alldbs)) { - $tmp_db = $tmp_row[0]; - if (isset($tmp_mydbs[$tmp_db]) && $tmp_mydbs[$tmp_db] == 1) { - $dblist[] = $tmp_db; - $tmp_mydbs[$tmp_db] = 0; - } elseif (!isset($dblist[$tmp_db])) { - foreach ($tmp_mydbs as $tmp_matchpattern => $tmp_value) { - // loic1: fixed bad regexp - // TODO: db names may contain characters - // that are regexp instructions - $re = '(^|(\\\\\\\\)+|[^\])'; - $tmp_regex = preg_replace('/' . addcslashes($re,'/') . '%/', '\\1.*', preg_replace('/' . addcslashes($re,'/') . '_/', '\\1.{1}', $tmp_matchpattern)); - // Fixed db name matching - // 2000-08-28 -- Benjamin Gandon - if (preg_match('/^' . addcslashes($tmp_regex,'/') . '$/', $tmp_db)) { - $dblist[] = $tmp_db; - break; - } - } // end while - } // end if ... elseif ... - } // end while - } // end else - PMA_DBI_free_result($tmp_alldbs); - unset($tmp_mydbs); - } // end if - - // 2. get allowed dbs from the "mysql.tables_priv" table - $local_query = 'SELECT DISTINCT Db FROM mysql.tables_priv WHERE Table_priv LIKE \'%Select%\' AND User = \'' . PMA_sqlAddslashes($GLOBALS['cfg']['Server']['user']) . '\''; - $rs = PMA_DBI_try_query($local_query, $GLOBALS['controllink']); - if ($rs && @PMA_DBI_num_rows($rs)) { - while ($row = PMA_DBI_fetch_assoc($rs)) { - if (!in_array($row['Db'], $dblist)) { - $dblist[] = $row['Db']; - } - } // end while - PMA_DBI_free_result($rs); - } // end if - } -} -?> |