]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix the privatedata key value store
authorFrank Karlitschek <frank@owncloud.org>
Wed, 30 Oct 2013 18:36:29 +0000 (19:36 +0100)
committertomneedham <tom@owncloud.com>
Tue, 18 Feb 2014 17:19:13 +0000 (17:19 +0000)
db_structure.xml
lib/ocs.php
lib/ocs/privatedata.php

index 5c2b69aa8ea3a5d8cabddb010088f499f323e6ca..d9b21cd3ec6cdb13d3bf93257bf2bfb2cbb514db 100644 (file)
 
        </table>
 
+       <table>
+
+               <name>*dbprefix*privatedata</name>
+
+               <declaration>
+
+               <field>
+                       <name>keyid</name>
+                       <type>integer</type>
+                       <default>0</default>
+                       <notnull>true</notnull>
+                       <unsigned>true</unsigned>
+                       <length>4</length>
+                       <autoincrement>1</autoincrement>
+               </field>
+
+               <field>
+                       <name>user</name>
+                       <type>text</type>
+                       <default></default>
+                       <notnull>true</notnull>
+                       <length>255</length>
+               </field>
+
+               <field>
+                       <name>app</name>
+                       <type>text</type>
+                       <default></default>
+                       <notnull>true</notnull>
+                       <length>255</length>
+               </field>
+
+               <field>
+                       <name>key</name>
+                       <type>text</type>
+                       <default></default>
+                       <notnull>true</notnull>
+                       <length>255</length>
+               </field>
+
+               <field>
+                       <name>value</name>
+                       <type>text</type>
+                       <default></default>
+                       <notnull>true</notnull>
+                       <length>255</length>
+               </field>
+
+               <index>
+                       <primary>true</primary>
+                       <unique>true</unique>
+                       <name>keyid_index</name>
+                       <field>
+                               <name>keyid</name>
+                               <sorting>ascending</sorting>
+                       </field>
+               </index>
+
+               </declaration>
+
+       </table>
+
+
 </database>
index 93e8931ce2eabe9603610d83624f500c05bcb54a..e067196cf11132667ff58188483de0d7c8211765 100644 (file)
@@ -228,36 +228,4 @@ class OC_OCS {
                        }
                }
        }
-
-       /**
-       * get private data
-       * @param string $user
-       * @param string $app
-       * @param string $key
-       * @param bool $like use LIKE instead of = when comparing keys
-       * @return array
-       */
-       public static function getData($user, $app="", $key="") {
-               if($app) {
-                       $apps=array($app);
-               }else{
-                       $apps=OC_Preferences::getApps($user);
-               }
-               if($key) {
-                       $keys=array($key);
-               }else{
-                       foreach($apps as $app) {
-                               $keys=OC_Preferences::getKeys($user, $app);
-                       }
-               }
-               $result=array();
-               foreach($apps as $app) {
-                       foreach($keys as $key) {
-                               $value=OC_Preferences::getValue($user, $app, $key);
-                               $result[]=array('app'=>$app, 'key'=>$key, 'value'=>$value);
-                       }
-               }
-               return $result;
-       }
-
 }
index 4dfd0a6e66e3482edc454319471f644426a41b5b..b489cd0fbb3945e8c115f83a49d6103c978bf654 100644 (file)
 *
 */
 
+
 class OC_OCS_Privatedata {
 
+       /**
+       * read keys
+       * test: curl http://login:passwd@oc/core/ocs/v1.php/privatedata/getattribute/testy/123
+       * test: curl http://login:passwd@oc/core/ocs/v1.php/privatedata/getattribute/testy
+       * @param array $parameters The OCS parameter
+       */
        public static function get($parameters) {
                OC_Util::checkLoggedIn();
                $user = OC_User::getUser();
                $app = addslashes(strip_tags($parameters['app']));
                $key = addslashes(strip_tags($parameters['key']));
-               $result = OC_OCS::getData($user, $app, $key);
+               
+               if(empty($key)) {
+                       $query = \OCP\DB::prepare('SELECT `key`, `app`, `value`  FROM `*PREFIX*privatedata` WHERE `user` = ? AND `app` = ? ');
+                       $result = $query->execute(array($user, $app));
+               } else {
+                       $query = \OCP\DB::prepare('SELECT `key`, `app`, `value`  FROM `*PREFIX*privatedata` WHERE `user` = ? AND `app` = ? AND `key` = ? ');
+                       $result = $query->execute(array($user, $app, $key));
+               }
+               
                $xml = array();
-               foreach($result as $i=>$log) {
-                       $xml[$i]['key']=$log['key'];
-                       $xml[$i]['app']=$log['app'];
-                       $xml[$i]['value']=$log['value'];
+               while ($row = $result->fetchRow()) {
+                       $data=array();
+                       $data['key']=$row['key'];
+                       $data['app']=$row['app'];
+                       $data['value']=$row['value'];
+                       $xml[] = $data;
                }
+
                return new OC_OCS_Result($xml);
-               //TODO: replace 'privatedata' with 'attribute' once a new libattice has been released that works with it
        }
 
+       /**
+       * set a key
+       * test: curl http://login:passwd@oc/core/ocs/v1.php/privatedata/setattribute/testy/123  --data "value=foobar"
+       * @param array $parameters The OCS parameter
+       */
        public static function set($parameters) {
                OC_Util::checkLoggedIn();
                $user = OC_User::getUser();
                $app = addslashes(strip_tags($parameters['app']));
                $key = addslashes(strip_tags($parameters['key']));
                $value = OC_OCS::readData('post', 'value', 'text');
-               if(OC_Preferences::setValue($user, $app, $key, $value)) {
-                       return new OC_OCS_Result(null, 100);
+
+               // check if key is already set
+               $query = \OCP\DB::prepare('SELECT `value`  FROM `*PREFIX*privatedata` WHERE `user` = ? AND `app` = ? AND `key` = ? ');
+               $result = $query->execute(array($user, $app, $key));
+                
+        if ($result->numRows()==0) {
+                       // store in DB
+                       $query = \OCP\DB::prepare('INSERT INTO `*PREFIX*privatedata` (`user`, `app`, `key`, `value`)' . ' VALUES(?, ?, ?, ?)');
+                       $query->execute(array($user, $app, $key, $value));
+               } else {
+                       // update in DB
+                       $query = \OCP\DB::prepare('UPDATE `*PREFIX*privatedata` SET `value` = ?  WHERE `user` = ? AND `app` = ? AND `key` = ? ');
+                       $query->execute(array($value, $user, $app, $key ));
                }
+
+               return new OC_OCS_Result(null, 100);
        }
 
+       /**
+       * delete a key
+       * test: curl http://login:passwd@oc/core/ocs/v1.php/privatedata/deleteattribute/testy/123 --data "post=1"
+       * @param array $parameters The OCS parameter
+       */
        public static function delete($parameters) {
                OC_Util::checkLoggedIn();
                $user = OC_User::getUser();
@@ -59,8 +99,12 @@ class OC_OCS_Privatedata {
                if($key==="" or $app==="") {
                        return new OC_OCS_Result(null, 101); //key and app are NOT optional here
                }
-               if(OC_Preferences::deleteKey($user, $app, $key)) {
-                       return new OC_OCS_Result(null, 100);
-               }
+               
+               // delete in DB
+               $query = \OCP\DB::prepare('DELETE FROM `*PREFIX*privatedata`  WHERE `user` = ? AND `app` = ? AND `key` = ? ');
+               $query->execute(array($user, $app, $key ));
+
+               return new OC_OCS_Result(null, 100);
        }
 }
+