summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoricewind1991 <icewind1991@gmail.com>2013-07-24 10:46:27 -0700
committericewind1991 <icewind1991@gmail.com>2013-07-24 10:46:27 -0700
commit198641624814ecfcbec3a373c2713544a328132f (patch)
treee8a67a9a92024ed7970cb6b712ecce9a9e0aa68c
parent9f01d00c65945a71cbaf09d128946fe8f451e468 (diff)
parentad266a42534eb84a778d1a3a1642db38a4c50325 (diff)
downloadnextcloud-server-198641624814ecfcbec3a373c2713544a328132f.tar.gz
nextcloud-server-198641624814ecfcbec3a373c2713544a328132f.zip
Merge pull request #3898 from owncloud/sabre-objecttree
WebDAV performance improvements
-rw-r--r--apps/files/appinfo/remote.php7
-rw-r--r--lib/connector/sabre/directory.php1
-rw-r--r--lib/connector/sabre/objecttree.php102
3 files changed, 106 insertions, 4 deletions
diff --git a/apps/files/appinfo/remote.php b/apps/files/appinfo/remote.php
index a1444141099..9b114ca2e37 100644
--- a/apps/files/appinfo/remote.php
+++ b/apps/files/appinfo/remote.php
@@ -23,7 +23,7 @@
*
*/
// load needed apps
-$RUNTIME_APPTYPES=array('filesystem', 'authentication', 'logging');
+$RUNTIME_APPTYPES = array('filesystem', 'authentication', 'logging');
OC_App::loadApps($RUNTIME_APPTYPES);
@@ -35,10 +35,11 @@ $lockBackend = new OC_Connector_Sabre_Locks();
$requestBackend = new OC_Connector_Sabre_Request();
// Create ownCloud Dir
-$publicDir = new OC_Connector_Sabre_Directory('');
+$rootDir = new OC_Connector_Sabre_Directory('');
+$objectTree = new \OC\Connector\Sabre\ObjectTree($rootDir);
// Fire up server
-$server = new Sabre_DAV_Server($publicDir);
+$server = new Sabre_DAV_Server($objectTree);
$server->httpRequest = $requestBackend;
$server->setBaseUri($baseuri);
diff --git a/lib/connector/sabre/directory.php b/lib/connector/sabre/directory.php
index 3d15a2a584d..ed8d085462d 100644
--- a/lib/connector/sabre/directory.php
+++ b/lib/connector/sabre/directory.php
@@ -222,7 +222,6 @@ class OC_Connector_Sabre_Directory extends OC_Connector_Sabre_Node implements Sa
throw new \Sabre_DAV_Exception_Forbidden();
}
if ($this->path != "/Shared") {
- foreach($this->getChildren() as $child) $child->delete();
\OC\Files\Filesystem::rmdir($this->path);
}
diff --git a/lib/connector/sabre/objecttree.php b/lib/connector/sabre/objecttree.php
new file mode 100644
index 00000000000..c4ddcbecbb8
--- /dev/null
+++ b/lib/connector/sabre/objecttree.php
@@ -0,0 +1,102 @@
+<?php
+/**
+ * Copyright (c) 2013 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OC\Connector\Sabre;
+
+use OC\Files\Filesystem;
+
+class ObjectTree extends \Sabre_DAV_ObjectTree {
+ /**
+ * Returns the INode object for the requested path
+ *
+ * @param string $path
+ * @throws \Sabre_DAV_Exception_NotFound
+ * @return \Sabre_DAV_INode
+ */
+ public function getNodeForPath($path) {
+
+ $path = trim($path, '/');
+ if (isset($this->cache[$path])) return $this->cache[$path];
+
+ // Is it the root node?
+ if (!strlen($path)) {
+ return $this->rootNode;
+ }
+
+ $info = Filesystem::getFileInfo($path);
+
+ if (!$info) {
+ throw new \Sabre_DAV_Exception_NotFound('File with name ' . $path . ' could not be located');
+ }
+
+ if ($info['mimetype'] === 'httpd/unix-directory') {
+ $node = new \OC_Connector_Sabre_Directory($path);
+ } else {
+ $node = new \OC_Connector_Sabre_File($path);
+ }
+
+ $node->setFileinfoCache($info);
+
+ $this->cache[$path] = $node;
+ return $node;
+
+ }
+
+ /**
+ * Moves a file from one location to another
+ *
+ * @param string $sourcePath The path to the file which should be moved
+ * @param string $destinationPath The full destination path, so not just the destination parent node
+ * @throws \Sabre_DAV_Exception_Forbidden
+ * @return int
+ */
+ public function move($sourcePath, $destinationPath) {
+
+ $sourceNode = $this->getNodeForPath($sourcePath);
+ if ($sourceNode instanceof \Sabre_DAV_ICollection and $this->nodeExists($destinationPath)) {
+ throw new \Sabre_DAV_Exception_Forbidden('Could not copy directory ' . $sourceNode . ', target exists');
+ }
+ list($sourceDir,) = \Sabre_DAV_URLUtil::splitPath($sourcePath);
+ list($destinationDir,) = \Sabre_DAV_URLUtil::splitPath($destinationPath);
+
+ Filesystem::rename($sourcePath, $destinationPath);
+
+ $this->markDirty($sourceDir);
+ $this->markDirty($destinationDir);
+
+ }
+
+ /**
+ * Copies a file or directory.
+ *
+ * This method must work recursively and delete the destination
+ * if it exists
+ *
+ * @param string $source
+ * @param string $destination
+ * @return void
+ */
+ public function copy($source, $destination) {
+
+ if (Filesystem::is_file($source)) {
+ Filesystem::copy($source, $destination);
+ } else {
+ Filesystem::mkdir($destination);
+ $dh = Filesystem::opendir($source);
+ while ($subnode = readdir($dh)) {
+
+ if ($subnode == '.' || $subnode == '..') continue;
+ $this->copy($source . '/' . $subnode, $destination . '/' . $subnode);
+
+ }
+ }
+
+ list($destinationDir,) = \Sabre_DAV_URLUtil::splitPath($destination);
+ $this->markDirty($destinationDir);
+ }
+}