? no-router-blob-317775-18.patch ? no-router-blob.patch ? sites/default/files ? sites/default/settings.php Index: includes/menu.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/menu.inc,v retrieving revision 1.316 diff -u -p -r1.316 menu.inc --- includes/menu.inc 21 Mar 2009 17:58:14 -0000 1.316 +++ includes/menu.inc 29 Mar 2009 16:52:30 -0000 @@ -1832,30 +1832,35 @@ function menu_rebuild() { /** * Collect, alter and store the menu definitions. */ -function menu_router_build($reset = FALSE) { - static $menu; +function menu_router_build() { + // We need to manually call each module so that we can know which module + // a given item came from. + $callbacks = array(); + foreach (module_implements('menu') as $module) { + $router_items = call_user_func($module .'_menu'); + if (isset($router_items) && is_array($router_items)) { + foreach (array_keys($router_items) as $path) { + $router_items[$path]['module'] = $module; + } + $callbacks = array_merge($callbacks, $router_items); + } + } + // Alter the menu as defined in modules, keys are like user/%user. + drupal_alter('menu', $callbacks); + $menu = _menu_router_build($callbacks); + _menu_router_store($menu); - if (!isset($menu) || $reset) { - if (!$reset && ($cache = cache_get('router:', 'cache_menu')) && isset($cache->data)) { - $menu = $cache->data; - } - else { - // We need to manually call each module so that we can know which module - // a given item came from. - $callbacks = array(); - foreach (module_implements('menu', TRUE) as $module) { - $router_items = call_user_func($module . '_menu'); - if (isset($router_items) && is_array($router_items)) { - foreach (array_keys($router_items) as $path) { - $router_items[$path]['module'] = $module; - } - $callbacks = array_merge($callbacks, $router_items); - } - } - // Alter the menu as defined in modules, keys are like user/%user. - drupal_alter('menu', $callbacks); - $menu = _menu_router_build($callbacks); - } + return $menu; +} + +/** + * Helper function to store the menu router if we have it in memory. + */ +function _menu_router_store($new_menu = NULL) { + static $menu = NULL; + + if (isset($new_menu)) { + $menu = $new_menu; } return $menu; } @@ -1951,7 +1956,7 @@ function _menu_navigation_links_rebuild( ) ->execute(); foreach ($result as $item) { - $router_path = _menu_find_router_path($menu, $item['link_path']); + $router_path = _menu_find_router_path($item['link_path']); if (!empty($router_path) && ($router_path != $item['router_path'] || $item['updated'])) { // If the router path and the link path matches, it's surely a working // item, so we clear the updated flag. @@ -2048,8 +2053,9 @@ function _menu_delete_item($item, $force * saved. */ function menu_link_save(&$item) { - $menu = menu_router_build(); + // Get the router if it's already in memory. + $menu = _menu_router_store(); drupal_alter('menu_link', $item, $menu); // This is the easiest way to handle the unique internal path '', @@ -2175,7 +2181,7 @@ function menu_link_save(&$item) { else { // Find the router path which will serve this path. $item['parts'] = explode('/', $item['link_path'], MENU_MAX_PARTS); - $item['router_path'] = _menu_find_router_path($menu, $item['link_path']); + $item['router_path'] = _menu_find_router_path($item['link_path']); } } // If every value in $existing_item is the same in the $item, there is no @@ -2257,19 +2263,31 @@ function _menu_set_expanded_menus() { /** * Find the router path which will serve this path. * - * @param $menu - * The full built menu. * @param $link_path * The path for we are looking up its router path. * @return * A path from $menu keys or empty if $link_path points to a nonexisting * place. */ -function _menu_find_router_path($menu, $link_path) { - $parts = explode('/', $link_path, MENU_MAX_PARTS); +function _menu_find_router_path($link_path) { + $menu = _menu_router_store(); + $router_path = $link_path; - if (!isset($menu[$router_path])) { - $ancestors = menu_get_ancestors($parts); + $parts = explode('/', $link_path, MENU_MAX_PARTS); + $ancestors = menu_get_ancestors($parts); + + // $menu will only have data during a menu rebuild. + if (empty($menu)) { + // Not during a menu rebuild, so look up in the database. + $router_path = (string) db_select('menu_router') + ->fields('menu_router', array('path')) + ->condition('path', $ancestors, 'IN') + ->orderBy('fit', 'DESC') + ->range(0, 1) + ->execute()->fetchField(); + } + elseif (!isset($menu[$router_path])) { + // Return an empty path as a fallback. $ancestors[] = ''; foreach ($ancestors as $key => $router_path) { if (isset($menu[$router_path])) { @@ -2654,7 +2672,7 @@ function _menu_router_build($callbacks) $masks = array_keys($masks); rsort($masks); variable_set('menu_masks', $masks); - cache_set('router:', $menu, 'cache_menu'); + return $menu; } Index: modules/menu/menu.module =================================================================== RCS file: /cvs/drupal/drupal/modules/menu/menu.module,v retrieving revision 1.182 diff -u -p -r1.182 menu.module --- modules/menu/menu.module 28 Mar 2009 03:58:55 -0000 1.182 +++ modules/menu/menu.module 29 Mar 2009 16:52:30 -0000 @@ -251,8 +251,7 @@ function _menu_parents_recurse($tree, $m * Reset a system-defined menu item. */ function menu_reset_item($item) { - $router = menu_router_build(); - $new_item = _menu_link_build($router[$item['router_path']]); + $new_item = _menu_link_build(menu_get_item($item['router_path'])); foreach (array('mlid', 'has_children') as $key) { $new_item[$key] = $item[$key]; }