From: Robin Appelman Date: Sun, 17 Apr 2011 11:47:22 +0000 (+0200) Subject: fix keeping track of foldersize X-Git-Tag: v3.0~267^2~558^2~87^2~1 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=e984a3b47a539e3df20870b312564f874ebe4d07;p=nextcloud-server.git fix keeping track of foldersize --- diff --git a/lib/filestorage.php b/lib/filestorage.php index fbd28a7dfb3..66b91fc19aa 100644 --- a/lib/filestorage.php +++ b/lib/filestorage.php @@ -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); } } }