fune/dom/cache/Connection.cpp
Marco Bonardo 497899ec5d Bug 1855455 - Implement a loadExtension() API in mozStorage. r=asuth
The API can only load from a predetermined list of extensions statically built
in the same library as SQLite (either nss3 or mozsqlite3 at this time).
New extensions must be audited and their code updated through the update.sh
script.
All the extensions should be compilable and usable across all the tier1
platforms and from Rusqlite.

Differential Revision: https://phabricator.services.mozilla.com/D191316
2023-11-21 08:34:35 +00:00

284 lines
7.8 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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/. */
#include "mozilla/dom/cache/Connection.h"
#include "mozilla/dom/cache/DBSchema.h"
#include "mozStorageHelper.h"
namespace mozilla::dom::cache {
using mozilla::dom::quota::QuotaObject;
NS_IMPL_ISUPPORTS(cache::Connection, mozIStorageAsyncConnection,
mozIStorageConnection);
Connection::Connection(mozIStorageConnection* aBase)
: mBase(aBase), mClosed(false) {
MOZ_DIAGNOSTIC_ASSERT(mBase);
}
Connection::~Connection() {
NS_ASSERT_OWNINGTHREAD(Connection);
MOZ_ALWAYS_SUCCEEDS(Close());
}
NS_IMETHODIMP
Connection::Close() {
NS_ASSERT_OWNINGTHREAD(Connection);
if (mClosed) {
return NS_OK;
}
mClosed = true;
// If we are closing here, then Cache must not have a transaction
// open anywhere else. This may fail if storage is corrupted.
Unused << NS_WARN_IF(NS_FAILED(db::IncrementalVacuum(*this)));
return mBase->Close();
}
// The following methods are all boilerplate that either forward to the
// base connection or block the method. All the async execution methods
// are blocked because Cache does not use them and they would require more
// work to wrap properly.
// mozIStorageAsyncConnection methods
NS_IMETHODIMP
Connection::AsyncVacuum(mozIStorageCompletionCallback*, bool, int32_t) {
// async methods are not supported
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
Connection::AsyncClose(mozIStorageCompletionCallback*) {
// async methods are not supported
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
Connection::SpinningSynchronousClose() {
// not supported
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
Connection::AsyncClone(bool, mozIStorageCompletionCallback*) {
// async methods are not supported
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
Connection::GetDatabaseFile(nsIFile** aFileOut) {
return mBase->GetDatabaseFile(aFileOut);
}
NS_IMETHODIMP
Connection::CreateAsyncStatement(const nsACString&,
mozIStorageAsyncStatement**) {
// async methods are not supported
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
Connection::ExecuteAsync(const nsTArray<RefPtr<mozIStorageBaseStatement>>&,
mozIStorageStatementCallback*,
mozIStoragePendingStatement**) {
// async methods are not supported
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
Connection::ExecuteSimpleSQLAsync(const nsACString&,
mozIStorageStatementCallback*,
mozIStoragePendingStatement**) {
// async methods are not supported
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
Connection::CreateFunction(const nsACString& aFunctionName,
int32_t aNumArguments,
mozIStorageFunction* aFunction) {
// async methods are not supported
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
Connection::RemoveFunction(const nsACString& aFunctionName) {
return mBase->RemoveFunction(aFunctionName);
}
NS_IMETHODIMP
Connection::SetProgressHandler(int32_t aGranularity,
mozIStorageProgressHandler* aHandler,
mozIStorageProgressHandler** aHandlerOut) {
return mBase->SetProgressHandler(aGranularity, aHandler, aHandlerOut);
}
NS_IMETHODIMP
Connection::RemoveProgressHandler(mozIStorageProgressHandler** aHandlerOut) {
return mBase->RemoveProgressHandler(aHandlerOut);
}
// mozIStorageConnection methods
NS_IMETHODIMP
Connection::Clone(bool aReadOnly, mozIStorageConnection** aConnectionOut) {
nsCOMPtr<mozIStorageConnection> conn;
nsresult rv = mBase->Clone(aReadOnly, getter_AddRefs(conn));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
nsCOMPtr<mozIStorageConnection> wrapped = new Connection(conn);
wrapped.forget(aConnectionOut);
return rv;
}
NS_IMETHODIMP
Connection::Interrupt() { return mBase->Interrupt(); }
NS_IMETHODIMP
Connection::GetDefaultPageSize(int32_t* aSizeOut) {
return mBase->GetDefaultPageSize(aSizeOut);
}
NS_IMETHODIMP
Connection::GetConnectionReady(bool* aReadyOut) {
return mBase->GetConnectionReady(aReadyOut);
}
NS_IMETHODIMP
Connection::GetLastInsertRowID(int64_t* aRowIdOut) {
return mBase->GetLastInsertRowID(aRowIdOut);
}
NS_IMETHODIMP
Connection::GetAffectedRows(int32_t* aCountOut) {
return mBase->GetAffectedRows(aCountOut);
}
NS_IMETHODIMP
Connection::GetLastError(int32_t* aErrorOut) {
return mBase->GetLastError(aErrorOut);
}
NS_IMETHODIMP
Connection::GetLastErrorString(nsACString& aErrorOut) {
return mBase->GetLastErrorString(aErrorOut);
}
NS_IMETHODIMP
Connection::GetSchemaVersion(int32_t* aVersionOut) {
return mBase->GetSchemaVersion(aVersionOut);
}
NS_IMETHODIMP
Connection::SetSchemaVersion(int32_t aVersion) {
return mBase->SetSchemaVersion(aVersion);
}
NS_IMETHODIMP
Connection::CreateStatement(const nsACString& aQuery,
mozIStorageStatement** aStatementOut) {
return mBase->CreateStatement(aQuery, aStatementOut);
}
NS_IMETHODIMP
Connection::ExecuteSimpleSQL(const nsACString& aQuery) {
return mBase->ExecuteSimpleSQL(aQuery);
}
NS_IMETHODIMP
Connection::TableExists(const nsACString& aTableName, bool* aExistsOut) {
return mBase->TableExists(aTableName, aExistsOut);
}
NS_IMETHODIMP
Connection::IndexExists(const nsACString& aIndexName, bool* aExistsOut) {
return mBase->IndexExists(aIndexName, aExistsOut);
}
NS_IMETHODIMP
Connection::GetTransactionInProgress(bool* aResultOut) {
return mBase->GetTransactionInProgress(aResultOut);
}
NS_IMETHODIMP
Connection::GetDefaultTransactionType(int32_t* aResultOut) {
return mBase->GetDefaultTransactionType(aResultOut);
}
NS_IMETHODIMP
Connection::SetDefaultTransactionType(int32_t aType) {
return mBase->SetDefaultTransactionType(aType);
}
NS_IMETHODIMP
Connection::GetVariableLimit(int32_t* aResultOut) {
return mBase->GetVariableLimit(aResultOut);
}
NS_IMETHODIMP
Connection::BeginTransaction() { return mBase->BeginTransaction(); }
NS_IMETHODIMP
Connection::CommitTransaction() { return mBase->CommitTransaction(); }
NS_IMETHODIMP
Connection::RollbackTransaction() { return mBase->RollbackTransaction(); }
NS_IMETHODIMP
Connection::CreateTable(const char* aTable, const char* aSchema) {
return mBase->CreateTable(aTable, aSchema);
}
NS_IMETHODIMP
Connection::SetGrowthIncrement(int32_t aIncrement,
const nsACString& aDatabase) {
return mBase->SetGrowthIncrement(aIncrement, aDatabase);
}
NS_IMETHODIMP
Connection::LoadExtension(const nsACString& aExtensionName,
mozIStorageCompletionCallback* aCallback) {
return mBase->LoadExtension(aExtensionName, aCallback);
}
NS_IMETHODIMP
Connection::EnableModule(const nsACString& aModule) {
return mBase->EnableModule(aModule);
}
NS_IMETHODIMP
Connection::GetQuotaObjects(QuotaObject** aDatabaseQuotaObject,
QuotaObject** aJournalQuotaObject) {
return mBase->GetQuotaObjects(aDatabaseQuotaObject, aJournalQuotaObject);
}
mozilla::storage::SQLiteMutex& Connection::GetSharedDBMutex() {
return mBase->GetSharedDBMutex();
}
uint32_t Connection::GetTransactionNestingLevel(
const mozilla::storage::SQLiteMutexAutoLock& aProofOfLock) {
return mBase->GetTransactionNestingLevel(aProofOfLock);
}
uint32_t Connection::IncreaseTransactionNestingLevel(
const mozilla::storage::SQLiteMutexAutoLock& aProofOfLock) {
return mBase->IncreaseTransactionNestingLevel(aProofOfLock);
}
uint32_t Connection::DecreaseTransactionNestingLevel(
const mozilla::storage::SQLiteMutexAutoLock& aProofOfLock) {
return mBase->DecreaseTransactionNestingLevel(aProofOfLock);
}
} // namespace mozilla::dom::cache