2011-07-22 16:38:42 +04:00
< ? php
require_once ( " lib/base.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
*/
2011-07-22 18:21:29 +04:00
/*
*
* 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 ,
* `owner` VARCHAR ( 100 ),
* `timeout` INTEGER UNSIGNED ,
* `created` INTEGER ,
* `token` VARCHAR ( 100 ),
* `scope` TINYINT ,
* `depth` TINYINT ,
* `uri` text
* );
*
*/
2011-07-22 16:38:42 +04:00
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 owner, token, timeout, created, scope, depth, uri FROM *PREFIX*locks WHERE ((created + timeout) > CAST(? AS UNSIGNED INTEGER)) AND ((uri = ?)' ;
$params = array ( 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 token = ?' );
$result = $query -> execute ( array ( $lockInfo -> owner , $lockInfo -> timeout , $lockInfo -> scope , $lockInfo -> depth , $uri , $lockInfo -> created , $lockInfo -> token ));
} else {
$query = OC_DB :: prepare ( 'INSERT INTO *PREFIX*locks (owner,timeout,scope,depth,uri,created,token) VALUES (?,?,?,?,?,?,?)' );
$result = $query -> execute ( array ( $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 path=? AND token=?' );
$result = $query -> execute ( array ( $uri , $lockInfo -> token ));
return $result -> numRows () === 1 ;
}
}