Initial commit
[moodle.git] / search / Zend / Search / Lucene / Storage / Directory / Filesystem.php
1 <?php
2 /**
3  * Zend Framework
4  *
5  * LICENSE
6  *
7  * This source file is subject to the new BSD license that is bundled
8  * with this package in the file LICENSE.txt.
9  * It is also available through the world-wide-web at this URL:
10  * http://framework.zend.com/license/new-bsd
11  * If you did not receive a copy of the license and are unable to
12  * obtain it through the world-wide-web, please send an email
13  * to license@zend.com so we can send you a copy immediately.
14  *
15  * @category   Zend
16  * @package    Zend_Search_Lucene
17  * @subpackage Storage
18  * @copyright  Copyright (c) 2006 Zend Technologies USA Inc. (http://www.zend.com)
19  * @license    http://framework.zend.com/license/new-bsd     New BSD License
20  */
23 /** Zend_Search_Lucene_Storage_Directory */
24 require_once 'Zend/Search/Lucene/Storage/Directory.php';
26 /** Zend_Search_Lucene_Storage_File_Filesystem */
27 require_once 'Zend/Search/Lucene/Storage/File/Filesystem.php';
30 /**
31  * FileSystem implementation of Directory abstraction.
32  *
33  * @category   Zend
34  * @package    Zend_Search_Lucene
35  * @subpackage Storage
36  * @copyright  Copyright (c) 2006 Zend Technologies USA Inc. (http://www.zend.com)
37  * @license    http://framework.zend.com/license/new-bsd     New BSD License
38  */
39 class Zend_Search_Lucene_Storage_Directory_Filesystem extends Zend_Search_Lucene_Storage_Directory
40 {
41     /**
42      * Filesystem path to the directory
43      *
44      * @var string
45      */
46     private $_dirPath = null;
48     /**
49      * Cache for Zend_Search_Lucene_Storage_File_Filesystem objects
50      * Array: filename => Zend_Search_Lucene_Storage_File object
51      *
52      * @var array
53      * @throws Zend_Search_Lucene_Exception
54      */
55     private $_fileHandlers;
58     /**
59      * Utility function to recursive directory creation
60      *
61      * @param string $dir
62      * @param integer $mode
63      * @param boolean $recursive
64      * @return boolean
65      */
67     static public function mkdirs($dir, $mode = 0777, $recursive = true)
68     {
69         if (is_null($dir) || $dir === '') {
70             return false;
71         }
72         if (is_dir($dir) || $dir === '/') {
73             return true;
74         }
75         if (self::mkdirs(dirname($dir), $mode, $recursive)) {
76             return mkdir($dir, $mode);
77         }
78         return false;
79     }
82     /**
83      * Object constructor
84      * Checks if $path is a directory or tries to create it.
85      *
86      * @param string $path
87      * @throws Zend_Search_Lucene_Exception
88      */
89     public function __construct($path)
90     {
91         if (!is_dir($path)) {
92             if (file_exists($path)) {
93                 throw new Zend_Search_Lucene_Exception('Path exists, but it\'s not a directory');
94             } else {
95                 if (!self::mkdirs($path)) {
96                     throw new Zend_Search_Lucene_Exception("Can't create directory '$path'.");
97                 }
98             }
99         }
100         $this->_dirPath = $path;
101         $this->_fileHandlers = array();
102     }
105     /**
106      * Closes the store.
107      *
108      * @return void
109      */
110     public function close()
111     {
112         foreach ($this->_fileHandlers as $fileObject) {
113             $fileObject->close();
114         }
116         unset($this->_fileHandlers);
117     }
120     /**
121      * Returns an array of strings, one for each file in the directory.
122      *
123      * @return array
124      */
125     public function fileList()
126     {
127         $result = array();
129         $dirContent = opendir( $this->_dirPath );
130         while ($file = readdir($dirContent)) {
131             if (($file == '..')||($file == '.'))   continue;
133             $fullName = $this->_dirPath . '/' . $file;
135             if( !is_dir($this->_dirPath . '/' . $file) ) {
136                 $result[] = $file;
137             }
138         }
140         return $result;
141     }
143     /**
144      * Creates a new, empty file in the directory with the given $filename.
145      *
146      * @param string $filename
147      * @return Zend_Search_Lucene_Storage_File
148      */
149     public function createFile($filename)
150     {
151         if (isset($this->_fileHandlers[$filename])) {
152             $this->_fileHandlers[$filename]->close();
153         }
154         unset($this->_fileHandlers[$filename]);
155         $this->_fileHandlers[$filename] = new Zend_Search_Lucene_Storage_File_Filesystem($this->_dirPath . '/' . $filename, 'w+b');
156         return $this->_fileHandlers[$filename];
157     }
160     /**
161      * Removes an existing $filename in the directory.
162      *
163      * @param string $filename
164      * @return void
165      */
166     public function deleteFile($filename)
167     {
168         if (isset($this->_fileHandlers[$filename])) {
169             $this->_fileHandlers[$filename]->close();
170         }
171         unset($this->_fileHandlers[$filename]);
172         unlink($this->_dirPath .'/'. $filename);
173     }
176     /**
177      * Returns true if a file with the given $filename exists.
178      *
179      * @param string $filename
180      * @return boolean
181      */
182     public function fileExists($filename)
183     {
184         return isset($this->_fileHandlers[$filename]) ||
185                file_exists($this->_dirPath . '/' . $filename);
186     }
189     /**
190      * Returns the length of a $filename in the directory.
191      *
192      * @param string $filename
193      * @return integer
194      */
195     public function fileLength($filename)
196     {
197         if (isset( $this->_fileHandlers[$filename] )) {
198             return $this->_fileHandlers[$filename]->size();
199         }
200         return filesize($this->_dirPath .'/'. $filename);
201     }
204     /**
205      * Returns the UNIX timestamp $filename was last modified.
206      *
207      * @param string $filename
208      * @return integer
209      */
210     public function fileModified($filename)
211     {
212         return filemtime($this->_dirPath .'/'. $filename);
213     }
216     /**
217      * Renames an existing file in the directory.
218      *
219      * @param string $from
220      * @param string $to
221      * @return void
222      */
223     public function renameFile($from, $to)
224     {
225         if ($this->_fileHandlers[$from] !== null) {
226             $this->_fileHandlers[$from]->close();
227         }
228         unset($this->_fileHandlers[$from]);
230         if ($this->_fileHandlers[$to] !== null) {
231             $this->_fileHandlers[$to]->close();
232         }
233         unset($this->_fileHandlers[$to]);
235         if (file_exists($this->_dirPath . '/' . $to)) {
236             unlink($this->_dirPath . '/' . $to);
237         }
239         return @rename($this->_dirPath . '/' . $from, $this->_dirPath . '/' . $to);
240     }
243     /**
244      * Sets the modified time of $filename to now.
245      *
246      * @param string $filename
247      * @return void
248      */
249     public function touchFile($filename)
250     {
251         return touch($this->_dirPath .'/'. $filename);
252     }
255     /**
256      * Returns a Zend_Search_Lucene_Storage_File object for a given $filename in the directory.
257      *
258      * @param string $filename
259      * @return Zend_Search_Lucene_Storage_File
260      */
261     public function getFileObject($filename)
262     {
263         if (isset( $this->_fileHandlers[$filename] )) {
264             $this->_fileHandlers[$filename]->seek(0);
265             return $this->_fileHandlers[$filename];
266         }
268         $this->_fileHandlers[$filename] = new Zend_Search_Lucene_Storage_File_Filesystem($this->_dirPath . '/' . $filename);
269         return $this->_fileHandlers[$filename];
270     }