aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJakob Sack <kde@jakobsack.de>2011-04-16 17:50:18 +0200
committerJakob Sack <kde@jakobsack.de>2011-04-16 17:50:18 +0200
commit5d23b60c8a93f56dbbde280934f9b39a70a8a521 (patch)
tree9c3713fff4a0b8fc8d82df31ba82be6ca394800b /lib
parentaf1e48df80680dfa2b6e1367752a41aee750c308 (diff)
parent6c51974174f8a78045216567474c380525f77ce9 (diff)
downloadnextcloud-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.php36
-rw-r--r--lib/files.php1
-rw-r--r--lib/filestorage.php70
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