]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix keeping track of foldersize
authorRobin Appelman <icewind1991@gmail.com>
Sun, 17 Apr 2011 11:47:22 +0000 (13:47 +0200)
committerRobin Appelman <icewind1991@gmail.com>
Sun, 17 Apr 2011 11:47:22 +0000 (13:47 +0200)
lib/filestorage.php

index fbd28a7dfb316f051d5a7106f9a1dfd58b9c4239..66b91fc19aa58eff7a494a9922d0cb3e32d6ec8c 100644 (file)
@@ -92,13 +92,14 @@ class OC_FILESTORAGE_LOCAL extends OC_FILESTORAGE{
        }
        public function mkdir($path){
                if($return=mkdir($this->datadir.$path)){
-                       $this->notifyObservers($path,OC_FILEACTION_CREATE);
+                       $this->clearFolderSizeCache($path);
                }
                return $return;
        }
        public function rmdir($path){
                if($return=rmdir($this->datadir.$path)){
                        $this->notifyObservers($path,OC_FILEACTION_DELETE);
+                       $this->clearFolderSizeCache($path);
                }
                return $return;
        }
@@ -170,6 +171,7 @@ class OC_FILESTORAGE_LOCAL extends OC_FILESTORAGE{
        public function unlink($path){
                if($return=unlink($this->datadir.$path)){
                        $this->notifyObservers($path,OC_FILEACTION_DELETE);
+                       $this->clearFolderSizeCache($path);
                }
                return $return;
        }
@@ -189,6 +191,7 @@ class OC_FILESTORAGE_LOCAL extends OC_FILESTORAGE{
                }
                if($return=copy($this->datadir.$path1,$this->datadir.$path2)){
                        $this->notifyObservers($path2,OC_FILEACTION_CREATE);
+                       $this->clearFolderSizeCache($path);
                }
                return $return;
        }
@@ -383,6 +386,7 @@ class OC_FILESTORAGE_LOCAL extends OC_FILESTORAGE{
                if(rename($tmpFile,$this->datadir.$path)){
                        touch($this->datadir.$path, $fileStats['mtime'], $fileStats['atime']);
                        $this->notifyObservers($path,OC_FILEACTION_CREATE);
+                       $this->clearFolderSizeCache($path);
                        return true;
                }else{
                        return false;
@@ -394,6 +398,7 @@ class OC_FILESTORAGE_LOCAL extends OC_FILESTORAGE{
                if(move_uploaded_file($tmpFile,$this->datadir.$path)){
                        touch($this->datadir.$path, $fileStats['mtime'], $fileStats['atime']);
                        $this->notifyObservers($path,OC_FILEACTION_CREATE);
+                       $this->clearFolderSizeCache($path);
                        return true;
                }else{
                        return false;
@@ -410,6 +415,7 @@ class OC_FILESTORAGE_LOCAL extends OC_FILESTORAGE{
                        if(is_file($dir.'/'.$item)){
                                if(unlink($dir.'/'.$item)){
                                        $this->notifyObservers($dir.'/'.$item,OC_FILEACTION_DELETE);
+                                       $this->clearFolderSizeCache($path);
                                }
                        }elseif(is_dir($dir.'/'.$item)){
                                if (!$this->delTree($dirRelative. "/" . $item)){
@@ -419,6 +425,7 @@ class OC_FILESTORAGE_LOCAL extends OC_FILESTORAGE{
                }
                if($return=rmdir($dir)){
                        $this->notifyObservers($dir,OC_FILEACTION_DELETE);
+                       $this->clearFolderSizeCache($path);
                }
                return $return;
        }
@@ -481,24 +488,33 @@ class OC_FILESTORAGE_LOCAL extends OC_FILESTORAGE{
         * @return int size of folder and it's content
         */
        public function calculateFolderSize($path){
+               if($this->is_file($path)){
+                       $path=dirname($path);
+               }
+               $path=str_replace('//','/',$path);
+               if($this->is_dir($path) and substr($path,-1)!='/'){
+                       $path.='/';
+               }
+               error_log("calc: $path");
                $size=0;
                if ($dh = $this->opendir($path)) {
-                       while (($filename = readdir($dh)) !== false) {
-                               if($filename!='.' and $filename!='..'){
-                                       $subFile=$path.'/'.$filename;
-                                       if($this->is_file($subFile)){
-                                               $size+=$this->filesize($subFile);
-                                       }else{
-                                               $size+=$this->calculateFolderSize($subFile);
-                                       }
-                               }
-                       }
                        $query=OC_DB::prepare("SELECT size FROM *PREFIX*foldersize WHERE path=?");
                        $hasSize=$query->execute(array($path))->fetchAll();
                        if(count($hasSize)>0){// yes, update it
                                $query=OC_DB::prepare("UPDATE *PREFIX*foldersize SET size=? WHERE path=?");
                                $result=$query->execute(array($size,$path));
+                               $size+=$hasSize[0]['size'];
                        }else{// no insert it
+                               while (($filename = readdir($dh)) !== false) {
+                                       if($filename!='.' and $filename!='..'){
+                                               $subFile=$path.'/'.$filename;
+                                               if($this->is_file($subFile)){
+                                                       $size+=$this->filesize($subFile);
+                                               }else{
+                                                       $size+=$this->calculateFolderSize($subFile);
+                                               }
+                                       }
+                               }
                                $query=OC_DB::prepare("INSERT INTO *PREFIX*foldersize VALUES(?,?)");
                                $result=$query->execute(array($path,$size));
                        }
@@ -511,13 +527,25 @@ class OC_FILESTORAGE_LOCAL extends OC_FILESTORAGE{
         * @param string $path
         */
        public function clearFolderSizeCache($path){
-               $path=dirname($path);
+               if($this->is_file($path)){
+                       $path=dirname($path);
+               }
+               $path=str_replace('//','/',$path);
+               if($this->is_dir($path) and substr($path,-1)!='/'){
+                       $path.='/';
+               }
+               error_log($path);
                $query=OC_DB::prepare("DELETE FROM *PREFIX*foldersize WHERE path = ?");
                $result=$query->execute(array($path));
-               if($path!='/'){
-                       $parts=explode('/');
-                       array_pop($parts);
+               if($path!='/' and $path!=''){
+                       $parts=explode('/',$path);
+                       //pop empty part
+                       $part=array_pop($parts);
+                       if(empty($part)){
+                               array_pop($parts);
+                       }
                        $parent=implode('/',$parts);
+                       $this->clearFolderSizeCache($parent);
                }
        }
 }