Optimize WebDav access using OC_FileCache

This commit is contained in:
Bart Visscher 2012-06-15 16:04:01 +02:00
parent 8f6121ffa8
commit 400769ab40
3 changed files with 31 additions and 23 deletions

View File

@ -59,19 +59,22 @@ class OC_Connector_Sabre_Directory extends OC_Connector_Sabre_Node implements Sa
* @throws Sabre_DAV_Exception_FileNotFound * @throws Sabre_DAV_Exception_FileNotFound
* @return Sabre_DAV_INode * @return Sabre_DAV_INode
*/ */
public function getChild($name) { public function getChild($name, $info = null) {
$path = $this->path . '/' . $name; $path = $this->path . '/' . $name;
if (is_null($info)) {
$info = OC_FileCache::get($path);
}
if (!OC_Filesystem::file_exists($path)) throw new Sabre_DAV_Exception_NotFound('File with name ' . $path . ' could not be located'); if (!$info) throw new Sabre_DAV_Exception_NotFound('File with name ' . $path . ' could not be located');
if (OC_Filesystem::is_dir($path)) { if ($info['mimetype'] == 'httpd/unix-directory') {
return new OC_Connector_Sabre_Directory($path); return new OC_Connector_Sabre_Directory($path, $info);
} else { } else {
return new OC_Connector_Sabre_File($path); return new OC_Connector_Sabre_File($path, $info);
} }
@ -85,17 +88,11 @@ class OC_Connector_Sabre_Directory extends OC_Connector_Sabre_Node implements Sa
public function getChildren() { public function getChildren() {
$nodes = array(); $nodes = array();
// foreach(scandir($this->path) as $node) if($node!='.' && $node!='..') $nodes[] = $this->getChild($node); $folder_content = OC_FileCache::getFolderContent($this->path);
if( OC_Filesystem::is_dir($this->path . '/')){ foreach($folder_content as $info) {
$dh = OC_Filesystem::opendir($this->path . '/'); $nodes[] = $this->getChild($info['name'], $info);
while(( $node = readdir($dh)) !== false ){
if($node!='.' && $node!='..'){
$nodes[] = $this->getChild($node);
}
}
} }
return $nodes; return $nodes;
} }
/** /**

View File

@ -63,8 +63,8 @@ class OC_Connector_Sabre_File extends OC_Connector_Sabre_Node implements Sabre_D
* @return int * @return int
*/ */
public function getSize() { public function getSize() {
$this->stat(); $this->getFileinfoCache();
return $this->stat_cache['size']; return $this->fileinfo_cache['size'];
} }
@ -92,6 +92,9 @@ class OC_Connector_Sabre_File extends OC_Connector_Sabre_Node implements Sabre_D
* @return mixed * @return mixed
*/ */
public function getContentType() { public function getContentType() {
if (isset($this->fileinfo_cache['mimetype'])) {
return $this->fileinfo_cache['mimetype'];
}
return OC_Filesystem::getMimeType($this->path); return OC_Filesystem::getMimeType($this->path);

View File

@ -33,7 +33,7 @@ abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IPr
* file stat cache * file stat cache
* @var array * @var array
*/ */
protected $stat_cache; protected $fileinfo_cache;
/** /**
* Sets up the node, expects a full path name * Sets up the node, expects a full path name
@ -41,8 +41,11 @@ abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IPr
* @param string $path * @param string $path
* @return void * @return void
*/ */
public function __construct($path) { public function __construct($path, $fileinfo_cache = null) {
$this->path = $path; $this->path = $path;
if ($fileinfo_cache) {
$this->fileinfo_cache = $fileinfo_cache;
}
} }
@ -85,9 +88,14 @@ abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IPr
/** /**
* Set the stat cache * Set the stat cache
*/ */
protected function stat() { protected function getFileinfoCache() {
if (!isset($this->stat_cache)) { if (!isset($this->fileinfo_cache)) {
$this->stat_cache = OC_Filesystem::stat($this->path); if ($fileinfo_cache = OC_FileCache::get($this->path)) {
} else {
$fileinfo_cache = OC_Filesystem::stat($this->path);
}
$this->fileinfo_cache = $fileinfo_cache;
} }
} }
@ -97,8 +105,8 @@ abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IPr
* @return int * @return int
*/ */
public function getLastModified() { public function getLastModified() {
$this->stat(); $this->getFileinfoCache();
return $this->stat_cache['mtime']; return $this->fileinfo_cache['mtime'];
} }