]> source.dussan.org Git - nextcloud-server.git/commitdiff
emulate touch with custom mtime for swift backend
authorRobin Appelman <icewind@owncloud.com>
Wed, 18 Apr 2012 22:25:47 +0000 (00:25 +0200)
committerRobin Appelman <icewind@owncloud.com>
Wed, 18 Apr 2012 22:25:47 +0000 (00:25 +0200)
apps/files_external/lib/swift.php

index ec09742c449974ade0a1d93fc5b59befd25c2b5d..e53eb1ff3b6fd1d92a9befaed1612f8b9222a1fd 100644 (file)
@@ -373,6 +373,7 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{
                        }
                        $obj=$container->create_object(basename($path));
                }
+               $this->resetMTime($obj);
                return $obj->write($content);
        }
 
@@ -429,30 +430,39 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{
        }
 
        public function touch($path,$mtime=null){
-               if(!is_null($mtime)){
-                       return false;
-               }
                $obj=$this->getObject($path);
                if(is_null($obj)){
                        return false;
                }
-               $fp = fopen('php://temp', 'r+');
-               $obj->stream($fp);
-               rewind($fp);
-               $obj->write($fp);
-               fclose($fp);
+               if(is_null($mtime)){
+                       $mtime=time();
+               }
+               
+               //emulate setting mtime with metadata
+               $obj->metadata['Mtime']=$mtime;
+               $obj->sync_metadata();
        }
 
        public function rename($path1,$path2){
                $sourceContainer=$this->getContainer(dirname($path1));
                $targetContainer=$this->getContainer(dirname($path2));
-               return $sourceContainer->move_object_to(basename($path1),$targetContainer,basename($path2));
+               $result=$sourceContainer->move_object_to(basename($path1),$targetContainer,basename($path2));
+               if($result){
+                       $targetObj=$this->getObject($path2);
+                       $this->resetMTime($targetObj);
+               }
+               return $result;
        }
 
        public function copy($path1,$path2){
                $sourceContainer=$this->getContainer(dirname($path1));
                $targetContainer=$this->getContainer(dirname($path2));
-               return $sourceContainer->copy_object_to(basename($path1),$targetContainer,basename($path2));
+               $result=$sourceContainer->copy_object_to(basename($path1),$targetContainer,basename($path2));
+               if($result){
+                       $targetObj=$this->getObject($path2);
+                       $this->resetMTime($targetObj);
+               }
+               return $result;
        }
 
        public function stat($path){
@@ -460,8 +470,14 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{
                if(is_null($obj)){
                        return false;
                }
+
+               if(isset($obj->metadata['Mtime']) and $obj->metadata['Mtime']>-1){
+                       $mtime=$obj->metadata['Mtime'];
+               }else{
+                       $mtime=strtotime($obj->last_modified);
+               }
                return array(
-                       'mtime'=>strtotime($obj->last_modified),
+                       'mtime'=>$mtime,
                        'size'=>$obj->content_length,
                        'ctime'=>-1,
                );
@@ -484,5 +500,17 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{
                        $obj=$this->createObject($path);
                }
                $obj->load_from_filename($tmpFile);
+               $this->resetMTime($obj);
+       }
+
+       /**
+        * remove custom mtime metadata
+        * @param CF_Object obj
+        */
+       private function resetMTime($obj){
+               if(isset($obj->metadata['Mtime'])){
+                       $obj->metadata['Mtime']=-1;
+                       $obj->sync_metadata();
+               }
        }
 }