From 7ad0fee0b56d9ab678cbb52128d427ebd641b05e Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Tue, 6 May 2014 13:55:26 +0200 Subject: [PATCH 1/4] let file cache handle the versions size --- apps/files_versions/appinfo/database.xml | 35 ----------------- apps/files_versions/appinfo/update.php | 13 ++----- apps/files_versions/appinfo/version | 2 +- apps/files_versions/lib/versions.php | 49 +++++------------------- lib/private/files/cache/homecache.php | 2 +- 5 files changed, 14 insertions(+), 87 deletions(-) delete mode 100644 apps/files_versions/appinfo/database.xml diff --git a/apps/files_versions/appinfo/database.xml b/apps/files_versions/appinfo/database.xml deleted file mode 100644 index d385477698..0000000000 --- a/apps/files_versions/appinfo/database.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - *dbname* - true - false - - utf8 - - - - *dbprefix*files_versions - - - - - user - text - - true - 64 - - - size - text - - true - 50 - - - - -
- -
diff --git a/apps/files_versions/appinfo/update.php b/apps/files_versions/appinfo/update.php index 52a4850758..ee6d3c14c9 100644 --- a/apps/files_versions/appinfo/update.php +++ b/apps/files_versions/appinfo/update.php @@ -2,14 +2,7 @@ $installedVersion=OCP\Config::getAppValue('files_versions', 'installed_version'); // move versions to new directory -if (version_compare($installedVersion, '1.0.2', '<')) { - $users = \OCP\User::getUsers(); - $datadir = \OCP\Config::getSystemValue('datadirectory').'/'; - foreach ($users as $user) { - $oldPath = $datadir.$user.'/versions'; - $newPath = $datadir.$user.'/files_versions'; - if(is_dir($oldPath)) { - rename($oldPath, $newPath); - } - } +if (version_compare($installedVersion, '1.0.4', '<')) { + $query = \OCP\DB::prepare("DROP TABLE `*PREFIX*files_versions`"); + $query->execute(array()); } diff --git a/apps/files_versions/appinfo/version b/apps/files_versions/appinfo/version index e4c0d46e55..ee90284c27 100644 --- a/apps/files_versions/appinfo/version +++ b/apps/files_versions/appinfo/version @@ -1 +1 @@ -1.0.3 \ No newline at end of file +1.0.4 diff --git a/apps/files_versions/lib/versions.php b/apps/files_versions/lib/versions.php index 56e1dfc2e2..8dc01d18ad 100644 --- a/apps/files_versions/lib/versions.php +++ b/apps/files_versions/lib/versions.php @@ -54,31 +54,12 @@ class Storage { * get current size of all versions from a given user * * @param string $user user who owns the versions - * @return mixed versions size or false if no versions size is stored + * @return int versions size */ 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 string $user owner of the versions - * @param int $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)); + $view = new \OC\Files\View('/' . $user); + $fileInfo = $view->getFileInfo('/files_versions'); + return isset($fileInfo['size']) ? $fileInfo['size'] : 0; } /** @@ -115,16 +96,13 @@ class Storage { self::createMissingDirectories($filename, $users_view); $versionsSize = self::getVersionsSize($uid); - if ( $versionsSize === false || $versionsSize < 0 ) { - $versionsSize = self::calculateSize($uid); - } // assumption: we need filesize($filename) for the new version + // some more free space for the modified file which might be // 1.5 times as large as the current version -> 2.5 $neededSpace = $files_view->filesize($filename) * 2.5; - $versionsSize = self::expire($filename, $versionsSize, $neededSpace); + self::expire($filename, $versionsSize, $neededSpace); // disable proxy to prevent multiple fopen calls $proxyStatus = \OC_FileProxy::$enabled; @@ -138,10 +116,6 @@ class Storage { // reset proxy state \OC_FileProxy::$enabled = $proxyStatus; - - $versionsSize += $users_view->filesize('files'.$filename); - - self::setVersionsSize($uid, $versionsSize); } } @@ -173,17 +147,11 @@ class Storage { $abs_path = $versions_fileview->getLocalFile($filename . '.v'); $versions = self::getVersions($uid, $filename); if (!empty($versions)) { - $versionsSize = self::getVersionsSize($uid); - if ($versionsSize === false || $versionsSize < 0) { - $versionsSize = self::calculateSize($uid); - } foreach ($versions as $v) { \OC_Hook::emit('\OCP\Versions', 'preDelete', array('path' => $abs_path . $v['version'])); unlink($abs_path . $v['version']); \OC_Hook::emit('\OCP\Versions', 'delete', array('path' => $abs_path . $v['version'])); - $versionsSize -= $v['size']; } - self::setVersionsSize($uid, $versionsSize); } } unset(self::$deletedFiles[$path]); @@ -345,6 +313,7 @@ class Storage { } /** +<<<<<<< HEAD * get the size of all stored versions from a given user * @param string $uid id from the user * @return int size of versions @@ -373,6 +342,9 @@ class Storage { /** * returns all stored file versions from a given user +======= + * @brief returns all stored file versions from a given user +>>>>>>> 2f97e2f... let file cache handle the versions size * @param string $uid id of the user * @return array with contains two arrays 'all' which contains all versions sorted by age and 'by_file' which contains all versions sorted by filename */ @@ -500,9 +472,6 @@ class Storage { // make sure that we have the current size of the version history if ( $versionsSize === null ) { $versionsSize = self::getVersionsSize($uid); - if ( $versionsSize === false || $versionsSize < 0 ) { - $versionsSize = self::calculateSize($uid); - } } // calculate available space for version history diff --git a/lib/private/files/cache/homecache.php b/lib/private/files/cache/homecache.php index f61769f0b9..06ae62015a 100644 --- a/lib/private/files/cache/homecache.php +++ b/lib/private/files/cache/homecache.php @@ -17,7 +17,7 @@ class HomeCache extends Cache { * @return int */ public function calculateFolderSize($path, $entry = null) { - if ($path !== '/' and $path !== '' and $path !== 'files' and $path !== 'files_trashbin') { + if ($path !== '/' and $path !== '' and $path !== 'files' and $path !== 'files_trashbin' and $path !== 'files_versions') { return parent::calculateFolderSize($path, $entry); } elseif ($path === '' or $path === '/') { // since the size of / isn't used (the size of /files is used instead) there is no use in calculating it From a7f6a051addf9545c895384e5e295fbfbf8f8df8 Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Tue, 6 May 2014 13:56:22 +0200 Subject: [PATCH 2/4] return size '0' if the trashbin folder doesn't exists yet --- apps/files_trashbin/lib/trashbin.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/files_trashbin/lib/trashbin.php b/apps/files_trashbin/lib/trashbin.php index e95f1b13c3..72b52e716d 100644 --- a/apps/files_trashbin/lib/trashbin.php +++ b/apps/files_trashbin/lib/trashbin.php @@ -904,12 +904,12 @@ class Trashbin { * get current size of trash bin from a given user * * @param string $user user who owns the trash bin - * @return mixed trash bin size or false if no trash bin size is stored + * @return integer trash bin size */ private static function getTrashbinSize($user) { $view = new \OC\Files\View('/' . $user); $fileInfo = $view->getFileInfo('/files_trashbin'); - return $fileInfo['size']; + return isset($fileInfo['size']) ? $fileInfo['size'] : 0; } /** From 2bb902d02864aa73d0985537552df4b076f5860b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Mon, 2 Jun 2014 18:57:53 +0200 Subject: [PATCH 3/4] use OC_DB::dropTable() --- apps/files_trashbin/appinfo/update.php | 3 +-- apps/files_versions/appinfo/update.php | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/apps/files_trashbin/appinfo/update.php b/apps/files_trashbin/appinfo/update.php index ca7b87a868..191d3cf25d 100644 --- a/apps/files_trashbin/appinfo/update.php +++ b/apps/files_trashbin/appinfo/update.php @@ -5,6 +5,5 @@ $installedVersion=OCP\Config::getAppValue('files_trashbin', 'installed_version') if (version_compare($installedVersion, '0.6', '<')) { //size of the trash bin could be incorrect, remove it for all users to //enforce a recalculation during next usage. - $query = \OC_DB::prepare('DELETE FROM `*PREFIX*files_trashsize`'); - $result = $query->execute(); + \OC_DB::dropTable('files_trashsize'); } diff --git a/apps/files_versions/appinfo/update.php b/apps/files_versions/appinfo/update.php index ee6d3c14c9..fdc6b1e5f1 100644 --- a/apps/files_versions/appinfo/update.php +++ b/apps/files_versions/appinfo/update.php @@ -3,6 +3,5 @@ $installedVersion=OCP\Config::getAppValue('files_versions', 'installed_version'); // move versions to new directory if (version_compare($installedVersion, '1.0.4', '<')) { - $query = \OCP\DB::prepare("DROP TABLE `*PREFIX*files_versions`"); - $query->execute(array()); + \OC_DB::dropTable("files_versions"); } From 8ee15025f06b683673101c5604b10798c75a76ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Tue, 3 Jun 2014 19:05:21 +0200 Subject: [PATCH 4/4] Fix merge conflict --- apps/files_versions/lib/versions.php | 31 ---------------------------- 1 file changed, 31 deletions(-) diff --git a/apps/files_versions/lib/versions.php b/apps/files_versions/lib/versions.php index 8dc01d18ad..15d0e032ea 100644 --- a/apps/files_versions/lib/versions.php +++ b/apps/files_versions/lib/versions.php @@ -312,39 +312,8 @@ class Storage { return $query->execute(array($uid)); } - /** -<<<<<<< HEAD - * get the size of all stored versions from a given user - * @param string $uid id from the user - * @return int size of versions - */ - private static function calculateSize($uid) { - if (\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED) == 'true') { - $view = new \OC\Files\View('/' . $uid . '/files_versions'); - - $size = 0; - - $dirContent = $view->getDirectoryContent('/'); - - while (!empty($dirContent)) { - $path = reset($dirContent); - if ($path['type'] === 'dir') { - $dirContent = array_merge($dirContent, $view->getDirectoryContent(substr($path['path'], strlen('files_versions')))); - } else { - $size += $view->filesize(substr($path['path'], strlen('files_versions'))); - } - unset($dirContent[key($dirContent)]); - } - - return $size; - } - } - /** * returns all stored file versions from a given user -======= - * @brief returns all stored file versions from a given user ->>>>>>> 2f97e2f... let file cache handle the versions size * @param string $uid id of the user * @return array with contains two arrays 'all' which contains all versions sorted by age and 'by_file' which contains all versions sorted by filename */