summaryrefslogtreecommitdiffstats
path: root/lib/connector/sabre/locks.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/connector/sabre/locks.php')
-rw-r--r--lib/connector/sabre/locks.php151
1 files changed, 151 insertions, 0 deletions
diff --git a/lib/connector/sabre/locks.php b/lib/connector/sabre/locks.php
new file mode 100644
index 00000000000..7164d9a09c1
--- /dev/null
+++ b/lib/connector/sabre/locks.php
@@ -0,0 +1,151 @@
+<?php
+/**
+ * The Lock manager allows you to handle all file-locks centrally.
+ *
+ * This Lock Manager stores all its data in a database. You must pass a PDO
+ * connection object in the constructor.
+ *
+ * @package Sabre
+ * @subpackage DAV
+ * @copyright Copyright (C) 2007-2011 Rooftop Solutions. All rights reserved.
+ * @author Evert Pot (http://www.rooftopsolutions.nl/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+/*
+ *
+ * The following SQL statement is just a help for developers and will not be
+ * executed!
+ *
+ * CREATE TABLE locks (
+ * `id` INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ * `userid` VARCHAR(200),
+ * `owner` VARCHAR(100),
+ * `timeout` INTEGER UNSIGNED,
+ * `created` INTEGER,
+ * `token` VARCHAR(100),
+ * `scope` TINYINT,
+ * `depth` TINYINT,
+ * `uri` text
+ * );
+ *
+ */
+class OC_Connector_Sabre_Locks extends Sabre_DAV_Locks_Backend_Abstract {
+
+ /**
+ * Returns a list of Sabre_DAV_Locks_LockInfo objects
+ *
+ * This method should return all the locks for a particular uri, including
+ * locks that might be set on a parent uri.
+ *
+ * If returnChildLocks is set to true, this method should also look for
+ * any locks in the subtree of the uri for locks.
+ *
+ * @param string $uri
+ * @param bool $returnChildLocks
+ * @return array
+ */
+ public function getLocks($uri, $returnChildLocks) {
+
+ // NOTE: the following 10 lines or so could be easily replaced by
+ // pure sql. MySQL's non-standard string concatination prevents us
+ // from doing this though.
+ $query = 'SELECT * FROM *PREFIX*locks WHERE userid = ? AND (created + timeout) > ? AND ((uri = ?)';
+ $params = array(OC_User::getUser(),time(),$uri);
+
+ // We need to check locks for every part in the uri.
+ $uriParts = explode('/',$uri);
+
+ // We already covered the last part of the uri
+ array_pop($uriParts);
+
+ $currentPath='';
+
+ foreach($uriParts as $part) {
+
+ if ($currentPath) $currentPath.='/';
+ $currentPath.=$part;
+
+ $query.=' OR (depth!=0 AND uri = ?)';
+ $params[] = $currentPath;
+
+ }
+
+ if ($returnChildLocks) {
+
+ $query.=' OR (uri LIKE ?)';
+ $params[] = $uri . '/%';
+
+ }
+ $query.=')';
+
+ $stmt = OC_DB::prepare($query);
+ $result = $stmt->execute($params);
+
+ $lockList = array();
+ while( $row = $result->fetchRow()){
+
+ $lockInfo = new Sabre_DAV_Locks_LockInfo();
+ $lockInfo->owner = $row['owner'];
+ $lockInfo->token = $row['token'];
+ $lockInfo->timeout = $row['timeout'];
+ $lockInfo->created = $row['created'];
+ $lockInfo->scope = $row['scope'];
+ $lockInfo->depth = $row['depth'];
+ $lockInfo->uri = $row['uri'];
+ $lockList[] = $lockInfo;
+
+ }
+
+ return $lockList;
+
+ }
+
+ /**
+ * Locks a uri
+ *
+ * @param string $uri
+ * @param Sabre_DAV_Locks_LockInfo $lockInfo
+ * @return bool
+ */
+ public function lock($uri,Sabre_DAV_Locks_LockInfo $lockInfo) {
+
+ // We're making the lock timeout 5 minutes
+ $lockInfo->timeout = 300;
+ $lockInfo->created = time();
+ $lockInfo->uri = $uri;
+
+ $locks = $this->getLocks($uri,false);
+ $exists = false;
+ foreach($locks as $k=>$lock) {
+ if ($lock->token == $lockInfo->token) $exists = true;
+ }
+
+ if ($exists) {
+ $query = OC_DB::prepare( 'UPDATE *PREFIX*locks SET owner = ?, timeout = ?, scope = ?, depth = ?, uri = ?, created = ? WHERE userid = ? AND token = ?' );
+ $result = $query->execute( array($lockInfo->owner,$lockInfo->timeout,$lockInfo->scope,$lockInfo->depth,$uri,$lockInfo->created,OC_User::getUser(),$lockInfo->token));
+ } else {
+ $query = OC_DB::prepare( 'INSERT INTO *PREFIX*locks (userid,owner,timeout,scope,depth,uri,created,token) VALUES (?,?,?,?,?,?,?,?)' );
+ $result = $query->execute( array(OC_User::getUser(),$lockInfo->owner,$lockInfo->timeout,$lockInfo->scope,$lockInfo->depth,$uri,$lockInfo->created,$lockInfo->token));
+ }
+
+ return true;
+
+ }
+
+ /**
+ * Removes a lock from a uri
+ *
+ * @param string $uri
+ * @param Sabre_DAV_Locks_LockInfo $lockInfo
+ * @return bool
+ */
+ public function unlock($uri,Sabre_DAV_Locks_LockInfo $lockInfo) {
+
+ $query = OC_DB::prepare( 'DELETE FROM *PREFIX*locks WHERE userid = ? AND uri=? AND token=?' );
+ $result = $query->execute( array(OC_User::getUser(),$uri,$lockInfo->token));
+
+ return $result->numRows() === 1;
+
+ }
+
+}