From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- storage/mozStorageService.h | 185 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 storage/mozStorageService.h (limited to 'storage/mozStorageService.h') diff --git a/storage/mozStorageService.h b/storage/mozStorageService.h new file mode 100644 index 0000000000..194b280dc2 --- /dev/null +++ b/storage/mozStorageService.h @@ -0,0 +1,185 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * vim: sw=2 ts=2 et lcs=trail\:.,tab\:>~ : + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef MOZSTORAGESERVICE_H +#define MOZSTORAGESERVICE_H + +#include "nsCOMPtr.h" +#include "nsIFile.h" +#include "nsIMemoryReporter.h" +#include "nsIObserver.h" +#include "nsTArray.h" +#include "mozilla/Mutex.h" +#include "mozilla/UniquePtr.h" +#include "mozilla/intl/Collator.h" + +#include "mozIStorageService.h" + +class nsIMemoryReporter; +struct sqlite3_vfs; +namespace mozilla::intl { +class Collator; +} + +namespace mozilla { +namespace storage { + +class Connection; +class Service : public mozIStorageService, + public nsIObserver, + public nsIMemoryReporter { + public: + /** + * Initializes the service. This must be called before any other function! + */ + nsresult initialize(); + + /** + * Compares two strings using the Service's locale-aware collation. + * + * @param aStr1 + * The string to be compared against aStr2. + * @param aStr2 + * The string to be compared against aStr1. + * @param aSensitivity + * The sorting sensitivity. + * @return aStr1 - aStr2. That is, if aStr1 < aStr2, returns a negative + * number. If aStr1 > aStr2, returns a positive number. If + * aStr1 == aStr2, returns 0. + */ + int localeCompareStrings(const nsAString& aStr1, const nsAString& aStr2, + mozilla::intl::Collator::Sensitivity aSensitivity); + + static already_AddRefed getSingleton(); + + NS_DECL_THREADSAFE_ISUPPORTS + NS_DECL_MOZISTORAGESERVICE + NS_DECL_NSIOBSERVER + NS_DECL_NSIMEMORYREPORTER + + /** + * Returns a boolean value indicating whether or not the given page size is + * valid (currently understood as a power of 2 between 512 and 65536). + */ + static bool pageSizeIsValid(int32_t aPageSize) { + return aPageSize == 512 || aPageSize == 1024 || aPageSize == 2048 || + aPageSize == 4096 || aPageSize == 8192 || aPageSize == 16384 || + aPageSize == 32768 || aPageSize == 65536; + } + + static const int32_t kDefaultPageSize = 32768; + + /** + * Registers the connection with the storage service. Connections are + * registered so they can be iterated over. + * + * @pre mRegistrationMutex is not held + * + * @param aConnection + * The connection to register. + */ + void registerConnection(Connection* aConnection); + + /** + * Unregisters the connection with the storage service. + * + * @pre mRegistrationMutex is not held + * + * @param aConnection + * The connection to unregister. + */ + void unregisterConnection(Connection* aConnection); + + /** + * Gets the list of open connections. Note that you must test each + * connection with mozIStorageConnection::connectionReady before doing + * anything with it, and skip it if it's not ready. + * + * @pre mRegistrationMutex is not held + * + * @param aConnections + * An inout param; it is cleared and the connections are appended to + * it. + * @return The open connections. + */ + void getConnections(nsTArray >& aConnections); + + private: + Service(); + virtual ~Service(); + + /** + * Used for 1) locking around calls when initializing connections so that we + * can ensure that the state of sqlite3_enable_shared_cache is sane and 2) + * synchronizing access to mLocaleCollation. + */ + Mutex mMutex MOZ_UNANNOTATED; + + struct AutoVFSRegistration { + int Init(UniquePtr aVFS); + ~AutoVFSRegistration(); + + private: + UniquePtr mVFS; + }; + + // The order of these members should match the order of Init calls in + // initialize(), to ensure that the unregistration takes place in the reverse + // order. + AutoVFSRegistration mBaseSqliteVFS; + AutoVFSRegistration mBaseExclSqliteVFS; + AutoVFSRegistration mQuotaSqliteVFS; + AutoVFSRegistration mObfuscatingSqliteVFS; + AutoVFSRegistration mReadOnlyNoLockSqliteVFS; + + /** + * Protects mConnections. + */ + Mutex mRegistrationMutex MOZ_UNANNOTATED; + + /** + * The list of connections we have created. Modifications to it are + * protected by |mRegistrationMutex|. + */ + nsTArray > mConnections; + + /** + * Frees as much heap memory as possible from all of the known open + * connections. + */ + void minimizeMemory(); + + /** + * Lazily creates and returns a collator created from the application's + * locale that all statements of all Connections of this Service may use. + * Since the collator's lifetime is that of the Service and no statement may + * execute outside the lifetime of the Service, this method returns a raw + * pointer. + */ + mozilla::intl::Collator* getCollator(); + + /** + * Lazily created collator that all statements of all Connections of this + * Service may use. The collator is created from the application's locale. + * + * @note The collator is not thread-safe since the options can be changed + * between calls. Access should be synchronized. + */ + mozilla::UniquePtr mCollator = nullptr; + + nsCOMPtr mProfileStorageFile; + + nsCOMPtr mStorageSQLiteReporter; + + static Service* gService; + + mozilla::intl::Collator::Sensitivity mLastSensitivity; +}; + +} // namespace storage +} // namespace mozilla + +#endif /* MOZSTORAGESERVICE_H */ -- cgit v1.2.3