Cleaned up files, fixed some discrepancies and made sure strings that needed escaping
authormchampan <mchampan>
Wed, 5 Jul 2006 14:37:16 +0000 (14:37 +0000)
committermchampan <mchampan>
Wed, 5 Jul 2006 14:37:16 +0000 (14:37 +0000)
used the correct function. Add description comments to files.

12 files changed:
mod/wiki/lib.php
search/README.txt
search/db/mysql.sql
search/db/postgres7.sql
search/documents/document.php
search/documents/wiki_document.php
search/index.php
search/indexer.php
search/indexersplash.php
search/lib.php
search/query.php
search/stats.php

index 487847c..6f99d25 100644 (file)
@@ -363,22 +363,8 @@ function wiki_get_entries(&$wiki, $byindex=NULL) {
 
 //rescued and converted from ewikimoodlelib.php
 //retrieves latest version of a page
-function wiki_get_latest_page(&$entry, $pagename, $version=0) {
-  global $CFG;
-   
-  //need something like this in datalib.php?
-  switch ($CFG->dbtype) {
-    case 'mysql':
-      $f = 'mysql_real_escape_string';
-      break;
-    case 'postgres7':
-      $f = 'pg_escape_string';
-      break;
-    default:
-      $f = 'addslashes';
-  } //switch
-  
-  $pagename = "'".$f($pagename)."'";
+function wiki_get_latest_page(&$entry, $pagename, $version=0) { 
+  $pagename = "'".addslashes($pagename)."'";
   
   if ($version > 0 and is_int($version)) {
     $version = "AND (version=$version)";
@@ -456,7 +442,7 @@ function wiki_get_content_for_index(&$wiki) {
       foreach($pages as $page) {
         if (strlen($page->content) > 0) {
           $i++;
-          $documents[] = new WikiSearchDocument($page, $entry->wikiid, $entry->course, $entry->userid, $entry->groupid);
+          $documents[] = new WikiSearchDocument($page, $entry->wikiid, $entry->course, $entry->groupid);
         } //if
       } //foreach
       
index c3d4ab1..f473073 100644 (file)
@@ -1,3 +1,9 @@
+latest
+------
+Started cleaning and standardising things.
+
+cvs v1.1
+--------
 This is the initial release (prototype) of Moodle's new search module -
 so basically watch out for sharp edges.
 
index 8317ebb..1efb7e4 100644 (file)
@@ -5,10 +5,6 @@ CREATE TABLE IF NOT EXISTS `prefix_search_documents` (
   `url` varchar(100) NOT NULL default '',
   `updated` timestamp NOT NULL default CURRENT_TIMESTAMP,
   `courseid` int(11) NOT NULL default '0',
-  `userid` int(11) NOT NULL default '0',
   `groupid` int(11) NOT NULL default '0',
   PRIMARY KEY  (`id`)
-) ENGINE=MyISAM AUTO_INCREMENT=1;
-
---DELETE FROM `prefix_search_documents`;
---ALTER TABLE `prefix_search_documents` AUTO_INCREMENT =1;
\ No newline at end of file
+) ENGINE=MyISAM AUTO_INCREMENT=1;
\ No newline at end of file
index 86b2684..52d1be4 100644 (file)
@@ -4,10 +4,6 @@ CREATE TABLE prefix_search_documents (
    title varchar(100) NOT NULL default '', 
    url varchar(100) NOT NULL default '', 
    updated timestamp NOT NULL DEFAULT NOW(), 
-   courseid int4, 
-   userid int4, 
+   courseid int4,    
    groupid int4
-);
-
---DELETE FROM prefix_search_documents;
---SELECT setval('public.prefix_search_documents_id_seq', 1);
\ No newline at end of file
+);
\ No newline at end of file
index f5d4697..c09ec37 100644 (file)
@@ -1,10 +1,12 @@
 <?php
+  /* Base search document from which other module/block types can
+   * extend.
+   * */
   
   class SearchDocument extends Zend_Search_Lucene_Document {  
-    public function __construct($document_type, $cid, $uid, $gid) {
+    public function __construct($document_type, $cid, $gid) {
       $this->addField(Zend_Search_Lucene_Field::Keyword('type', $document_type));
-      $this->addField(Zend_Search_Lucene_Field::Keyword('courseid', $cid));
-      $this->addField(Zend_Search_Lucene_Field::Keyword('userid', $uid));
+      $this->addField(Zend_Search_Lucene_Field::Keyword('courseid', $cid));    
       $this->addField(Zend_Search_Lucene_Field::Keyword('groupid', $gid));      
     } //constructor    
   } //SearchDocument
index a6d75ae..c70fa5c 100644 (file)
@@ -3,7 +3,7 @@
   require_once("$CFG->dirroot/search/documents/document.php");
   
   class WikiSearchDocument extends SearchDocument {  
-    public function __construct(&$page, $wiki_id, $cid, $uid, $gid) {
+    public function __construct(&$page, $wiki_id, $cid, $gid) {
       $this->addField(Zend_Search_Lucene_Field::Text('title', $page->pagename));
       $this->addField(Zend_Search_Lucene_Field::Text('author', $page->author));
       $this->addField(Zend_Search_Lucene_Field::UnStored('contents', $page->content));
@@ -12,7 +12,7 @@
       $this->addField(Zend_Search_Lucene_Field::Keyword('version', $page->version));
       $this->addField(Zend_Search_Lucene_Field::Keyword('wiki', $wiki_id));
       
-      parent::__construct(SEARCH_WIKI_TYPE, $cid, $uid, $gid);
+      parent::__construct(SEARCH_WIKI_TYPE, $cid, $gid);
     } //constructor    
   } //WikiSearchDocument
   
index 8c4db65..7ae7308 100644 (file)
@@ -1,10 +1,8 @@
 <?php  
-  /*$id = required_param('id', PARAM_INT);   // course
-  if (! $course = get_record("course", "id", $id)) {
-    error("Course ID is incorrect");
-  }
-  require_course_login($course);
-  add_to_log($course->id, "wiki", "view all", "index.php?id=$course->id", "");*/
+  /* Entry page for /search
+   * Redirects to query.php, because that is the most likely place a
+   * user intended to go to when typing moodle.site/search
+   * */
 
   header("Location: query.php");    
 ?>
\ No newline at end of file
index 0b9db79..5fda789 100644 (file)
@@ -1,4 +1,14 @@
 <?php
+  /* The indexer logic -
+   * Look through each installed module's lib file for necessary search functions,
+   * and if they're present (and the module search document class file), add the
+   * content to the index. Repeat this for blocks.
+   *
+   * Along with the index data, each document's summary gets stored in the database
+   * and synchronised to the index (flat file) via the primary key ('id') which is mapped
+   * to the 'dbid' field in the index
+   * */
+
   //this'll take some time, set up the environment
   @set_time_limit(0);
   @ob_implicit_flush(true);
   require_once('../config.php');
   require_once("$CFG->dirroot/search/lib.php");  
 
+  //only administrators can index the moodle installation, because access to all pages is required   
   require_login();
 
   if (!isadmin()) {
     error("You need to be an admin user to use this page.", "$CFG->wwwroot/login/index.php");
   } //if
   
+  //confirmation flag to prevent accidental reindexing (indexersplash.php is the correct entry point)
   $sure = strtolower(optional_param('areyousure', '', PARAM_ALPHA));
   
   if ($sure != 'yes') {
-    mtrace("Sorry, you weren't sure enough (<a href='index.php'>back to query page</a>).");
+    mtrace("<pre>Sorry, you need to confirm indexing via <a href='indexersplash.php'>indexersplash.php</a>"
+          .". (<a href='index.php'>Back to query page</a>).</pre>");
+          
     exit(0);
   } //if  
   
@@ -27,6 +41,7 @@
     exit(0);
   } //if
     
+  //php5 found, continue including php5-only files
   require_once("$CFG->dirroot/search/Zend/Search/Lucene.php");
   
   //begin timer
@@ -37,6 +52,7 @@
   $index_path = $CFG->dataroot.'/search';
   $index_db_file = "$CFG->dirroot/search/db/$CFG->dbtype.sql";  
   
+  //setup directory in data root
   if (!file_exists($index_path)) {
     mtrace("Data directory ($index_path) does not exist, attempting to create.");
     if (!mkdir($index_path)) {
@@ -48,9 +64,6 @@
     mtrace("Using $index_path as data directory.");
   } //else
 
-  //stop accidental re-indexing (zzz)
-  //search_pexit("Not indexing at this time.");
-
   $index = new Zend_Search_Lucene($index_path, true);
   
   //create the database tables
     modify_database($index_db_file, '', false);
     ob_end_clean(); //chuck the buffer and resume normal operation
   } //else
-  
-  //empty database table goes here
-  // delete * from search_documents;
-  // set auto_increment back to 1
-  
-  //-------- debug stuff
-  /*
-  include_once("$CFG->dirroot/mod/wiki/lib.php");
-  
-  $wikis = get_all_instances_in_courses("wiki", get_courses());
-  #search_pexit($wikis[1]);
-  $entries = wiki_get_entries($wikis[1]);
-  #search_pexit($entries);
-    
-  #$r = wiki_get_pages($entries[134]);
-  $r = wiki_get_latest_pages($entries[95]);
-  
-  search_pexit($r);
-  //ignore me --------*/
     
   mtrace('Starting activity modules');
+  
+  //the presence of the required search functions -
+  // * mod_iterator
+  // * mod_get_content_for_index
+  //are the sole basis for including a module in the index at the moment.
+  
   if ($mods = get_records_select('modules' /*'index this module?' where statement*/)) {
     foreach ($mods as $mod) {
       $libfile = "$CFG->dirroot/mod/$mod->name/lib.php";
+      
       if (file_exists($libfile)) {
         include_once($libfile);
         
         $iter_function = $mod->name.'_iterator';
         $index_function = $mod->name.'_get_content_for_index';
-        $include_file = $CFG->dirroot.'/search/documents/'.$mod->name.'_document.php';        
-        $c = 0;
+        
+        //specific module search document class
+        $class_file = $CFG->dirroot.'/search/documents/'.$mod->name.'_document.php';
+        
+        $counter = 0;
         $doc = new stdClass;
                 
-        if (function_exists($index_function) && function_exists($iter_function)) {
-          include_once($include_file);
+        if (file_exists($class_file) && function_exists($index_function) && function_exists($iter_function)) {
+          include_once($class_file);
           
           mtrace("Processing module function $index_function ...");
                      
             //begin transaction
             
             foreach($documents as $document) {
-              $c++;
-              
-              //db sync increases indexing time from 55 sec to 73 (64 on Saturday?), so ~30%
-              //therefore, let us make a custom insert function for this search module
-              
+              $counter++;
+                            
               //data object for db
               $doc->type = $document->type;
-              $doc->title = mysql_real_escape_string($document->title); //naughty
-              $doc->update = time();
-              $doc->permissions = 0;
+              $doc->title = search_escape_string($document->title);
+              $doc->update = time();              
               $doc->url = 'none';
-              $doc->courseid = $document->courseid;
-              $doc->userid = $document->userid;
+              $doc->courseid = $document->courseid;              
               $doc->groupid = $document->groupid;
               
               //insert summary into db
               
               //synchronise db with index
               $document->addField(Zend_Search_Lucene_Field::Keyword('dbid', $id));
+              
+              //add document to index
               $index->addDocument($document);                  
                             
-              //commit every 100 new documents, and print a status message                            
-              if (($c%100) == 0) {
+              //commit every x new documents, and print a status message                            
+              if (($counter%200) == 0) {
                 $index->commit();
-                mtrace(".. $c");                
+                mtrace(".. $counter");                
               } //if
             } //foreach
             
                   
           //commit left over documents, and finish up  
           $index->commit();
-          mtrace("-- $c documents indexed");
+          
+          mtrace("-- $counter documents indexed");
           mtrace('done.');          
         } //if
       } //if
     } //foreach
   } //if
   
-  //done modules
+  //finished modules
   mtrace('Finished activity modules');
   search_stopwatch();
+  
+  //now blocks...
+  //
+  
   mtrace(".<br><a href='index.php'>Back to query page</a>.");
   mtrace('</pre>');
 
index 961c61c..35e798f 100644 (file)
@@ -1,4 +1,9 @@
 <?php
+  /* This file serves as a splash-screen (entry page) to the indexer script -
+   * it is in place to prevent accidental reindexing which can lead to a loss
+   * of time, amongst other things.
+   * */
+  
   require_once('../config.php');
   require_once("$CFG->dirroot/search/lib.php");  
 
     $db_count = 0;
   } //else    
   
-  //elaborate on error messages, when db!=0 and index=0 -> corrupt, etc.
+  //TODO: elaborate on error messages, when db!=0 and index=0 -> corrupt, etc.
   if ($index_filecount != 0 or $db_count != 0) {    
-    mtrace("<pre>The data directory ($index_path) contains $index_filecount files, and "
-          ."there are $db_count records in the <em>search_documents</em> table.");    
-    mtrace('');    
-    mtrace("This indicates that you have already indexed this site - click the following "
-          ."link if you're sure you want to continue: <a href='indexer.php?areyousure=yes'>Go!</a>");          
-    mtrace('');          
-    mtrace("<a href='index.php'>Back to query page</a>.");
-    mtrace("</pre>");
+    mtrace("<pre>The data directory ($index_path) contains $index_filecount files, and\n"
+          ."there are $db_count records in the <em>search_documents</em> table.\n"
+          ."\n"
+          ."This indicates that you have already succesfully indexed this site, or at least\n"
+          ."started and cancelled an indexing session. Follow the link if you are sure that\n"
+          ."you want to continue indexing - this will replace any existing index data (no\n"
+          ."Moodle data is affected).\n"
+          ."\n"          
+          ."<a href='indexer.php?areyousure=yes'>Continue indexing</a> or <a href='index.php'>Back to query page</a>."
+          ."</pre>");
   } else {
     header('Location: indexer.php?areyousure=yes');
   } //else    
index 081d9ef..f6c17a8 100644 (file)
   function search_shorten_url($url, $length=30) {    
     return substr($url, 0, $length)."...";
   } //search_shorten_url
+  
+  function search_escape_string($str) {
+    global $CFG;
+     
+    switch ($CFG->dbtype) {
+      case 'mysql':
+        $s = mysql_real_escape_string($str);
+        break;
+      case 'postgres7':
+        $s = pg_escape_string($str);
+        break;
+      default:
+        $s = addslashes($str);
+    } //switch
+    
+    return $s;
+  } //search_escape_string
 
   //get a real php 5 version number, using 5.0.0 arbitrarily  
   function search_check_php5($feedback=false) {
index 59169b5..5a65273 100644 (file)
@@ -41,6 +41,7 @@
   print_heading($strquery);
   
   print_simple_box_start('center', '', '', 20);
+  
 ?>
 
 <form name="query" method="get" action="query.php">
index dbe59c7..37ac6f5 100644 (file)
@@ -1,4 +1,8 @@
 <?php
+  /* Prints some basic statistics about the current index.
+   * Allows the administrator to create an index if none exists.
+   * */
+  
   require_once('../config.php');  
   require_once("$CFG->dirroot/search/lib.php");  
 
     $index_dir  = get_directory_list($index_path, '', false, false);
     $index_filecount = count($index_dir);
     
-    //indexed documents stats
-    $tables = $db->MetaTables();
+    //indexed documents stats (via db)
+    $db_exists = false;
+    $admin_tables = $db->MetaTables();
     
-    if (in_array($CFG->prefix.'search_documents', $tables)) {
+    if (in_array($CFG->prefix.'search_documents', $admin_tables)) {
+      $db_exists = true;
       $types = search_get_document_types();
       sort($types);
     
   
   print_simple_box_start('center', '', '', 20);
   
+  //this table is only for admins, shows index directory size and location
+  if (isadmin()) {
+    $admin_table->tablealign = "center";
+    $admin_table->align = array ("right", "left");
+    $admin_table->wrap = array ("nowrap", "nowrap");
+    $admin_table->cellpadding = 5;
+    $admin_table->cellspacing = 0;
+    $admin_table->width = '500';
+  
+    $admin_table->data[] = array('<strong>Data directory</strong>', '<em><strong>'.$index_path.'</strong></em>');
+    $admin_table->data[] = array('Files in index directory', $index_filecount);
+    $admin_table->data[] = array('Total size', $index_size);
+    
+    if ($index_filecount == 0 or !$db_exists) {
+      $admin_table->data[] = array('Click to create index', "<a href='indexersplash.php'>Indexer</a>");
+    } //if
+  } //if
+  
+  //this is the standard summary table for normal users, shows document counts
   $table->tablealign = "center";
   $table->align = array ("right", "left");
   $table->wrap = array ("nowrap", "nowrap");
   $table->cellpadding = 5;
   $table->cellspacing = 0;
   $table->width = '500';
-
-  $table->data[] = array('<strong>Data directory</strong>', '<em><strong>'.$index_path.'</strong></em>');
-  $table->data[] = array('Files in index directory', $index_filecount);
-  $table->data[] = array('Total size', $index_size);
-  
-  if ($index_filecount == 0) {
-    $table->data[] = array('Click to create index', "<a href='indexersplash.php'>Indexer</a>");
-  } //if
-  
-  $return_of_table->tablealign = "center";
-  $return_of_table->align = array ("right", "left");
-  $return_of_table->wrap = array ("nowrap", "nowrap");
-  $return_of_table->cellpadding = 5;
-  $return_of_table->cellspacing = 0;
-  $return_of_table->width = '500';
   
-  $return_of_table->data[] = array('<strong>Database</strong>', '<em><strong>search_documents<strong></em>');  
+  $table->data[] = array('<strong>Database</strong>', '<em><strong>search_documents<strong></em>');  
   foreach($type_counts as $key => $value) {
-    $return_of_table->data[] = array($key, $value);
+    $table->data[] = array($key, $value);
   } //foreach    
 
   if (isadmin()) {
-    print_table($table);
+    print_table($admin_table);
     print_spacer(20);
   } //if
   
-  print_table($return_of_table);
+  print_table($table);
    
   print_simple_box_end();
   print_simple_box_end();