diff --git a/libraries/navigation/NavigationTree.class.php b/libraries/navigation/NavigationTree.class.php index 54a420b1b9..b5da7aadfd 100644 --- a/libraries/navigation/NavigationTree.class.php +++ b/libraries/navigation/NavigationTree.class.php @@ -157,23 +157,77 @@ class PMA_NavigationTree /* * @todo describe a scenario where this code is executed */ - $query = "SELECT (COUNT(DB_first_level) DIV %d) * %d "; - $query .= "from ( "; - $query .= " SELECT distinct SUBSTRING_INDEX(SCHEMA_NAME, "; - $query .= " '{$GLOBALS['cfg']['NavigationTreeDbSeparator']}', 1) "; - $query .= " DB_first_level "; - $query .= " FROM INFORMATION_SCHEMA.SCHEMATA "; - $query .= " WHERE `SCHEMA_NAME` < '%s' "; - $query .= ") t "; + if (! $GLOBALS['cfg']['Server']['DisableIS']) { + $query = "SELECT (COUNT(DB_first_level) DIV %d) * %d "; + $query .= "from ( "; + $query .= " SELECT distinct SUBSTRING_INDEX(SCHEMA_NAME, "; + $query .= " '{$GLOBALS['cfg']['NavigationTreeDbSeparator']}', 1) "; + $query .= " DB_first_level "; + $query .= " FROM INFORMATION_SCHEMA.SCHEMATA "; + $query .= " WHERE `SCHEMA_NAME` < '%s' "; + $query .= ") t "; - $retval = $GLOBALS['dbi']->fetchValue( - sprintf( - $query, - (int)$GLOBALS['cfg']['FirstLevelNavigationItems'], - (int)$GLOBALS['cfg']['FirstLevelNavigationItems'], - PMA_Util::sqlAddSlashes($GLOBALS['db']) - ) - ); + $retval = $GLOBALS['dbi']->fetchValue( + sprintf( + $query, + (int)$GLOBALS['cfg']['FirstLevelNavigationItems'], + (int)$GLOBALS['cfg']['FirstLevelNavigationItems'], + PMA_Util::sqlAddSlashes($GLOBALS['db']) + ) + ); + } else { + $prefixMap = array(); + if ($GLOBALS['dbs_to_test'] === false) { + $handle = $GLOBALS['dbi']->tryQuery("SHOW DATABASES"); + if ($handle !== false) { + while ($arr = $GLOBALS['dbi']->fetchArray($handle)) { + if (strcasecmp($arr[0], $GLOBALS['db']) < 0) { + $prefix = strstr( + $arr[0], + $GLOBALS['cfg']['NavigationTreeDbSeparator'], + true + ); + if ($prefix === false) { + $prefix = $arr[0]; + } + $prefixMap[$prefix] = 1; + } else { + break; + } + } + } + } else { + $databases = array(); + foreach ($GLOBALS['dbs_to_test'] as $db) { + $query = "SHOW DATABASES LIKE '" . $db . "'"; + $handle = $GLOBALS['dbi']->tryQuery($query); + if ($handle !== false) { + while ($arr = $GLOBALS['dbi']->fetchArray($handle)) { + $databases[] = $arr[0]; + } + } + } + sort($databases); + foreach ($databases as $database) { + if (strcasecmp($database, $GLOBALS['db']) < 0) { + $prefix = strstr( + $database, + $GLOBALS['cfg']['NavigationTreeDbSeparator'], + true + ); + if ($prefix === false) { + $prefix = $database; + } + $prefixMap[$prefix] = 1; + } else { + break; + } + } + } + + $navItems = (int) $GLOBALS['cfg']['FirstLevelNavigationItems']; + $retval = floor((count($prefixMap) / $navItems)) * $navItems; + } } return $retval; }