MDL-14128, cannot use a full string in the param.
[moodle-linuxchix.git] / search / indexlib.php
blobbe250ca39e54613b7b529712881666686927f4e1
1 <?php
2 /**
3 * Global Search Engine for Moodle
5 * @package search
6 * @category core
7 * @subpackage search_engine
8 * @author Michael Champanis (mchampan) [cynnical@gmail.com], Valery Fremaux [valery.fremaux@club-internet.fr] > 1.8
9 * @date 2008/03/31
10 * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
12 * Index info class
14 * Used to retrieve information about an index.
15 * Has methods to check for valid database and data directory,
16 * and the index itself.
19 /**
20 * includes and requires
22 require_once("$CFG->dirroot/search/lib.php");
23 require_once("$CFG->dirroot/search/Zend/Search/Lucene.php");
25 /**
26 * main class for searchable information in the Lucene index
28 class IndexInfo {
30 private $path, //index data directory
31 $size, //size of directory (i.e. the whole index)
32 $filecount, //number of files
33 $indexcount, //number of docs in index
34 $dbcount, //number of docs in db
35 $types, //array of [document types => count]
36 $complete, //is index completely formed?
37 $time; //date index was generated
39 public function __construct($path = SEARCH_INDEX_PATH) {
40 global $CFG, $db;
42 $this->path = $path;
44 //test to see if there is a valid index on disk, at the specified path
45 try {
46 $test_index = new Zend_Search_Lucene($this->path, false);
47 $validindex = true;
48 } catch(Exception $e) {
49 $validindex = false;
52 //retrieve file system info about the index if it is valid
53 if ($validindex) {
54 $this->size = display_size(get_directory_size($this->path));
55 $index_dir = get_directory_list($this->path, '', false, false);
56 $this->filecount = count($index_dir);
57 $this->indexcount = $test_index->count();
59 else {
60 $this->size = 0;
61 $this->filecount = 0;
62 $this->indexcount = 0;
65 $db_exists = false; //for now
67 //get all the current tables in moodle
68 $admin_tables = $db->MetaTables();
70 //TODO: use new IndexDBControl class for database checks?
72 //check if our search table exists
73 if (in_array($CFG->prefix.SEARCH_DATABASE_TABLE, $admin_tables)) {
74 //retrieve database information if it does
75 $db_exists = true;
77 //total documents
78 $this->dbcount = count_records(SEARCH_DATABASE_TABLE);
80 //individual document types
81 $types = search_get_document_types();
82 sort($types);
84 foreach($types as $type) {
85 $c = count_records(SEARCH_DATABASE_TABLE, 'doctype', $type);
86 $this->types[$type] = (int)$c;
88 } else {
89 $this->dbcount = 0;
90 $this->types = array();
93 //check if the busy flag is set
94 if (isset($CFG->search_indexer_busy) && $CFG->search_indexer_busy == '1') {
95 $this->complete = false;
96 } else {
97 $this->complete = true;
100 //get the last run date for the indexer
101 if ($this->valid() && $CFG->search_indexer_run_date) {
102 $this->time = $CFG->search_indexer_run_date;
103 } else {
104 $this->time = 0;
109 * returns false on error, and the error message via referenced variable $err
110 * @param array $err array of errors
112 public function valid(&$err = null) {
113 $err = array();
114 $ret = true;
116 if (!$this->is_valid_dir()) {
117 $err['dir'] = get_string('invalidindexerror', 'search');
118 $ret = false;
121 if (!$this->is_valid_db()) {
122 $err['db'] = get_string('emptydatabaseerror', 'search');
123 $ret = false;
126 if (!$this->complete) {
127 $err['index'] = get_string('uncompleteindexingerror','search');
128 $ret = false;
131 return $ret;
135 * is the index dir valid
138 public function is_valid_dir() {
139 if ($this->filecount > 0) {
140 return true;
141 } else {
142 return false;
147 * is the db table valid
150 public function is_valid_db() {
151 if ($this->dbcount > 0) {
152 return true;
153 } else {
154 return false;
159 * shorthand get method for the class variables
160 * @param object $var
162 public function __get($var) {
163 if (in_array($var, array_keys(get_class_vars(get_class($this))))) {
164 return $this->$var;
171 * DB Index control class
173 * Used to control the search index database table
175 class IndexDBControl {
178 * does the table exist?
179 * @deprecated
180 * @uses CFG, db
182 public function checkTableExists() {
183 global $CFG, $db;
185 $table = SEARCH_DATABASE_TABLE;
186 $tables = $db->MetaTables();
187 if (in_array($CFG->prefix.$table, $tables)) {
188 return true;
190 else {
191 return false;
193 } //checkTableExists
196 * is our database setup valid?
197 * @uses db, CFG
198 * @deprecated Database is installed at install and should not be dropped out
200 public function checkDB() {
201 global $CFG, $db;
203 $sqlfile = "{$CFG->dirroot}/search/db/$CFG->dbtype.sql";
204 $ret = false;
205 if ($this->checkTableExists()) {
206 execute_sql('drop table '.$CFG->prefix.SEARCH_DATABASE_TABLE, false);
209 //turn output buffering on - to hide modify_database() output
210 ob_start();
211 $ret = modify_database($sqlfile, '', false);
213 //chuck the buffer and resume normal operation
214 ob_end_clean();
215 return $ret;
216 } //checkDB
219 * add a document record to the table
220 * @param document must be a Lucene SearchDocument instance
221 * @uses db, CFG
223 public function addDocument($document=null) {
224 global $db, $CFG;
226 if ($document == null) {
227 return false;
230 // object to insert into db
231 $doc->doctype = $document->doctype;
232 $doc->docid = $document->docid;
233 $doc->itemtype = $document->itemtype;
234 $doc->title = search_escape_string($document->title);
235 $doc->url = search_escape_string($document->url);
236 $doc->updated = time();
237 $doc->docdate = $document->date;
238 $doc->courseid = $document->course_id;
239 $doc->groupid = $document->group_id;
241 //insert summary into db
242 $id = insert_record(SEARCH_DATABASE_TABLE, $doc);
244 return $id;
248 * remove a document record from the index
249 * @param document must be a Lucene document instance, or at least a dbid enveloppe
250 * @uses db
252 public function delDocument($document) {
253 global $db;
255 delete_records(SEARCH_DATABASE_TABLE, 'id', $document->dbid);