diff -r 0931d60f5bdb -r 2b2084ca1e60 includes/paths.php~ --- a/includes/paths.php~ Wed Jun 13 16:32:27 2007 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,808 +0,0 @@ -pages = Array(); - - dc_here('paths: setting up namespaces, admin nodes'); - - // DEFINE NAMESPACES HERE - // The key names should NOT EVER be changed, or Enano will be very broken - $this->nslist = Array( - 'Article' =>'', - 'User' =>'User:', - 'File' =>'File:', - 'Help' =>'Help:', - 'Admin' =>'Admin:', - 'Special' =>'Special:', - 'System' =>'Enano:', - 'Template'=>'Template:', - 'Category'=>'Category:', - 'Project' =>str_replace(' ', '_', getConfig('site_name')).':', - ); - - // ACL types - // Note: you can set any of these to AUTH_DENY to universally and unconditionally deny access to the selected action. - // These can also be added from within plugins - - $session->register_acl_type('read', AUTH_ALLOW, 'Read page(s)'); - $session->register_acl_type('post_comments', AUTH_ALLOW, 'Post comments', Array('read'), 'Article|User|Project|Template|File|Help|System|Category'); - $session->register_acl_type('edit_comments', AUTH_ALLOW, 'Edit own comments', Array('post_comments'), 'Article|User|Project|Template|File|Help|System|Category'); - $session->register_acl_type('edit_page', AUTH_WIKIMODE, 'Edit page', Array('view_source'), 'Article|User|Project|Template|File|Help|System|Category'); - $session->register_acl_type('view_source', AUTH_WIKIMODE, 'View source', Array('read'), 'Article|User|Project|Template|File|Help|System|Category'); // Only used if the page is protected - $session->register_acl_type('mod_comments', AUTH_DISALLOW, 'Moderate comments', Array('edit_comments'), 'Article|User|Project|Template|File|Help|System|Category'); - $session->register_acl_type('history_view', AUTH_WIKIMODE, 'View history/diffs', Array('read'), 'Article|User|Project|Template|File|Help|System|Category'); - $session->register_acl_type('history_rollback', AUTH_DISALLOW, 'Rollback history', Array('history_view'), 'Article|User|Project|Template|File|Help|System|Category'); - $session->register_acl_type('history_rollback_extra', AUTH_DISALLOW, 'Undelete page(s)', Array('history_rollback'), 'Article|User|Project|Template|File|Help|System|Category'); - $session->register_acl_type('protect', AUTH_DISALLOW, 'Protect page(s)', Array('read'), 'Article|User|Project|Template|File|Help|System|Category'); - $session->register_acl_type('rename', AUTH_WIKIMODE, 'Rename page(s)', Array('read'), 'Article|User|Project|Template|File|Help|System|Category'); - $session->register_acl_type('clear_logs', AUTH_DISALLOW, 'Clear page logs (dangerous)', Array('read', 'protect', 'even_when_protected'), 'Article|User|Project|Template|File|Help|System|Category'); - $session->register_acl_type('vote_delete', AUTH_ALLOW, 'Vote to delete', Array('read'), 'Article|User|Project|Template|File|Help|System|Category'); - $session->register_acl_type('vote_reset', AUTH_DISALLOW, 'Reset delete votes', Array('read'), 'Article|User|Project|Template|File|Help|System|Category'); - $session->register_acl_type('delete_page', AUTH_DISALLOW, 'Delete page(s)', Array(), 'Article|User|Project|Template|File|Help|System|Category'); - $session->register_acl_type('set_wiki_mode', AUTH_DISALLOW, 'Set per-page wiki mode', Array('read'), 'Article|User|Project|Template|File|Help|System|Category'); - $session->register_acl_type('password_set', AUTH_DISALLOW, 'Set password', Array('read'), 'Article|User|Project|Template|File|Help|System|Category'); - $session->register_acl_type('password_reset', AUTH_DISALLOW, 'Disable/reset password', Array('read'), 'Article|User|Project|Template|File|Help|System|Category'); - $session->register_acl_type('mod_misc', AUTH_DISALLOW, 'Super moderator (generate SQL backtraces, view IP addresses, and send large numbers of private messages)', Array(), 'All'); - $session->register_acl_type('edit_cat', AUTH_WIKIMODE, 'Edit categorization', Array('read'), 'Article|User|Project|Template|File|Help|System|Category'); - $session->register_acl_type('even_when_protected', AUTH_DISALLOW, 'Allow editing, renaming, and categorization even when protected', Array('edit_page', 'rename', 'mod_comments', 'edit_cat'), 'Article|User|Project|Template|File|Help|System|Category'); - $session->register_acl_type('upload_files', AUTH_DISALLOW, 'Upload files', Array('create_page'), 'Article|User|Project|Template|File|Help|System|Category|Special'); - $session->register_acl_type('upload_new_version', AUTH_WIKIMODE, 'Upload new versions of files', Array('upload_files'), 'Article|User|Project|Template|File|Help|System|Category|Special'); - $session->register_acl_type('create_page', AUTH_WIKIMODE, 'Create pages', Array(), 'Article|User|Project|Template|File|Help|System|Category|Special'); - $session->register_acl_type('php_in_pages', AUTH_DISALLOW, 'Embed PHP code in pages', Array('edit_page'), 'Article|User|Project|Template|File|Help|System|Category'); - $session->register_acl_type('edit_acl', AUTH_DISALLOW, 'Edit access control lists', Array('read', 'post_comments', 'edit_comments', 'edit_page', 'view_source', 'mod_comments', 'history_view', 'history_rollback', 'history_rollback_extra', 'protect', 'rename', 'clear_logs', 'vote_delete', 'vote_reset', 'delete_page', 'set_wiki_mode', 'password_set', 'password_reset', 'mod_misc', 'edit_cat', 'even_when_protected', 'upload_files', 'upload_new_version', 'create_page', 'php_in_pages')); - - // DO NOT add new admin pages here! Use a plugin to call $paths->addAdminNode(); - $this->addAdminNode('General', 'General Configuration', 'GeneralConfig'); - $this->addAdminNode('General', 'File uploads', 'UploadConfig'); - $this->addAdminNode('General', 'Allowed file types', 'UploadAllowedMimeTypes'); - $this->addAdminNode('General', 'Manage Plugins', 'PluginManager'); - $this->addAdminNode('General', 'Backup database', 'DBBackup'); - $this->addAdminNode('Content', 'Manage Pages', 'PageManager'); - $this->addAdminNode('Content', 'Edit page content', 'PageEditor'); - $this->addAdminNode('Appearance', 'Manage themes', 'ThemeManager'); - $this->addAdminNode('Users', 'Manage users', 'UserManager'); - $this->addAdminNode('Users', 'Edit groups', 'GroupManager'); - $this->addAdminNode('Users', 'Ban control', 'BanControl'); - $this->addAdminNode('Users', 'Mass e-mail', 'MassEmail'); - - $code = $plugins->setHook('acl_rule_init'); - foreach ( $code as $cmd ) - { - eval($cmd); - } - - $this->wiki_mode = (int)getConfig('wiki_mode')=='1'; - $this->template_cache = Array(); - } - function pathManager() - { - $this->__construct(); - } - function init() - { - global $db, $session, $paths, $template, $plugins; // Common objects - - dc_here('paths: selecting master page data'); - - $code = $plugins->setHook('paths_init_before'); - foreach ( $code as $cmd ) - { - eval($cmd); - } - - $e = $db->sql_query('SELECT name,urlname,namespace,special,visible,comments_on,protected,delvotes,delvote_ips,wiki_mode,password FROM '.table_prefix.'pages ORDER BY name;'); - if( !$e ) - { - $db->_die('The error seems to have occured while selecting the page information. File: includes/paths.php; line: '.__LINE__); - } - while($r = $db->fetchrow()) - { - - $r['urlname_nons'] = $r['urlname']; - $r['urlname'] = $this->nslist[$r['namespace']] . $r['urlname']; // Applies the User:/File:/etc prefixes to the URL names - - 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; - } - - $this->pages[$r['urlname']] = $r; - $this->pages[] =& $this->pages[$r['urlname']]; - - } - $db->free_result(); - dc_here('paths: determining page ID'); - if( isset($_GET['title']) ) - { - if ( $_GET['title'] == '' && getConfig('main_page') != '' ) - { - $this->main_page(); - } - if(strstr($_GET['title'], ' ')) - { - $loc = urldecode(rawurldecode($_SERVER['REQUEST_URI'])); - $loc = str_replace(' ', '_', $loc); - $loc = str_replace('+', '_', $loc); - $loc = str_replace('%20', '_', $loc); - redirect($loc, 'Redirecting...', 'Space detected in the URL, please wait whilst you are redirected', 0); - exit; - } - $url_namespace_special = substr($_GET['title'], 0, strlen($this->nslist['Special']) ); - $url_namespace_template = substr($_GET['title'], 0, strlen($this->nslist['Template']) ); - if($url_namespace_special == $this->nslist['Special'] || $url_namespace_template == $this->nslist['Template'] ) - { - $ex = explode('/', $_GET['title']); - $this->page = $ex[0]; - } - else - { - $this->page = $_GET['title']; - } - $this->fullpage = $_GET['title']; - } - elseif( isset($_SERVER['PATH_INFO']) ) - { - $pi = explode('/', $_SERVER['PATH_INFO']); - - if( !isset($pi[1]) || (isset($pi[1]) && $pi[1] == '' && getConfig('main_page') != '') ) - { - $this->main_page(); - } - if( strstr($pi[1], ' ') ) - { - $loc = str_replace(' ', '_', urldecode(rawurldecode($_SERVER['REQUEST_URI']))); - $loc = str_replace('+', '_', $loc); - $loc = str_replace('%20', '_', $loc); - redirect($loc, 'Redirecting...', 'Please wait whilst you are redirected', 3); - exit; - } - unset($pi[0]); - if( substr($pi[1], 0, strlen($this->nslist['Special'])) == $this->nslist['Special'] || substr($pi[1], 0, strlen($this->nslist['Template'])) == $this->nslist['Template'] ) - { - $pi2 = $pi[1]; - } - else - { - $pi2 = implode('/', $pi); - } - $this->page = $pi2; - $this->fullpage = implode('/', $pi); - } - else - { - $k = array_keys($_GET); - foreach($k as $c) - { - if(substr($c, 0, 1) == '/') - { - $this->page = substr($c, 1, strlen($c)); - - // Bugfix for apache somehow passing dots as underscores - global $mime_types; - $exts = array_keys($mime_types); - $exts = '(' . implode('|', $exts) . ')'; - if ( preg_match( '#_'.$exts.'#i', $this->page ) ) - $this->page = preg_replace( '#_'.$exts.'#i', '.\\1', $this->page ); - - $this->fullpage = $this->page; - - if(substr($this->page, 0, strlen($this->nslist['Special']))==$this->nslist['Special'] || substr($this->page, 0, strlen($this->nslist['Template']))==$this->nslist['Template']) - { - $ex = explode('/', $this->page); - $this->page = $ex[0]; - } - if(strstr($this->page, ' ')) - { - $loc = str_replace(' ', '_', urldecode(rawurldecode($_SERVER['REQUEST_URI']))); - $loc = str_replace('+', '_', $loc); - $loc = str_replace('%20', '_', $loc); - redirect($loc, 'Redirecting...', 'Space in the URL detected, please wait whilst you are redirected', 0); - exit; - } - break; - } - } - if(!$this->page && !($this->page == '' && getConfig('main_page') == '')) - { - $this->main_page(); - } - } - - dc_here('paths: setting $paths->cpage'); - - if(isset($this->pages[$this->page])) - { - dc_here('paths: page existence verified, our page ID is: '.$this->page); - $this->page_exists = true; - $this->cpage = $this->pages[$this->page]; - $this->namespace = $this->cpage['namespace']; - if(!isset($this->cpage['wiki_mode'])) $this->cpage['wiki_mode'] = 2; - - // Determine the wiki mode for this page, now that we have this->cpage established - if($this->cpage['wiki_mode'] == 2) - { - $this->wiki_mode = (int)getConfig('wiki_mode'); - } - else - { - $this->wiki_mode = $this->cpage['wiki_mode']; - } - // Allow the user to create/modify his user page uncondtionally (admins can still protect the page) - if($this->page == $this->nslist['User'].str_replace(' ', '_', $session->username)) - { - $this->wiki_mode = true; - } - // And above all, if the site requires wiki mode to be off for non-logged-in users, disable it now - if(getConfig('wiki_mode_require_login')=='1' && !$session->user_logged_in) - { - $this->wiki_mode = false; - } - if($this->cpage['protected'] == 2) - { - // The page is semi-protected, determine permissions - if($session->user_logged_in && $session->reg_time + 60*60*24*4 < time()) - { - $this->page_protected = 0; - } - else - { - $this->page_protected = 1; - } - } - else - { - $this->page_protected = $this->cpage['protected']; - } - } - else - { - dc_here('paths: page doesn\'t exist, creating new page in memory
our page ID is: '.$this->page); - $this->page_exists = false; - $this->cpage = Array( - 'name'=>str_replace('_', ' ', $this->page), - 'urlname'=>$this->page, - 'namespace'=>'Article', - 'special'=>0, - 'visible'=>0, - 'comments_on'=>1, - 'protected'=>0, - 'delvotes'=>0, - 'delvote_ips'=>'', - 'wiki_mode'=>2, - ); - // Look for a namespace prefix in the urlname, and assign a different namespace, if necessary - $k = array_keys($this->nslist); - for($i=0;$inslist);$i++) - { - $ln = strlen($this->nslist[$k[$i]]); - if( substr($this->page, 0, $ln) == $this->nslist[$k[$i]] ) - { - $this->cpage['namespace'] = $k[$i]; - $this->cpage['urlname_nons'] = substr($this->page, strlen($this->nslist[$this->cpage['namespace']]), strlen($this->page)); - if(!isset($this->cpage['wiki_mode'])) - { - $this->cpage['wiki_mode'] = 2; - } - } - } - $this->namespace = $this->cpage['namespace']; - - if($this->namespace=='System') - { - $this->cpage['protected'] = 1; - } - if($this->namespace=='Special') - { - // Can't load nonexistent pages - $this->main_page(); - } - // Allow the user to create/modify his user page uncondtionally (admins can still protect the page) - if($this->page == $this->nslist['User'].str_replace(' ', '_', $session->username)) - { - $this->wiki_mode = true; - } - } - // This is used in the admin panel to keep track of form submission targets - $this->cpage['module'] = $this->cpage['urlname']; - - // Page is set up, call any hooks - $code = $plugins->setHook('page_set'); - foreach ( $code as $cmd ) - { - eval($cmd); - } - - $session->init_permissions(); - } - - function add_page($flags) - { - //dc_dump($flags, 'paths: page added by plugin:'); - $flags['urlname_nons'] = $flags['urlname']; - $flags['urlname'] = $this->nslist[$flags['namespace']] . $flags['urlname']; // Applies the User:/File:/etc prefixes to the URL names - $pages_len = sizeof($this->pages)/2; - $this->pages[$pages_len] = $flags; - $this->pages[$flags['urlname']] =& $this->pages[$pages_len]; - } - - function main_page() - { - if( is_string(getConfig('main_page')) ) - { - header('Location: '.makeUrl(getConfig('main_page'))); - die('If you aren\'t redirected, click here.'); - } - else - { - header('Location: '.makeUrl($this->pages[0]['urlname'])); - die('If you aren\'t redirected, click here.'); - } - exit; - } - - function sysmsg($n) - { - global $db, $session, $paths, $template, $plugins; // Common objects - dc_here('paths: system message requested: '.$n); - $q = $db->sql_query('SELECT page_text, char_tag FROM '.table_prefix.'page_text WHERE page_id=\''.$db->escape($n).'\' AND namespace=\'System\''); - if( !$q ) - { - $db->_die('Error during generic selection of system page data.'); - } - if($db->numrows() < 1) - { - return false; - //$db->_die('Error during generic selection of system page data: there were no rows in the text table that matched the page text query.'); - } - $r = $db->fetchrow(); - $db->free_result(); - $message = $r['page_text']; - - $message = preg_replace('/(.*?)<\/noinclude>/is', '', $message); - - return $message; - } - function get_pageid_from_url() - { - if(isset($_GET['title'])) - { - if( $_GET['title'] == '' && getConfig('main_page') != '' ) - { - $this->main_page(); - } - if(strstr($_GET['title'], ' ')) - { - $loc = urldecode(rawurldecode($_SERVER['REQUEST_URI'])); - $loc = str_replace(' ', '_', $loc); - $loc = str_replace('+', '_', $loc); - header('Location: '.$loc); - exit; - } - $ret = $_GET['title']; - } - elseif(isset($_SERVER['PATH_INFO'])) - { - $pi = explode('/', $_SERVER['PATH_INFO']); - - if(!isset($pi[1]) || (isset($pi[1]) && $pi[1] == '')) - { - return false; - } - - if(strstr($pi[1], ' ')) - { - $loc = urldecode(rawurldecode($_SERVER['REQUEST_URI'])); - $loc = str_replace(' ', '_', $loc); - $loc = str_replace('+', '_', $loc); - header('Location: '.$loc); - exit; - } - if( !( substr($pi[1], 0, strlen($this->nslist['Special'])) == $this->nslist['Special'] ) ) - { - unset($pi[0]); - $pi[1] = implode('/', $pi); - } - $ret = $pi[1]; - } - else - { - $k = array_keys($_GET); - foreach($k as $c) - { - if(substr($c, 0, 1) == '/') - { - $ret = substr($c, 1, strlen($c)); - if(substr($ret, 0, strlen($this->nslist['Special'])) == $this->nslist['Special'] || - substr($ret, 0, strlen($this->nslist['Admin'])) == $this->nslist['Admin']) - { - $ret = explode('/', $ret); - $ret = $ret[0]; - } - break; - } - } - } - - return ( isset($ret) ) ? $ret : false; - } - // Parses a (very carefully formed) array into Javascript code compatible with the Tigra Tree Menu used in the admin menu - function parseAdminTree() - { - $k = array_keys($this->admin_tree); - $i = 0; - $ret = ''; - $ret .= "var TREE_ITEMS = [\n ['Administration panel home', 'javascript:ajaxPage(\'".$this->nslist['Admin']."Home\');',\n "; - foreach($k as $key) - { - $i++; - $ret .= "['".$key."', 'javascript:trees[0].toggle($i)', \n"; - foreach($this->admin_tree[$key] as $c) - { - $i++; - $ret .= " ['".$c['name']."', 'javascript:ajaxPage(\\'".$this->nslist['Admin'].$c['pageid']."\\');'],\n"; - } - $ret .= " ],\n"; - } - $ret .= " ['Log out of admin panel', 'javascript:ajaxPage(\\'".$this->nslist['Admin']."AdminLogout\\');'],\n"; - // I used this while I painstakingly wrote the Runt code that auto-expands certain nodes based on the value of a bitfield stored in a cookie. *shudders* - // $ret .= " ['(debug) Clear menu bitfield', 'javascript:createCookie(\\'admin_menu_state\\', \\'1\\', 365);'],\n"; - $ret .= "]\n];"; - return $ret; - } - function addAdminNode($section, $page_title, $url) - { - if(!isset($this->admin_tree[$section])) - { - $this->admin_tree[$section] = Array(); - } - $this->admin_tree[$section][] = Array( - 'name'=>$page_title, - 'pageid'=>$url - ); - } - function getParam($id = 0) - { - if(isset($_SERVER['PATH_INFO'])) - { - $pi = explode('/', $_SERVER['PATH_INFO']); - $id = $id + 2; - return isset($pi[$id]) ? $pi[$id] : false; - } - else if( isset($_GET['title']) ) - { - $pi = explode('/', $_GET['title']); - $id = $id + 1; - return isset($pi[$id]) ? $pi[$id] : false; - } - else - { - $k = array_keys($_GET); - foreach($k as $c) - { - if(substr($c, 0, 1) == '/') - { - - // Bugfix for apache somehow passing dots as underscores - global $mime_types; - $exts = array_keys($mime_types); - $exts = '(' . implode('|', $exts) . ')'; - if ( preg_match( '#_'.$exts.'#i', $c ) ) - $c = preg_replace( '#_'.$exts.'#i', '.\\1', $c ); - - $pi = explode('/', $c); - $id = $id + 2; - return isset($pi[$id]) ? $pi[$id] : false; - } - } - return false; - } - } - - function getAllParams() - { - if(isset($_SERVER['PATH_INFO'])) - { - $pi = explode('/', $_SERVER['PATH_INFO']); - unset($pi[0], $pi[1]); - return implode('/', $pi); - } - else if( isset($_GET['title']) ) - { - $pi = explode('/', $_GET['title']); - unset($pi[0]); - return implode('/', $pi); - } - else - { - $k = array_keys($_GET); - foreach($k as $c) - { - if(substr($c, 0, 1) == '/') - { - // Bugfix for apache somehow passing dots as underscores - global $mime_types; - $exts = array_keys($mime_types); - $exts = '(' . implode('|', $exts) . ')'; - if ( preg_match( '#_'.$exts.'#i', $c ) ) - $c = preg_replace( '#_'.$exts.'#i', '.\\1', $c ); - - $pi = explode('/', $c); - unset($pi[0], $pi[1]); - return implode('/', $pi); - } - } - return false; - } - } - - /** - * Creates a new namespace in memory - * @param string $id the namespace ID - * @param string $prefix the URL prefix, must not be blank or already used - * @return bool true on success false on failure - */ - - function create_namespace($id, $prefix) - { - if(in_array($prefix, $this->nslist)) - { - // echo 'Warning: pathManager::create_namespace: Prefix "'.$prefix.'" is already taken
'; - return false; - } - if( isset($this->nslist[$id]) ) - { - // echo 'Warning: pathManager::create_namespace: Namespace ID "'.$prefix.'" is already taken
'; - return false; - } - $this->nslist[$id] = $prefix; - } - - /** - * Fetches the page texts for searching - */ - - function fetch_page_search_texts() - { - global $db, $session, $paths, $template, $plugins; // Common objects - $texts = Array(); - $q = $db->sql_query('SELECT t.page_id,t.namespace,t.page_text,t.char_tag FROM '.table_prefix.'page_text AS t - LEFT JOIN '.table_prefix.'pages AS p - ON t.page_id=p.urlname - WHERE p.namespace=t.namespace - AND ( p.password=\'\' OR p.password=\'da39a3ee5e6b4b0d3255bfef95601890afd80709\' ) - AND p.visible=1;'); // Only indexes "visible" pages - - if( !$q ) - { - return false; - } - while($row = $db->fetchrow()) - { - $pid = $this->nslist[$row['namespace']] . $row['page_id']; - $texts[$pid] = $row['page_text']; - } - $db->free_result(); - - return $texts; - } - - /** - * Fetches a MySQL search query to use for Searcher::searchMySQL() - */ - - function fetch_page_search_resource() - { - global $db, $session, $paths, $template, $plugins; // Common objects - // sha1('') returns "da39a3ee5e6b4b0d3255bfef95601890afd80709" - $texts = 'SELECT t.page_text,CONCAT(\'ns=\',t.namespace,\';pid=\',t.page_id) FROM '.table_prefix.'page_text AS t - LEFT JOIN '.table_prefix.'pages AS p - ON ( t.page_id=p.urlname AND t.namespace=p.namespace ) - WHERE p.namespace=t.namespace - AND ( p.password=\'\' OR p.password=\'da39a3ee5e6b4b0d3255bfef95601890afd80709\' ) - AND p.visible=1;'; // Only indexes "visible" pages - return $texts; - } - - /** - * Rebuilds the search index - */ - - function rebuild_search_index() - { - global $db, $session, $paths, $template, $plugins; // Common objects - $search = new Searcher(); - $texts = Array(); - $textq = $db->sql_unbuffered_query($this->fetch_page_search_resource()); - if(!$textq) $db->_die(''); - while($row = $db->fetchrow_num()) - { - $texts[(string)$row[1]] = $row[0]; - } - $search->buildIndex($texts); - // echo '
'.print_r($search->index, true).'
'; - // return; - $q = $db->sql_query('DELETE FROM '.table_prefix.'search_index'); - if(!$q) return false; - $secs = Array(); - $q = 'INSERT INTO '.table_prefix.'search_index(word,page_names) VALUES'; - foreach($search->index as $word => $pages) - { - $secs[] = '(\''.$db->escape($word).'\', \''.$db->escape($pages).'\')'; - } - $q .= implode(',', $secs); - unset($secs); - $q .= ';'; - $result = $db->sql_query($q); - $db->free_result(); - if($result) - return true; - else - $db->_die('The search index was trying to rebuild itself when the error occured.'); - } - - /** - * Partially rebuilds the search index, removing/inserting entries only for the current page - * @param string $page_id - * @param string $namespace - */ - - function rebuild_page_index($page_id, $namespace) - { - global $db, $session, $paths, $template, $plugins; // Common objects - if(!$db->sql_query('SELECT page_text FROM '.table_prefix.'page_text - WHERE page_id=\''.$db->escape($page_id).'\' AND namespace=\''.$db->escape($namespace).'\';')) - { - return $db->get_error(); - } - $row = $db->fetchrow(); - $db->free_result(); - $search = new Searcher(); - $search->buildIndex(Array("ns={$namespace};pid={$page_id}"=>$row['page_text'])); - $new_index = $search->index; - - $keys = array_keys($search->index); - foreach($keys as $i => $k) - { - $c =& $keys[$i]; - $c = hexencode($c, '', ''); - } - $keys = "word=0x" . implode ( " OR word=0x", $keys ) . ""; - - // Zap the cache - $cache = array_keys($search->index); - if ( count($cache) < 1 ) - { - return false; - } - $cache = "query LIKE '%" . implode ( "%' OR query LIKE '%", $cache ) . "%'"; - $db->sql_query('DELETE FROM '.table_prefix.'search_cache WHERE '.$cache); - - $query = $db->sql_query('SELECT word,page_names FROM '.table_prefix.'search_index WHERE '.$keys.';'); - - while($row = $db->fetchrow()) - { - $row['word'] = rtrim($row['word'], "\0"); - $new_index[ $row['word'] ] = $row['page_names'] . ',' . $search->index[ $row['word'] ]; - } - $db->free_result(); - - $db->sql_query('DELETE FROM '.table_prefix.'search_index WHERE '.$keys.';'); - - $secs = Array(); - $q = 'INSERT INTO '.table_prefix.'search_index(word,page_names) VALUES'; - foreach($new_index as $word => $pages) - { - $secs[] = '(\''.$db->escape($word).'\', \''.$db->escape($pages).'\')'; - } - $q .= implode(',', $secs); - unset($secs); - $q .= ';'; - if(!$db->check_query($q)) - { - die('BUG: PathManager::rebuild_page_index: Query rejected by SQL parser:
'.$q.'
'); - } - $result = $db->sql_query($q); - if($result) - return true; - else - $db->_die('The search index was trying to rebuild itself when the error occured.'); - - } - - /** - * Creates an instance of the Searcher class, including index info - * @return object - */ - - function makeSearcher($match_case = false) - { - global $db, $session, $paths, $template, $plugins; // Common objects - $search = new Searcher(); - $q = $db->sql_query('SELECT word,page_names FROM '.table_prefix.'search_index;'); - if(!$q) - { - echo $db->get_error(); - return false; - } - $idx = Array(); - while($row = $db->fetchrow($q)) - { - $row['word'] = rtrim($row['word'], "\0"); - $idx[$row['word']] = $row['page_names']; - } - $db->free_result(); - $search->index = $idx; - if($match_case) - $search->match_case = true; - return $search; - } - - /** - * Creates an associative array filled with the values of all the page titles - * @return array - */ - - function get_page_titles() - { - $texts = Array(); - for ( $i = 0; $i < sizeof($this->pages) / 2; $i++ ) - { - $texts[$this->pages[$i]['urlname']] = $this->pages[$i]['name']; - } - return $texts; - } - - /** - * Creates an instance of the Searcher class, including index info for page titles - * @return object - */ - - function makeTitleSearcher($match_case = false) - { - global $db, $session, $paths, $template, $plugins; // Common objects - $search = new Searcher(); - $texts = $this->get_page_titles(); - $search->buildIndex($texts); - if($match_case) - $search->match_case = true; - return $search; - } - -} - -?>