*/
public static function move2trash($file_path) {
$user = \OCP\User::getUser();
- $view = new \OC_FilesystemView('/'. $user);\r
- if (!$view->is_dir('files_trashbin')) {\r
- $view->mkdir('files_trashbin');\r
- $view->mkdir("versions_trashbin");\r
- }\r
- \r
- $path_parts = pathinfo($file_path);\r
- \r
- $deleted = $path_parts['basename'];\r
- $location = $path_parts['dirname'];\r
- $timestamp = time();\r
- $mime = $view->getMimeType('files'.$file_path);\r
- \r
- if ( $view->is_dir('files'.$file_path) ) {\r
- $type = 'dir';\r
- } else {\r
- $type = 'file';\r
+ $view = new \OC_FilesystemView('/'. $user);
+ if (!$view->is_dir('files_trashbin')) {
+ $view->mkdir('files_trashbin');
+ $view->mkdir("versions_trashbin");
+ }
+
+ $path_parts = pathinfo($file_path);
+
+ $deleted = $path_parts['basename'];
+ $location = $path_parts['dirname'];
+ $timestamp = time();
+ $mime = $view->getMimeType('files'.$file_path);
+
+ if ( $view->is_dir('files'.$file_path) ) {
+ $type = 'dir';
+ } else {
+ $type = 'file';
}
-
- if ( ($trashbinSize = \OCP\Config::getAppValue('files_trashbin', 'size')) === null ) {
+
+ $trashbinSize = self::getTrashbinSize($user);\r
- if ( $trashbinSize === false || $trashbinSize < 0 ) {\r
++ if ( $trashbinSize === false || $trashbinSize < 0 ) {
$trashbinSize = self::calculateSize(new \OC_FilesystemView('/'. $user.'/files_trashbin'));
- $trashbinSize += self::calculateSize(new \OC_FilesystemView('/'. $user.'/versions_trashbin'));\r
+ $trashbinSize += self::calculateSize(new \OC_FilesystemView('/'. $user.'/versions_trashbin'));
}
$trashbinSize += self::copy_recursive($file_path, 'files_trashbin/'.$deleted.'.d'.$timestamp, $view);
} else {
\OC_Log::write('files_trashbin', 'Couldn\'t move '.$file_path.' to the trash bin', \OC_log::ERROR);
}
-
- // get available disk space for user
- $quota = \OCP\Util::computerFileSize(\OC_Preferences::getValue($user, 'files', 'quota'));
- if ( $quota == null ) {
- $quota = \OCP\Util::computerFileSize(\OC_Appconfig::getValue('files', 'default_quota'));
- }
- if ( $quota == null ) {
- $quota = \OC\Files\Filesystem::free_space('/');
+
+ // get available disk space for user\r
+ $quota = \OCP\Util::computerFileSize(\OC_Preferences::getValue($user, 'files', 'quota'));\r
+ if ( $quota == null ) {\r
+ $quota = \OCP\Util::computerFileSize(\OC_Appconfig::getValue('files', 'default_quota'));\r
+ }\r
+ if ( $quota == null ) {\r
- $quota = \OC\Files\Filesystem::free_space('/') / count(\OCP\User::getUsers());\r
++ $quota = \OC\Files\Filesystem::free_space('/') / count(\OCP\User::getUsers());
}
-
- // calculate available space for trash bin\r
- $rootInfo = $view->getFileInfo('/files');\r
- $free = $quota-$rootInfo['size']; // remaining free space for user\r
- if ( $free > 0 ) {\r
- $availableSpace = ($free * self::DEFAULTMAXSIZE / 100) - $trashbinSize; // how much space can be used for versions\r
- } else {\r
- $availableSpace = $free-$trashbinSize;\r
+
+ // calculate available space for trash bin
+ $rootInfo = $view->getFileInfo('/files');
+ $free = $quota-$rootInfo['size']; // remaining free space for user
+ if ( $free > 0 ) {
+ $availableSpace = ($free * self::DEFAULTMAXSIZE / 100) - $trashbinSize; // how much space can be used for versions
+ } else {
+ $availableSpace = $free-$trashbinSize;
}
-
+
$trashbinSize -= self::expire($availableSpace);
- \OCP\Config::setAppValue('files_trashbin', 'size', $trashbinSize);
+
+ self::setTrashbinSize($user, $trashbinSize);\r
++
}
-
-
+
+
/**
* restore files from trash bin
* @param $file path to the deleted file
public static function restore($file, $filename, $timestamp) {
$user = \OCP\User::getUser();
$view = new \OC_FilesystemView('/'.$user);
-
- if ( ($trashbinSize = \OCP\Config::getAppValue('files_trashbin', 'size')) === null ) {
- $trashbinSize = self::calculateSize(new \OC_FilesystemView('/'. $user.'/files_trashbin'));
+
+ $trashbinSize = self::getTrashbinSize($user);
+ if ( $trashbinSize === false || $trashbinSize < 0 ) {\r
+ $trashbinSize = self::calculateSize(new \OC_FilesystemView('/'. $user.'/files_trashbin'));\r
- $trashbinSize += self::calculateSize(new \OC_FilesystemView('/'. $user.'/versions_trashbin'));\r
+ $trashbinSize += self::calculateSize(new \OC_FilesystemView('/'. $user.'/versions_trashbin'));
}
if ( $timestamp ) {
- $query = \OC_DB::prepare('SELECT location,type FROM *PREFIX*files_trash WHERE user=? AND id=? AND timestamp=?');\r
+ $query = \OC_DB::prepare('SELECT location,type FROM *PREFIX*files_trash'
+ .' WHERE user=? AND id=? AND timestamp=?');
$result = $query->execute(array($user,$filename,$timestamp))->fetchAll();
if ( count($result) != 1 ) {
\OC_Log::write('files_trashbin', 'trash bin database inconsistent!', \OC_Log::ERROR);
return false;
}
-
- /**\r
- * delete file from trash bin permanently\r
+
+ /**
+ * delete file from trash bin permanently
* @param $filename path to the file
- * @param $timestamp of deletion time\r
- * @return size of deleted files\r
- */\r
- public static function delete($filename, $timestamp=null) {\r
- $user = \OCP\User::getUser();\r
+ * @param $timestamp of deletion time
+ * @return size of deleted files
+ */
+ public static function delete($filename, $timestamp=null) {
+ $user = \OCP\User::getUser();
$view = new \OC_FilesystemView('/'.$user);
- $size = 0;
-
- if ( ($trashbinSize = \OCP\Config::getAppValue('files_trashbin', 'size')) === null ) {
- $trashbinSize = self::calculateSize(new \OC_FilesystemView('/'. $user.'/files_trashbin'));
+ $size = 0;\r
+
+ $trashbinSize = self::getTrashbinSize($user);
+ if ( $trashbinSize === false || $trashbinSize < 0 ) {\r
+ $trashbinSize = self::calculateSize(new \OC_FilesystemView('/'. $user.'/files_trashbin'));\r
- $trashbinSize += self::calculateSize(new \OC_FilesystemView('/'. $user.'/versions_trashbin'));\r
+ $trashbinSize += self::calculateSize(new \OC_FilesystemView('/'. $user.'/versions_trashbin'));
}
- \r
- if ( $timestamp ) {\r
- $query = \OC_DB::prepare('DELETE FROM *PREFIX*files_trash WHERE user=? AND id=? AND timestamp=?');\r
- $query->execute(array($user,$filename,$timestamp));\r
+
+ if ( $timestamp ) {
+ $query = \OC_DB::prepare('DELETE FROM *PREFIX*files_trash WHERE user=? AND id=? AND timestamp=?');
+ $query->execute(array($user,$filename,$timestamp));
$file = $filename.'.d'.$timestamp;
} else {
$file = $filename;
}
$view->unlink('/files_trashbin/'.$file);
$trashbinSize -= $size;
- \OCP\Config::setAppValue('files_trashbin', 'size', $trashbinSize);
-
+ self::setTrashbinSize($user, $trashbinSize);
+ \r
- return $size;\r
+ return $size;
}
/**
$relpath = substr($path, strlen($root)-1);
if ( !$view->is_dir($relpath) ) {
$size += $view->filesize($relpath);
- }\r
- }\r
- return $size;\r
+ }
+ }
+ return $size;
}
-}
+ /**\r
+ * get current size of trash bin from a given user\r
+ *\r
+ * @param $user user who owns the trash bin\r
+ * @return mixed trash bin size or false if no trash bin size is stored\r
+ */\r
+ private static function getTrashbinSize($user) {\r
+ $query = \OC_DB::prepare('SELECT size FROM *PREFIX*files_trashsize WHERE user=?');\r
+ $result = $query->execute(array($user))->fetchAll();\r
+\r
+ if ($result) {\r
+ return $result[0]['size'];\r
+ }\r
+ return false;\r
+ }\r
+ \r
+ /**\r
+ * write to the database how much space is in use for the trash bin\r
+ *\r
+ * @param $user owner of the trash bin\r
+ * @param $size size of the trash bin\r
+ */\r
+ private static function setTrashbinSize($user, $size) {\r
+ if ( self::getTrashbinSize($user) === false) {\r
+ $query = \OC_DB::prepare('INSERT INTO *PREFIX*files_trashsize (size, user) VALUES (?, ?)');\r
+ }else {\r
+ $query = \OC_DB::prepare('UPDATE *PREFIX*files_trashsize SET size=? WHERE user=?');\r
+ }\r
+ $query->execute(array($size, $user));\r
+ }
+
- }\r
++}
}
return array($uid, $filename);
}
-
+
+ /**
+ * get current size of all versions from a given user
+ *
+ * @param $user user who owns the versions
+ * @return mixed versions size or false if no versions size is stored
+ */
+ private static function getVersionsSize($user) {
+ $query = \OC_DB::prepare('SELECT size FROM *PREFIX*files_versions WHERE user=?');
+ $result = $query->execute(array($user))->fetchAll();
+
+ if ($result) {
+ return $result[0]['size'];
+ }
+ return false;
+ }
+
+ /**
+ * write to the database how much space is in use for versions
+ *
+ * @param $user owner of the versions
+ * @param $size size of the versions
+ */
+ private static function setVersionsSize($user, $size) {
+ if ( self::getVersionsSize($user) === false) {
+ $query = \OC_DB::prepare('INSERT INTO *PREFIX*files_versions (size, user) VALUES (?, ?)');
+ }else {
+ $query = \OC_DB::prepare('UPDATE *PREFIX*files_versions SET size=? WHERE user=?');
+ }
+ $query->execute(array($size, $user));
+ }
+
/**
* store a new version of a file.
*/
public static function delete($filename) {
list($uid, $filename) = self::getUidAndFilename($filename);
$versions_fileview = new \OC\Files\View('/'.$uid .'/files_versions');
-
+
$abs_path = \OCP\Config::getSystemValue('datadirectory').$versions_fileview->getAbsolutePath('').$filename.'.v';
if( ($versions = self::getVersions($uid, $filename)) ) {
- if ( ($versionsSize = \OCP\Config::getAppValue('files_versions', 'size')) === null ) {
+ $versionsSize = self::getVersionsSize($uid);
+ if ( $versionsSize === false || $versionsSize < 0 ) {
$versionsSize = self::calculateSize($uid);
}
foreach ($versions as $v) {
unlink($abs_path . $v['version']);
$versionsSize -= $v['size'];
}
- \OCP\Config::setAppValue('files_versions', 'size', $versionsSize);
+ self::setVersionsSize($uid, $versionsSize);
}
}
-
+
/**
* rename versions of a file
*/
$quota = \OCP\Util::computerFileSize(\OC_Appconfig::getValue('files', 'default_quota'));
}
if ( $quota == null ) {
- $quota = \OC\Files\Filesystem::free_space('/');
+ $quota = \OC\Files\Filesystem::free_space('/') / count(\OCP\User::getUsers());
}
-
+
// make sure that we have the current size of the version history
if ( $versionsSize === null ) {
- if ( ($versionsSize = \OCP\Config::getAppValue('files_versions', 'size')) === null ) {
+ $versionsSize = self::getVersionsSize($uid);
+ if ( $versionsSize === false || $versionsSize < 0 ) {
$versionsSize = self::calculateSize($uid);
}
}