diff options
author | Jakob Sack <kde@jakobsack.de> | 2011-04-16 17:50:18 +0200 |
---|---|---|
committer | Jakob Sack <kde@jakobsack.de> | 2011-04-16 17:50:18 +0200 |
commit | 5d23b60c8a93f56dbbde280934f9b39a70a8a521 (patch) | |
tree | 9c3713fff4a0b8fc8d82df31ba82be6ca394800b /lib | |
parent | af1e48df80680dfa2b6e1367752a41aee750c308 (diff) | |
parent | 6c51974174f8a78045216567474c380525f77ce9 (diff) | |
download | nextcloud-server-5d23b60c8a93f56dbbde280934f9b39a70a8a521.tar.gz nextcloud-server-5d23b60c8a93f56dbbde280934f9b39a70a8a521.zip |
Merge branch 'refactoring' of git://anongit.kde.org/owncloud into refactoring
Diffstat (limited to 'lib')
-rw-r--r-- | lib/base.php | 36 | ||||
-rw-r--r-- | lib/files.php | 1 | ||||
-rw-r--r-- | lib/filestorage.php | 70 |
3 files changed, 93 insertions, 14 deletions
diff --git a/lib/base.php b/lib/base.php index 6b3ca59e6be..31d4142900f 100644 --- a/lib/base.php +++ b/lib/base.php @@ -89,13 +89,17 @@ require_once('connect.php'); require_once('remotestorage.php'); require_once('plugin.php'); -OC_PLUGIN::loadPlugins( "" ); +$error=(count(OC_UTIL::checkServer())>0); + +if(!$error){ + OC_PLUGIN::loadPlugins( "" ); +} OC_USER::setBackend( OC_CONFIG::getValue( "userbackend", "database" )); OC_GROUP::setBackend( OC_CONFIG::getValue( "groupbackend", "database" )); // Set up file system unless forbidden -if( !$RUNTIME_NOSETUPFS ){ +if(!$error and !$RUNTIME_NOSETUPFS ){ OC_UTIL::setupFS(); } @@ -108,12 +112,10 @@ OC_UTIL::addStyle( "jquery-ui-1.8.10.custom" ); OC_UTIL::addStyle( "styles" ); // Load Apps -if( !$RUNTIME_NOAPPS ){ +if(!$error and !$RUNTIME_NOAPPS ){ OC_APP::loadApps(); } -// check if the server is correctly configured for ownCloud -OC_UTIL::checkserver(); /** * Class for utility functions * @@ -221,7 +223,7 @@ class OC_UTIL { /** * check if the current server configuration is suitable for ownCloud - * + * @return array with error messages */ public static function checkServer(){ global $SERVERROOT; @@ -230,12 +232,16 @@ class OC_UTIL { $CONFIG_DATADIRECTORY_ROOT = OC_CONFIG::getValue( "datadirectory", "$SERVERROOT/data" );; $CONFIG_BACKUPDIRECTORY = OC_CONFIG::getValue( "backupdirectory", "$SERVERROOT/backup" ); $CONFIG_INSTALLED = OC_CONFIG::getValue( "installed", false ); - $error=''; + $errors=array(); + + //check for database drivers if(!is_callable('sqlite_open') and !is_callable('mysql_connect')){ - $error.='No database drivers (sqlite or mysql) installed.<br/>'; + $errors[]='No database drivers (sqlite or mysql) installed.<br/>'; } $CONFIG_DBTYPE = OC_CONFIG::getValue( "dbtype", "sqlite" ); $CONFIG_DBNAME = OC_CONFIG::getValue( "dbname", "owncloud" ); + + //check for correct file permissions if(!stristr(PHP_OS, 'WIN')){ if($CONFIG_DBTYPE=='sqlite'){ $file=$SERVERROOT.'/'.$CONFIG_DBNAME; @@ -246,7 +252,7 @@ class OC_UTIL { clearstatcache(); $prems=substr(decoct(fileperms($file)),-3); if(substr($prems,2,1)!='0'){ - $error.='SQLite database file ('.$file.') is readable from the web<br/>'; + $errors[]='SQLite database file ('.$file.') is readable from the web<br/>'; } } } @@ -257,7 +263,7 @@ class OC_UTIL { clearstatcache(); $prems=substr(decoct(fileperms($CONFIG_DATADIRECTORY_ROOT)),-3); if(substr($prems,2,1)!='0'){ - $error.='Data directory ('.$CONFIG_DATADIRECTORY_ROOT.') is readable from the web<br/>'; + $errors[]='Data directory ('.$CONFIG_DATADIRECTORY_ROOT.') is readable from the web<br/>'; } } if( OC_CONFIG::getValue( "enablebackup", false )){ @@ -267,16 +273,20 @@ class OC_UTIL { clearstatcache(); $prems=substr(decoct(fileperms($CONFIG_BACKUPDIRECTORY)),-3); if(substr($prems,2,1)!='0'){ - $error.='Data directory ('.$CONFIG_BACKUPDIRECTORY.') is readable from the web<br/>'; + $errors[]='Data directory ('.$CONFIG_BACKUPDIRECTORY.') is readable from the web<br/>'; } } } }else{ //TODO: premisions checks for windows hosts } - if($error){ - die($error); + if(!is_writable($CONFIG_DATADIRECTORY_ROOT)){ + $errors[]='Data directory ('.$CONFIG_BACKUPDIRECTORY.') not writable by ownCloud<br/>'; } + + //TODO: check for php modules + + return $errors; } } diff --git a/lib/files.php b/lib/files.php index a1f983b6b2f..642a7e72049 100644 --- a/lib/files.php +++ b/lib/files.php @@ -64,6 +64,7 @@ class OC_FILES { $file['directory']=$directory; $stat=OC_FILESYSTEM::stat($directory.'/'.$filename); $file=array_merge($file,$stat); + $file['size']=OC_FILESYSTEM::filesize($directory.'/'.$filename); $file['mime']=OC_FILES::getMimeType($directory .'/'. $filename); $file['readable']=OC_FILESYSTEM::is_readable($directory .'/'. $filename); $file['writeable']=OC_FILESYSTEM::is_writeable($directory .'/'. $filename); diff --git a/lib/filestorage.php b/lib/filestorage.php index 68f232d3a60..e7fb9e9d270 100644 --- a/lib/filestorage.php +++ b/lib/filestorage.php @@ -124,7 +124,11 @@ class OC_FILESTORAGE_LOCAL extends OC_FILESTORAGE{ return $filetype; } public function filesize($path){ - return filesize($this->datadir.$path); + if($this->is_dir($path)){ + return $this->getFolderSize($path); + }else{ + return filesize($this->datadir.$path); + } } public function is_readable($path){ return is_readable($this->datadir.$path); @@ -159,6 +163,7 @@ class OC_FILESTORAGE_LOCAL extends OC_FILESTORAGE{ public function file_put_contents($path,$data){ if($return=file_put_contents($this->datadir.$path,$data)){ $this->notifyObservers($path,OC_FILEACTION_WRITE); + $this->clearFolderSizeCache($path); } } public function unlink($path){ @@ -197,11 +202,13 @@ class OC_FILESTORAGE_LOCAL extends OC_FILESTORAGE{ case 'x+': case 'a+': $this->notifyObservers($path,OC_FILEACTION_READ | OC_FILEACTION_WRITE); + $this->clearFolderSizeCache($path); break; case 'w': case 'x': case 'a': $this->notifyObservers($path,OC_FILEACTION_WRITE); + $this->clearFolderSizeCache($path); break; } } @@ -440,5 +447,66 @@ class OC_FILESTORAGE_LOCAL extends OC_FILESTORAGE{ } return $return; } + + /** + * @brief get the size of folder and it's content + * @param string $path file path + * @return int size of folder and it's content + */ + public function getFolderSize($path){ + $query=OC_DB::prepare("SELECT size FROM *PREFIX*foldersize WHERE path=?"); + $size=$query->execute(array($path))->fetchAll(); + if(count($size)>0){// we already the size, just return it + return $size[0]['size']; + }else{//the size of the folder isn't know, calulate it + return $this->calculateFolderSize($path); + } + } + + /** + * @brief calulate the size of folder and it's content and cache it + * @param string $path file path + * @return int size of folder and it's content + */ + public function calculateFolderSize($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)); + }else{// no insert it + $query=OC_DB::prepare("INSERT INTO *PREFIX*foldersize VALUES(?,?)"); + $result=$query->execute(array($path,$size)); + } + } + return $size; + } + + /** + * @brief clear the folder size cache of folders containing a file + * @param string $path + */ + public function clearFolderSizeCache($path){ + $path=dirname($path); + $query=OC_DB::prepare("DELETE FROM *PREFIX*foldersize WHERE path = ?"); + $result=$query->execute(array($path)); + if($path!='/'){ + $parts=explode('/'); + array_pop($parts); + $parent=implode('/',$parts); + } + } } ?>
\ No newline at end of file |