2009-03-31 18:26:16 +04:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
2009-04-13 20:29:41 +04:00
|
|
|
* vim: sw=2 ts=2 et lcs=trail\:.,tab\:>~ :
|
2012-05-21 15:12:37 +04:00
|
|
|
* 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/. */
|
2004-10-09 04:04:10 +04:00
|
|
|
|
2010-06-01 16:38:00 +04:00
|
|
|
#ifndef MOZSTORAGESERVICE_H
|
|
|
|
#define MOZSTORAGESERVICE_H
|
2004-10-09 04:04:10 +04:00
|
|
|
|
|
|
|
#include "nsCOMPtr.h"
|
|
|
|
#include "nsIFile.h"
|
2013-11-07 09:35:30 +04:00
|
|
|
#include "nsIMemoryReporter.h"
|
2006-02-16 05:59:42 +03:00
|
|
|
#include "nsIObserver.h"
|
2011-12-06 03:02:59 +04:00
|
|
|
#include "nsTArray.h"
|
2009-07-15 21:49:05 +04:00
|
|
|
#include "mozilla/Mutex.h"
|
2021-08-10 19:01:18 +03:00
|
|
|
#include "mozilla/UniquePtr.h"
|
|
|
|
#include "mozilla/intl/Collator.h"
|
2004-10-09 04:04:10 +04:00
|
|
|
|
|
|
|
#include "mozIStorageService.h"
|
|
|
|
|
2012-01-03 12:27:05 +04:00
|
|
|
class nsIMemoryReporter;
|
2013-01-30 01:38:37 +04:00
|
|
|
struct sqlite3_vfs;
|
2021-08-10 19:01:18 +03:00
|
|
|
namespace mozilla::intl {
|
|
|
|
class Collator;
|
|
|
|
}
|
2006-07-26 22:54:12 +04:00
|
|
|
|
2023-06-24 13:11:28 +03:00
|
|
|
namespace mozilla::storage {
|
2006-07-26 22:54:12 +04:00
|
|
|
|
2011-12-06 03:02:59 +04:00
|
|
|
class Connection;
|
2013-12-08 09:39:47 +04:00
|
|
|
class Service : public mozIStorageService,
|
2009-03-31 18:26:16 +04:00
|
|
|
public nsIObserver,
|
2013-12-08 09:39:47 +04:00
|
|
|
public nsIMemoryReporter {
|
2004-10-09 04:04:10 +04:00
|
|
|
public:
|
2009-03-31 18:26:16 +04:00
|
|
|
/**
|
|
|
|
* Initializes the service. This must be called before any other function!
|
|
|
|
*/
|
|
|
|
nsresult initialize();
|
|
|
|
|
2009-07-15 21:49:05 +04:00
|
|
|
/**
|
|
|
|
* 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.
|
2021-08-10 19:01:18 +03:00
|
|
|
* @param aSensitivity
|
|
|
|
* The sorting sensitivity.
|
2009-07-15 21:49:05 +04:00
|
|
|
* @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,
|
2021-08-10 19:01:18 +03:00
|
|
|
mozilla::intl::Collator::Sensitivity aSensitivity);
|
2009-07-15 21:49:05 +04:00
|
|
|
|
2017-10-17 07:08:42 +03:00
|
|
|
static already_AddRefed<Service> getSingleton();
|
2006-02-16 05:59:42 +03:00
|
|
|
|
2013-07-19 06:24:15 +04:00
|
|
|
NS_DECL_THREADSAFE_ISUPPORTS
|
2009-03-31 18:26:16 +04:00
|
|
|
NS_DECL_MOZISTORAGESERVICE
|
|
|
|
NS_DECL_NSIOBSERVER
|
2013-12-08 09:39:47 +04:00
|
|
|
NS_DECL_NSIMEMORYREPORTER
|
2013-11-07 09:35:30 +04:00
|
|
|
|
2013-04-05 04:14:46 +04:00
|
|
|
/**
|
|
|
|
* 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;
|
|
|
|
}
|
|
|
|
|
Bug 1650201 - Fix mozStorage prefs read before profile and fallback to a non-exclusive VFS when it can't get an exclusive lock. r=asuth,geckoview-reviewers,agi
mozStorage used to read prefs on service init, because they could only be read
on the main-thread. When service init was moved earlier, it started trying
to read prefs too early, before the profile was set up, thus it ended up always
reading the default value.
This patch moves the only relevant pref to mirrored StaticPrefs that can be accessed
from different threads, and removes two preferences that apparently are not necessary
(they have been broken from a long time) for now.
In particular, providing a global synchronous setting is a footgun, each consumer should
decide about their synchronous needs, rather than abusing a dangerous "go fast" setting.
The page size is something we don't change from quite some time, and it's unlikely to be
used to run experiments in the wild before doing local measurements first, for which Try
builds are enough.
The remaining exclusiveLock pref is a bit controversial, because in general exclusive lock
is better for various reasons, and mostly it is necessary to use WAL on network shares.
Though developers may find it useful for debugging, and some third parties are doing
dangerous things (like copying over databases) to work around it, for which it's safer to
provide a less dangerous alternative.
Note exclusive lock only works on Unix-derived systems for now (no Windows implementation).
Finally, this introduces a fallback to exclusive lock, so that if a third party is using our
databases, so that we can't get an exclusive lock, we'll fallback to normal locking.
Differential Revision: https://phabricator.services.mozilla.com/D82717
2020-07-11 00:45:53 +03:00
|
|
|
static const int32_t kDefaultPageSize = 32768;
|
|
|
|
|
2011-12-06 03:02:59 +04:00
|
|
|
/**
|
|
|
|
* 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);
|
|
|
|
|
|
|
|
/**
|
2012-01-03 12:27:05 +04:00
|
|
|
* 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.
|
2011-12-06 03:02:59 +04:00
|
|
|
*
|
|
|
|
* @pre mRegistrationMutex is not held
|
|
|
|
*
|
|
|
|
* @param aConnections
|
|
|
|
* An inout param; it is cleared and the connections are appended to
|
|
|
|
* it.
|
|
|
|
* @return The open connections.
|
|
|
|
*/
|
2015-10-18 08:24:48 +03:00
|
|
|
void getConnections(nsTArray<RefPtr<Connection> >& aConnections);
|
2011-12-06 03:02:59 +04:00
|
|
|
|
2004-10-09 04:04:10 +04:00
|
|
|
private:
|
2009-07-15 21:49:05 +04:00
|
|
|
Service();
|
2009-03-31 18:26:16 +04:00
|
|
|
virtual ~Service();
|
2008-03-20 04:37:04 +03:00
|
|
|
|
2009-03-31 18:26:16 +04:00
|
|
|
/**
|
2009-07-15 21:49:05 +04:00
|
|
|
* 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.
|
2009-03-31 18:26:16 +04:00
|
|
|
*/
|
2022-03-16 21:47:08 +03:00
|
|
|
Mutex mMutex MOZ_UNANNOTATED;
|
2017-07-06 15:00:35 +03:00
|
|
|
|
2020-10-29 13:13:46 +03:00
|
|
|
struct AutoVFSRegistration {
|
|
|
|
int Init(UniquePtr<sqlite3_vfs> aVFS);
|
|
|
|
~AutoVFSRegistration();
|
|
|
|
|
|
|
|
private:
|
|
|
|
UniquePtr<sqlite3_vfs> 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.
|
2023-05-10 14:51:48 +03:00
|
|
|
AutoVFSRegistration mBaseSqliteVFS;
|
|
|
|
AutoVFSRegistration mBaseExclSqliteVFS;
|
2023-03-07 17:27:07 +03:00
|
|
|
AutoVFSRegistration mQuotaSqliteVFS;
|
2020-10-29 13:13:46 +03:00
|
|
|
AutoVFSRegistration mObfuscatingSqliteVFS;
|
2022-11-29 23:35:23 +03:00
|
|
|
AutoVFSRegistration mReadOnlyNoLockSqliteVFS;
|
2013-01-30 01:38:37 +04:00
|
|
|
|
2011-12-06 03:02:59 +04:00
|
|
|
/**
|
|
|
|
* Protects mConnections.
|
|
|
|
*/
|
2022-03-16 21:47:08 +03:00
|
|
|
Mutex mRegistrationMutex MOZ_UNANNOTATED;
|
2011-12-06 03:02:59 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* The list of connections we have created. Modifications to it are
|
|
|
|
* protected by |mRegistrationMutex|.
|
|
|
|
*/
|
2015-10-18 08:24:48 +03:00
|
|
|
nsTArray<RefPtr<Connection> > mConnections;
|
2011-12-06 03:02:59 +04:00
|
|
|
|
2014-03-27 14:19:49 +04:00
|
|
|
/**
|
|
|
|
* Frees as much heap memory as possible from all of the known open
|
|
|
|
* connections.
|
|
|
|
*/
|
|
|
|
void minimizeMemory();
|
|
|
|
|
2009-07-15 21:49:05 +04:00
|
|
|
/**
|
2021-08-10 19:01:18 +03:00
|
|
|
* Lazily creates and returns a collator created from the application's
|
2009-07-15 21:49:05 +04:00
|
|
|
* locale that all statements of all Connections of this Service may use.
|
2021-08-10 19:01:18 +03:00
|
|
|
* Since the collator's lifetime is that of the Service and no statement may
|
2009-07-15 21:49:05 +04:00
|
|
|
* execute outside the lifetime of the Service, this method returns a raw
|
|
|
|
* pointer.
|
|
|
|
*/
|
2021-08-10 19:01:18 +03:00
|
|
|
mozilla::intl::Collator* getCollator();
|
2009-07-15 21:49:05 +04:00
|
|
|
|
|
|
|
/**
|
2021-08-10 19:01:18 +03:00
|
|
|
* Lazily created collator that all statements of all Connections of this
|
|
|
|
* Service may use. The collator is created from the application's locale.
|
2009-07-15 21:49:05 +04:00
|
|
|
*
|
2021-08-10 19:01:18 +03:00
|
|
|
* @note The collator is not thread-safe since the options can be changed
|
|
|
|
* between calls. Access should be synchronized.
|
2009-07-15 21:49:05 +04:00
|
|
|
*/
|
2021-08-10 19:01:18 +03:00
|
|
|
mozilla::UniquePtr<mozilla::intl::Collator> mCollator = nullptr;
|
2009-07-15 21:49:05 +04:00
|
|
|
|
2009-03-31 18:26:16 +04:00
|
|
|
nsCOMPtr<nsIFile> mProfileStorageFile;
|
2008-11-19 09:11:30 +03:00
|
|
|
|
2013-09-20 02:52:30 +04:00
|
|
|
nsCOMPtr<nsIMemoryReporter> mStorageSQLiteReporter;
|
2012-01-03 12:27:05 +04:00
|
|
|
|
2009-03-31 18:26:16 +04:00
|
|
|
static Service* gService;
|
2021-08-10 19:01:18 +03:00
|
|
|
|
|
|
|
mozilla::intl::Collator::Sensitivity mLastSensitivity;
|
2004-10-09 04:04:10 +04:00
|
|
|
};
|
|
|
|
|
2023-06-24 13:11:28 +03:00
|
|
|
} // namespace mozilla::storage
|
2009-03-31 18:26:16 +04:00
|
|
|
|
2010-06-01 16:38:00 +04:00
|
|
|
#endif /* MOZSTORAGESERVICE_H */
|