DatabaseFileManager.h (4763B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef DOM_INDEXEDDB_DATABASEFILEMANAGER_H_ 8 #define DOM_INDEXEDDB_DATABASEFILEMANAGER_H_ 9 10 #include "FileInfoManager.h" 11 #include "IndexedDBCipherKeyManager.h" 12 #include "mozilla/InitializedOnce.h" 13 #include "mozilla/dom/FlippedOnce.h" 14 #include "mozilla/dom/quota/CommonMetadata.h" 15 #include "mozilla/dom/quota/PersistenceType.h" 16 #include "mozilla/dom/quota/UsageInfo.h" 17 18 class nsIFile; 19 class mozIStorageConnection; 20 21 namespace mozilla::dom::indexedDB { 22 23 // Implemented in ActorsParent.cpp. 24 class DatabaseFileManager final 25 : public FileInfoManager<DatabaseFileManager>, 26 public AtomicSafeRefCounted<DatabaseFileManager> { 27 using PersistenceType = mozilla::dom::quota::PersistenceType; 28 using FileInfoManager<DatabaseFileManager>::MutexType; 29 30 const PersistenceType mPersistenceType; 31 const quota::OriginMetadata mOriginMetadata; 32 const nsString mDatabaseName; 33 const nsCString mDatabaseID; 34 const nsString mDatabaseFilePath; 35 36 RefPtr<IndexedDBCipherKeyManager> mCipherKeyManager; 37 38 LazyInitializedOnce<const nsString> mDirectoryPath; 39 LazyInitializedOnce<const nsString> mJournalDirectoryPath; 40 41 uint64_t mDatabaseVersion; 42 43 const bool mEnforcingQuota; 44 const bool mIsInPrivateBrowsingMode; 45 46 FlippedOnce<false> mInitialized; 47 48 // Lock protecting DatabaseFileManager.mFileInfos. 49 // It's s also used to atomically update DatabaseFileInfo.mRefCnt and 50 // DatabaseFileInfo.mDBRefCnt 51 static MutexType sMutex; 52 53 public: 54 [[nodiscard]] static nsCOMPtr<nsIFile> GetFileForId(nsIFile* aDirectory, 55 int64_t aId); 56 57 [[nodiscard]] static nsCOMPtr<nsIFile> GetCheckedFileForId( 58 nsIFile* aDirectory, int64_t aId); 59 60 static nsresult InitDirectory(nsIFile& aDirectory, nsIFile& aDatabaseFile, 61 const nsACString& aOrigin, 62 uint32_t aTelemetryId); 63 64 template <typename KnownDirEntryOp, typename UnknownDirEntryOp> 65 static Result<Ok, nsresult> TraverseFiles( 66 nsIFile& aDirectory, KnownDirEntryOp&& aKnownDirEntryOp, 67 UnknownDirEntryOp&& aUnknownDirEntryOp); 68 69 static Result<quota::FileUsageType, nsresult> GetUsage(nsIFile* aDirectory); 70 71 DatabaseFileManager(PersistenceType aPersistenceType, 72 const quota::OriginMetadata& aOriginMetadata, 73 const nsAString& aDatabaseName, 74 const nsCString& aDatabaseID, 75 const nsAString& aDatabaseFilePath, bool aEnforcingQuota, 76 bool aIsInPrivateBrowsingMode); 77 78 PersistenceType Type() const { return mPersistenceType; } 79 80 const quota::OriginMetadata& OriginMetadata() const { 81 return mOriginMetadata; 82 } 83 84 const nsACString& Origin() const { return mOriginMetadata.mOrigin; } 85 86 const nsAString& DatabaseName() const { return mDatabaseName; } 87 88 const nsCString& DatabaseID() const { return mDatabaseID; } 89 90 const nsAString& DatabaseFilePath() const { return mDatabaseFilePath; } 91 92 uint64_t DatabaseVersion() const; 93 94 void UpdateDatabaseVersion(uint64_t aDatabaseVersion); 95 96 IndexedDBCipherKeyManager& MutableCipherKeyManagerRef() const { 97 MOZ_ASSERT(mIsInPrivateBrowsingMode); 98 MOZ_ASSERT(mCipherKeyManager); 99 100 return *mCipherKeyManager; 101 } 102 103 auto IsInPrivateBrowsingMode() const { return mIsInPrivateBrowsingMode; } 104 105 bool EnforcingQuota() const { return mEnforcingQuota; } 106 107 bool Initialized() const { return mInitialized; } 108 109 nsresult Init(nsIFile* aDirectory, const uint64_t aDatabaseVersion, 110 mozIStorageConnection& aConnection); 111 112 [[nodiscard]] nsCOMPtr<nsIFile> GetDirectory(); 113 114 [[nodiscard]] nsCOMPtr<nsIFile> GetCheckedDirectory(); 115 116 [[nodiscard]] nsCOMPtr<nsIFile> GetJournalDirectory(); 117 118 [[nodiscard]] nsCOMPtr<nsIFile> EnsureJournalDirectory(); 119 120 [[nodiscard]] nsresult SyncDeleteFile(int64_t aId); 121 122 // XXX When getting rid of FileHelper, this method should be removed/made 123 // private. 124 [[nodiscard]] nsresult SyncDeleteFile(nsIFile& aFile, 125 nsIFile& aJournalFile) const; 126 127 [[nodiscard]] nsresult AsyncDeleteFile(int64_t aFileId); 128 129 nsresult Invalidate() override; 130 131 MOZ_DECLARE_REFCOUNTED_TYPENAME(DatabaseFileManager) 132 133 static StaticMutex& MutexInstance() MOZ_RETURN_CAPABILITY(sMutex) { 134 return sMutex; 135 } 136 137 ~DatabaseFileManager() = default; 138 }; 139 140 } // namespace mozilla::dom::indexedDB 141 142 #endif // DOM_INDEXEDDB_DATABASEFILEMANAGER_H_