summaryrefslogtreecommitdiff
path: root/includes
diff options
context:
space:
mode:
authorDries Buytaert <dries@buytaert.net>2005-05-14 09:23:47 +0000
committerDries Buytaert <dries@buytaert.net>2005-05-14 09:23:47 +0000
commit139ef4027ceae2691eb9c5cc2e1f21df44caa145 (patch)
tree54ab1f79c06cd9f2f9607319365ec69c2614d0b4 /includes
parent229e2e4f234fc7b3380e8bf192e3dae48aaabc16 (diff)
downloadbrdo-139ef4027ceae2691eb9c5cc2e1f21df44caa145.tar.gz
brdo-139ef4027ceae2691eb9c5cc2e1f21df44caa145.tar.bz2
- Patch #22035 by mathias/mikeryan: improved performance of path aliases.
Diffstat (limited to 'includes')
-rw-r--r--includes/bootstrap.inc64
-rw-r--r--includes/common.inc18
2 files changed, 59 insertions, 23 deletions
diff --git a/includes/bootstrap.inc b/includes/bootstrap.inc
index 62fb54079..520bacf61 100644
--- a/includes/bootstrap.inc
+++ b/includes/bootstrap.inc
@@ -448,7 +448,7 @@ function drupal_load($type, $name) {
// print $name. '<br />';
static $files = array();
- if ($files[$type][$name]) {
+ if (isset($files[$type][$name])) {
return TRUE;
}
@@ -465,32 +465,66 @@ function drupal_load($type, $name) {
}
/**
- * Return an array mapping path aliases to their internal Drupal paths.
+ * Given an alias, return its Drupal system URL if one exists. Given a Drupal
+ * system URL return its alias if one exists.
+ *
+ * @param $action
+ * One of the following values:
+ * - wipe: delete the alias cache.
+ * - source: indicates that given a Drupal system URL, return an alias if one exists.
+ * - alias: indicates that given an path alias, return the Drupal system URL if one exists.
+ * @param $path
+ * The path to investigate for corresponding aliases or system URLs.
*/
-function drupal_get_path_map($action = '') {
- static $map = NULL;
+function drupal_lookup_path($action, $path = '') {
+ static $map = array();
+ static $count = NULL;
- if ($action == 'rebuild') {
- $map = NULL;
+ if ($count === NULL) {
+ $count = db_result(db_query('SELECT COUNT(pid) FROM {url_alias}'));
}
- if (is_null($map)) {
- $map = array(); // Make $map non-null in case no aliases are defined.
- $result = db_query('SELECT * FROM {url_alias}');
- while ($data = db_fetch_object($result)) {
- $map[$data->dst] = $data->src;
+ if ($action == 'wipe') {
+ $map = array();
+ }
+ elseif ($count > 0 && $path != '') {
+ if ($action == 'source') {
+ if (isset($map[$path])) {
+ return $map[$path];
+ }
+ if ($alias = db_result(db_query("SELECT dst FROM {url_alias} WHERE src = '%s'", $path))) {
+ $map[$path] = $alias;
+ return $alias;
+ }
+ else {
+ $map[$path] = $path;
+ }
+ }
+ elseif ($action == 'alias') {
+ if ($alias = array_search($path, $map)) {
+ return $alias;
+ }
+ if (!isset($map[$path])) {
+ if ($src = db_result(db_query("SELECT src FROM {url_alias} WHERE dst = '%s'", $path))) {
+ $map[$src] = $path;
+ return $src;
+ }
+ else {
+ $map[$path] = $path;
+ }
+ }
}
}
- return $map;
+ return FALSE;
}
/**
* Given an internal Drupal path, return the alias set by the administrator.
*/
function drupal_get_path_alias($path) {
- if (($map = drupal_get_path_map()) && ($newpath = array_search($path, $map))) {
- return $newpath;
+ if ($alias = drupal_lookup_path('source', $path)) {
+ return $alias;
}
elseif (function_exists('conf_url_rewrite')) {
return conf_url_rewrite($path, 'outgoing');
@@ -644,7 +678,7 @@ function arg($index) {
$arguments = explode('/', $_GET['q']);
}
- if (array_key_exists($index, $arguments)) {
+ if ($arguments[$index] !== NULL) {
return $arguments[$index];
}
}
diff --git a/includes/common.inc b/includes/common.inc
index 61be3f5a1..2511e70c6 100644
--- a/includes/common.inc
+++ b/includes/common.inc
@@ -80,18 +80,19 @@ function drupal_get_html_head() {
}
/**
- * Regenerate the path map from the information in the database.
+ * Reset the static variable which holds the aliases mapped for this request.
*/
-function drupal_rebuild_path_map() {
- drupal_get_path_map('rebuild');
+function drupal_clear_path_cache() {
+ drupal_lookup_path('wipe');
}
/**
* Given a path alias, return the internal path it represents.
*/
function drupal_get_normal_path($path) {
- if (($map = drupal_get_path_map()) && isset($map[$path])) {
- return $map[$path];
+ //drupal_get_path_alias($path);
+ if ($src = drupal_lookup_path('alias', $path)) {
+ return $src;
}
elseif (function_exists('conf_url_rewrite')) {
return conf_url_rewrite($path, 'incoming');
@@ -1531,7 +1532,7 @@ function url($path = NULL, $query = NULL, $fragment = NULL, $absolute = FALSE) {
* An HTML string ready for insertion in a tag.
*/
function drupal_attributes($attributes = array()) {
- if ($attributes) {
+ if (is_array($attributes)) {
$t = array();
foreach ($attributes as $key => $value) {
$t[] = $key .'="'. check_plain($value) .'"';
@@ -1551,7 +1552,8 @@ function drupal_attributes($attributes = array()) {
* @param $text
* The text to be enclosed with the anchor tag.
* @param $path
- * The Drupal path being linked to, such as "admin/node".
+ * The Drupal path being linked to, such as "admin/node". Note, this must be a
+ * system URL as the url() function will generate the alias.
* @param $attributes
* An associative array of HTML attributes to apply to the anchor tag.
* @param $query
@@ -1567,7 +1569,7 @@ function drupal_attributes($attributes = array()) {
* an HTML string containing a link to the given path.
*/
function l($text, $path, $attributes = array(), $query = NULL, $fragment = NULL, $absolute = FALSE, $html = FALSE) {
- if (drupal_get_normal_path($path) == $_GET['q']) {
+ if ($path == $_GET['q']) {
if (isset($attributes['class'])) {
$attributes['class'] .= ' active';
}