diff -r 27377179fe58 -r 4f9bec0d65c1 includes/paths.php --- a/includes/paths.php Wed Jul 02 19:36:44 2008 -0400 +++ b/includes/paths.php Wed Jul 02 22:15:55 2008 -0400 @@ -116,6 +116,7 @@ $this->wiki_mode = ( getConfig('wiki_mode') == '1' ) ? 1 : 0; $this->template_cache = Array(); } + function parse_url($sanitize = true) { $title = ''; @@ -150,6 +151,7 @@ } return ( $sanitize ) ? sanitize_page_id($title) : $title; } + function init() { global $db, $session, $paths, $template, $plugins; // Common objects @@ -161,46 +163,38 @@ eval($cmd); } - $e = $db->sql_query('SELECT name,urlname,namespace,special,visible,comments_on,protected,delvotes,' . "\n" - . ' delvote_ips,wiki_mode,password FROM '.table_prefix.'pages ORDER BY name;'); - if( !$e ) + $cache_enable = ( getConfig('cache_thumbs') == '1' ); + $cache_file = ENANO_ROOT . '/cache/cache_page_meta.php'; + $cache_fresh = ( file_exists($cache_file) ) ? filemtime($cache_file) + 1800 >= time() : false; + if ( $cache_enable && $cache_fresh ) { - $db->_die('The error seems to have occured while selecting the page information. File: includes/paths.php; line: '.__LINE__); + require($cache_file); + if ( isset($page_cache) && is_array($page_cache) ) + { + $this->pages = array_merge($this->pages, $page_cache); + } } - while($r = $db->fetchrow()) + else { + $e = $db->sql_query('SELECT name,urlname,namespace,special,visible,comments_on,protected,delvotes,' . "\n" + . ' delvote_ips,wiki_mode,password FROM '.table_prefix.'pages ORDER BY name;'); - $r['urlname_nons'] = $r['urlname']; - if ( isset($this->nslist[$r['namespace']]) ) + if( !$e ) { - $r['urlname'] = $this->nslist[$r['namespace']] . $r['urlname']; // Applies the User:/File:/etc prefixes to the URL names + $db->_die('The error seems to have occured while selecting the page information. File: includes/paths.php; line: '.__LINE__); } - else + while($r = $db->fetchrow()) { - $ns_char = substr($this->nslist['Special'], -1); - $r['urlname'] = $r['namespace'] . $ns_char . $r['urlname']; + $r = $this->calculate_metadata_from_row($r); + + $this->pages[$r['urlname']] = $r; + $this->pages[] =& $this->pages[$r['urlname']]; } - if ( $r['delvotes'] == null) - { - $r['delvotes'] = 0; - } - if ( $r['protected'] == 0 || $r['protected'] == 1 ) - { - $r['really_protected'] = (int)$r['protected']; - } - else if ( $r['protected'] == 2 && getConfig('wiki_mode') == '1') + if ( $cache_enable ) { - $r['really_protected'] = 1; + $this->update_metadata_cache(); } - else if ( $r['protected'] == 2 && getConfig('wiki_mode') == '0' ) - { - $r['really_protected'] = 0; - } - - $this->pages[$r['urlname']] = $r; - $this->pages[] =& $this->pages[$r['urlname']]; - } $db->free_result(); if ( defined('ENANO_INTERFACE_INDEX') || defined('ENANO_INTERFACE_AJAX') || defined('IN_ENANO_UPGRADE') ) @@ -401,7 +395,6 @@ profiler_log('Paths and CMS core initted'); $session->init_permissions(); - profiler_log('Default ACL set retrieved'); } function add_page($flags) @@ -584,6 +577,86 @@ } /** + * Updates the cache containing all page metadata. + */ + + function update_metadata_cache() + { + global $db, $session, $paths, $template, $plugins; // Common objects + + $cache_output = <<sql_unbuffered_query('SELECT name,urlname,namespace,special,visible,comments_on,protected,delvotes,' . "\n" + . ' delvote_ips,wiki_mode,password FROM '.table_prefix.'pages ORDER BY name;'); + if ( !$e ) + $db->_die(); + + while ( $row = $db->fetchrow() ) + { + $row = $this->calculate_metadata_from_row($row); + $key = addslashes($row['urlname']); + $row = substr(preg_replace('/^/m', ' ', Language::var_export_string($row)), 2); + $cache_output .= "\n '$key' => $row,"; + } + + $cache_output .= "\n);\n"; + $cache_file = ENANO_ROOT . '/cache/cache_page_meta.php'; + + $fh = @fopen($cache_file, 'w'); + if ( !$fh ) + return false; + fwrite($fh, $cache_output); + fclose($fh); + + return true; + } + + /** + * Takes a result row from the pages table and calculates correct values for it. + * @param array + * @return array + */ + + function calculate_metadata_from_row($r) + { + $r['urlname_nons'] = $r['urlname']; + if ( isset($this->nslist[$r['namespace']]) ) + { + $r['urlname'] = $this->nslist[$r['namespace']] . $r['urlname']; // Applies the User:/File:/etc prefixes to the URL names + } + else + { + $ns_char = substr($this->nslist['Special'], -1); + $r['urlname'] = $r['namespace'] . $ns_char . $r['urlname']; + } + + if ( $r['delvotes'] == null) + { + $r['delvotes'] = 0; + } + if ( $r['protected'] == 0 || $r['protected'] == 1 ) + { + $r['really_protected'] = (int)$r['protected']; + } + else if ( $r['protected'] == 2 && getConfig('wiki_mode') == '1') + { + $r['really_protected'] = 1; + } + else if ( $r['protected'] == 2 && getConfig('wiki_mode') == '0' ) + { + $r['really_protected'] = 0; + } + return $r; + } + + /** * Registers a handler to manually process a namespace instead of the default PageProcessor behavior. * The first and only parameter passed to the processing function will be the PageProcessor instance. * @param string Namespace to process