| // Copyright 2019 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef ARC_APK_CACHE_CACHE_CLEANER_DB_H_ |
| #define ARC_APK_CACHE_CACHE_CLEANER_DB_H_ |
| |
| #include <array> |
| #include <string> |
| |
| #include "arc/apk-cache/apk_cache_database.h" |
| |
| namespace apk_cache { |
| class ApkCacheDatabase; |
| } // namespace apk_cache |
| |
| namespace base { |
| class FilePath; |
| class TimeDelta; |
| } // namespace base |
| |
| namespace apk_cache { |
| |
| // Cache cleaner session source for testing. |
| extern const char kCacheCleanerSessionSource[]; |
| |
| // Maximum session age for testing. |
| extern const base::TimeDelta kSessionMaxAge; |
| |
| extern const base::TimeDelta kValidityPeriod; |
| |
| // Converts file ID to file name. |
| std::string GetFileNameById(int64_t id); |
| |
| // Cleans opaque files organized by APK cache database. Path to the cache |
| // directory must be provided as |cache_root| in the constructor. |
| class OpaqueFilesCleaner { |
| public: |
| explicit OpaqueFilesCleaner(const base::FilePath& cache_root); |
| |
| // Not copyable or movable. |
| OpaqueFilesCleaner(const OpaqueFilesCleaner&) = delete; |
| OpaqueFilesCleaner& operator=(const OpaqueFilesCleaner&) = delete; |
| |
| ~OpaqueFilesCleaner(); |
| |
| // Performs cleaning of opaque files organized by database in the APK cache |
| // directory. Also deletes invalid entries in the database. Returns true if |
| // all the intended files and directories were successfully deleted. |
| bool Clean(); |
| |
| private: |
| // Deletes all files in cache in case of database corruption. |
| bool DeleteCache() const; |
| // Deletes all files in |files| directory. |
| bool DeleteFiles() const; |
| // Deletes expired sessions and sessions that have a timestamp in the future. |
| // Returns true if successful. |
| bool CleanStaleSessions(const ApkCacheDatabase& db) const; |
| // Checks if any other session is active. Returns true if there is other |
| // session active. |
| bool IsOtherSessionActive(const ApkCacheDatabase& db) const; |
| // Creates a new cache cleaner session with open status. Returns ID. Returns 0 |
| // if new session cannot be created. |
| int64_t OpenSession(const ApkCacheDatabase& db) const; |
| // Closes a cache cleaner session. Returns true if successful. |
| bool CloseSession(const ApkCacheDatabase& db, uint64_t id) const; |
| // Deletes packages with outdated files. Returns true if successful. |
| bool CleanOutdatedFiles(const ApkCacheDatabase& db) const; |
| // Deletes sessions without any reference from |file_entries| table. Current |
| // cleaner session is specified in |cleaner_session_id|. |
| bool CleanSessionsWithoutFile(const ApkCacheDatabase& db, |
| int64_t cleaner_session_id) const; |
| // Cleans up files in files/ directory. Deletes all files without a record in |
| // |file_entries| table. |
| bool CleanFiles(const ApkCacheDatabase& db) const; |
| |
| base::FilePath cache_root_; |
| base::FilePath db_path_; |
| base::FilePath files_path_; |
| }; |
| |
| } // namespace apk_cache |
| |
| #endif // ARC_APK_CACHE_CACHE_CLEANER_DB_H_ |