From 5851da47f11d0b06c6415e22b080341d643aef14 Mon Sep 17 00:00:00 2001 From: Jakob Sack Date: Fri, 22 Jul 2011 16:21:29 +0200 Subject: [PATCH] properties nearly work --- lib/Connector/Sabre/locks.php | 17 ++++++++ lib/Connector/Sabre/node.php | 77 ++++++++++++++++++++++++++++++++++- 2 files changed, 93 insertions(+), 1 deletion(-) diff --git a/lib/Connector/Sabre/locks.php b/lib/Connector/Sabre/locks.php index 58a0359899..ed5ea17bea 100644 --- a/lib/Connector/Sabre/locks.php +++ b/lib/Connector/Sabre/locks.php @@ -13,6 +13,23 @@ require_once("lib/base.php"); * @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, + * `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 { /** diff --git a/lib/Connector/Sabre/node.php b/lib/Connector/Sabre/node.php index fb607a709e..0e8bae75fd 100644 --- a/lib/Connector/Sabre/node.php +++ b/lib/Connector/Sabre/node.php @@ -13,7 +13,20 @@ require_once("lib/base.php"); * @author Evert Pot (http://www.rooftopsolutions.nl/) * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License */ -abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode { +/* + * + * The following SQL statement is just a help for developers and will not be + * executed! + * + * CREATE TABLE IF NOT EXISTS `properties` ( + * `userid` varchar(200) COLLATE utf8_unicode_ci NOT NULL, + * `propertypath` varchar(255) COLLATE utf8_unicode_ci NOT NULL, + * `propertyname` varchar(255) COLLATE utf8_unicode_ci NOT NULL, + * `propertyvalue` text COLLATE utf8_unicode_ci NOT NULL + * ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + * + */ +abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IProperties { /** * The path to the current node @@ -77,5 +90,67 @@ abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode { } + /** + * Updates properties on this node, + * + * @param array $mutations + * @see Sabre_DAV_IProperties::updateProperties + * @return bool|array + */ + public function updateProperties($properties) { + $existing = $this->getProperties(array()); + foreach($properties as $propertyName => $propertyValue) { + // If it was null, we need to delete the property + if (is_null($propertyValue)) { + if(array_key_exists( $propertyName, $existing )){ + $query = OC_DB::prepare( 'DELETE FROM *PREFIX*properties WHERE userid = ? AND propertypath = ? AND propertyname = ?' ); + $query->execute( array( 'OC_USER::getUser()', $this->path, $propertyName )); + } + } + else { + if(!array_key_exists( $propertyName, $existing )){ + $query = OC_DB::prepare( 'INSERT INTO *PREFIX*properties (userid,propertypath,propertyname,propertyvalue) VALUES(?,?,?,?)' ); + $query->execute( array( 'OC_USER::getUser()', $this->path, $propertyName,$propertyValue )); + } + elseif($existing[$propertyName] !== $propertyValue){ + $query = OC_DB::prepare( 'UPDATE *PREFIX*properties SET propertyvalue = ? WHERE userid = ? AND propertypath = ? AND propertyname = ?' ); + $query->execute( array( $propertyValue,'OC_USER::getUser()', $this->path, $propertyName )); + } + } + + } + return true; + } + + /** + * Returns a list of properties for this nodes.; + * + * The properties list is a list of propertynames the client requested, encoded as xmlnamespace#tagName, for example: http://www.example.org/namespace#author + * If the array is empty, all properties should be returned + * + * @param array $properties + * @return void + */ + function getProperties($properties) { + // At least some magic in here :-) + $query = OC_DB::prepare( 'SELECT * FROM *PREFIX*properties WHERE userid = ? AND propertypath = ?' ); + $result = $query->execute( array( 'OC_USER::getUser()', $this->path )); + + $existing = array(); + while( $row = $result->fetchRow()){ + $existing[$row['propertyname']] = $row['propertyvalue']; + } + + if(count($properties) == 0){ + return $existing; + } + + // if the array was empty, we need to return everything + $props = array(); + foreach($properties as $property) { + if (isset($existing[$property])) $props[$property] = $existing[$property]; + } + return $props; + } }