Diff
Modified: trunk/Source/WebCore/ChangeLog (204355 => 204356)
--- trunk/Source/WebCore/ChangeLog 2016-08-10 21:25:28 UTC (rev 204355)
+++ trunk/Source/WebCore/ChangeLog 2016-08-10 21:31:07 UTC (rev 204356)
@@ -1,5 +1,54 @@
2016-08-10 Anders Carlsson <ander...@apple.com>
+ Begin moving member functions from SQLTransactionBackend to SQLTransaction
+ https://bugs.webkit.org/show_bug.cgi?id=160747
+
+ Reviewed by Tim Horton.
+
+ * Modules/webdatabase/Database.cpp:
+ (WebCore::Database::performClose):
+ * Modules/webdatabase/DatabaseTask.cpp:
+ (WebCore::DatabaseTransactionTask::~DatabaseTransactionTask):
+ (WebCore::DatabaseTransactionTask::doPerformTask):
+ * Modules/webdatabase/SQLTransaction.cpp:
+ (WebCore::SQLTransaction::executeSQL):
+ (WebCore::SQLTransaction::lockAcquired):
+ (WebCore::SQLTransaction::performNextStep):
+ (WebCore::SQLTransaction::performPendingCallback):
+ (WebCore::SQLTransaction::notifyDatabaseThreadIsShuttingDown):
+ (WebCore::SQLTransaction::enqueueStatement):
+ (WebCore::SQLTransaction::getNextStatement):
+ (WebCore::SQLTransaction::runCurrentStatement):
+ (WebCore::SQLTransaction::handleCurrentStatementError):
+ (WebCore::SQLTransaction::handleTransactionError):
+ (WebCore::SQLTransaction::postflightAndCommit):
+ (WebCore::SQLTransaction::acquireOriginLock):
+ (WebCore::SQLTransaction::releaseOriginLockIfNeeded):
+ * Modules/webdatabase/SQLTransaction.h:
+ (WebCore::SQLTransaction::backend): Deleted.
+ * Modules/webdatabase/SQLTransactionBackend.cpp:
+ (WebCore::SQLTransactionBackend::doCleanup):
+ (WebCore::SQLTransactionBackend::openTransactionAndPreflight):
+ (WebCore::SQLTransactionBackend::runStatements):
+ (WebCore::SQLTransactionBackend::cleanupAfterTransactionErrorCallback):
+ (WebCore::SQLTransactionBackend::enqueueStatement): Deleted.
+ (WebCore::SQLTransactionBackend::performNextStep): Deleted.
+ (WebCore::SQLTransactionBackend::executeSQL): Deleted.
+ (WebCore::SQLTransactionBackend::lockAcquired): Deleted.
+ (WebCore::SQLTransactionBackend::getNextStatement): Deleted.
+ (WebCore::SQLTransactionBackend::runCurrentStatement): Deleted.
+ (WebCore::SQLTransactionBackend::handleCurrentStatementError): Deleted.
+ (WebCore::SQLTransactionBackend::handleTransactionError): Deleted.
+ (WebCore::SQLTransactionBackend::postflightAndCommit): Deleted.
+ (WebCore::SQLTransactionBackend::acquireOriginLock): Deleted.
+ (WebCore::SQLTransactionBackend::releaseOriginLockIfNeeded): Deleted.
+ * Modules/webdatabase/SQLTransactionBackend.h:
+ * Modules/webdatabase/SQLTransactionCoordinator.cpp:
+ (WebCore::SQLTransactionCoordinator::processPendingTransactions):
+ (WebCore::SQLTransactionCoordinator::shutdown):
+
+2016-08-10 Anders Carlsson <ander...@apple.com>
+
Move all SQLTransactionBackend member variables to SQLTransaction
https://bugs.webkit.org/show_bug.cgi?id=160745
Modified: trunk/Source/WebCore/Modules/webdatabase/Database.cpp (204355 => 204356)
--- trunk/Source/WebCore/Modules/webdatabase/Database.cpp 2016-08-10 21:25:28 UTC (rev 204355)
+++ trunk/Source/WebCore/Modules/webdatabase/Database.cpp 2016-08-10 21:31:07 UTC (rev 204356)
@@ -314,7 +314,7 @@
// transaction is interrupted?" at the top of SQLTransactionBackend.cpp.
while (!m_transactionQueue.isEmpty()) {
auto transaction = m_transactionQueue.takeFirst();
- transaction->backend().notifyDatabaseThreadIsShuttingDown();
+ transaction->notifyDatabaseThreadIsShuttingDown();
}
m_isTransactionQueueEnabled = false;
Modified: trunk/Source/WebCore/Modules/webdatabase/DatabaseTask.cpp (204355 => 204356)
--- trunk/Source/WebCore/Modules/webdatabase/DatabaseTask.cpp 2016-08-10 21:25:28 UTC (rev 204355)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseTask.cpp 2016-08-10 21:31:07 UTC (rev 204356)
@@ -163,12 +163,12 @@
// transaction is interrupted?" at the top of SQLTransactionBackend.cpp.
if (!m_didPerformTask)
- m_transaction->backend().notifyDatabaseThreadIsShuttingDown();
+ m_transaction->notifyDatabaseThreadIsShuttingDown();
}
void DatabaseTransactionTask::doPerformTask()
{
- m_transaction->backend().performNextStep();
+ m_transaction->performNextStep();
m_didPerformTask = true;
}
Modified: trunk/Source/WebCore/Modules/webdatabase/SQLTransaction.cpp (204355 => 204356)
--- trunk/Source/WebCore/Modules/webdatabase/SQLTransaction.cpp 2016-08-10 21:25:28 UTC (rev 204355)
+++ trunk/Source/WebCore/Modules/webdatabase/SQLTransaction.cpp 2016-08-10 21:31:07 UTC (rev 204356)
@@ -32,6 +32,7 @@
#include "Database.h"
#include "DatabaseAuthorizer.h"
#include "DatabaseContext.h"
+#include "DatabaseTracker.h"
#include "ExceptionCode.h"
#include "Logging.h"
#include "OriginLock.h"
@@ -75,6 +76,58 @@
{
}
+void SQLTransaction::executeSQL(const String& sqlStatement, const Vector<SQLValue>& arguments, RefPtr<SQLStatementCallback>&& callback, RefPtr<SQLStatementErrorCallback>&& callbackError, ExceptionCode& ec)
+{
+ if (!m_executeSqlAllowed || !m_database->opened()) {
+ ec = INVALID_STATE_ERR;
+ return;
+ }
+
+ int permissions = DatabaseAuthorizer::ReadWriteMask;
+ if (!m_database->databaseContext()->allowDatabaseAccess())
+ permissions |= DatabaseAuthorizer::NoAccessMask;
+ else if (m_readOnly)
+ permissions |= DatabaseAuthorizer::ReadOnlyMask;
+
+ auto statement = std::make_unique<SQLStatement>(m_database, sqlStatement, arguments, WTFMove(callback), WTFMove(callbackError), permissions);
+
+ if (m_database->deleted())
+ statement->setDatabaseDeletedError();
+
+ enqueueStatement(WTFMove(statement));
+}
+
+void SQLTransaction::lockAcquired()
+{
+ m_lockAcquired = true;
+
+ m_backend.m_requestedState = SQLTransactionState::OpenTransactionAndPreflight;
+ m_database->scheduleTransactionStep(*this);
+}
+
+void SQLTransaction::performNextStep()
+{
+ m_backend.computeNextStateAndCleanupIfNeeded();
+ m_backend.runStateMachine();
+}
+
+void SQLTransaction::performPendingCallback()
+{
+ computeNextStateAndCleanupIfNeeded();
+ runStateMachine();
+}
+
+void SQLTransaction::notifyDatabaseThreadIsShuttingDown()
+{
+ m_backend.notifyDatabaseThreadIsShuttingDown();
+}
+
+void SQLTransaction::enqueueStatement(std::unique_ptr<SQLStatement> statement)
+{
+ LockHolder locker(m_statementMutex);
+ m_statementQueue.append(WTFMove(statement));
+}
+
SQLTransaction::StateFunction SQLTransaction::stateFunctionFor(SQLTransactionState state)
{
static const StateFunction stateFunctions[] = {
@@ -203,29 +256,6 @@
ASSERT_NOT_REACHED();
}
-void SQLTransaction::performPendingCallback()
-{
- computeNextStateAndCleanupIfNeeded();
- runStateMachine();
-}
-
-void SQLTransaction::executeSQL(const String& sqlStatement, const Vector<SQLValue>& arguments, RefPtr<SQLStatementCallback>&& callback, RefPtr<SQLStatementErrorCallback>&& callbackError, ExceptionCode& ec)
-{
- if (!m_executeSqlAllowed || !m_database->opened()) {
- ec = INVALID_STATE_ERR;
- return;
- }
-
- int permissions = DatabaseAuthorizer::ReadWriteMask;
- if (!m_database->databaseContext()->allowDatabaseAccess())
- permissions |= DatabaseAuthorizer::NoAccessMask;
- else if (m_readOnly)
- permissions |= DatabaseAuthorizer::ReadOnlyMask;
-
- auto statement = std::make_unique<SQLStatement>(m_database, sqlStatement, arguments, WTFMove(callback), WTFMove(callbackError), permissions);
- m_backend.executeSQL(WTFMove(statement));
-}
-
void SQLTransaction::computeNextStateAndCleanupIfNeeded()
{
// Only honor the requested state transition if we're not supposed to be
@@ -255,4 +285,139 @@
m_errorCallbackWrapper.clear();
}
+void SQLTransaction::getNextStatement()
+{
+ m_currentStatement = nullptr;
+
+ LockHolder locker(m_statementMutex);
+ if (!m_statementQueue.isEmpty())
+ m_currentStatement = m_statementQueue.takeFirst();
+}
+
+bool SQLTransaction::runCurrentStatement()
+{
+ if (!m_currentStatement) {
+ // No more statements to run. So move on to the next state.
+ return false;
+ }
+
+ m_database->resetAuthorizer();
+
+ if (m_hasVersionMismatch)
+ m_currentStatement->setVersionMismatchedError();
+
+ if (m_currentStatement->execute(m_database)) {
+ if (m_database->lastActionChangedDatabase()) {
+ // Flag this transaction as having changed the database for later delegate notification
+ m_modifiedDatabase = true;
+ }
+
+ if (m_currentStatement->hasStatementCallback()) {
+ requestTransitToState(SQLTransactionState::DeliverStatementCallback);
+ return false;
+ }
+
+ // If we get here, then the statement doesn't have a callback to invoke.
+ // We can move on to the next statement. Hence, stay in this state.
+ return true;
+ }
+
+ if (m_currentStatement->lastExecutionFailedDueToQuota()) {
+ requestTransitToState(SQLTransactionState::DeliverQuotaIncreaseCallback);
+ return false;
+ }
+
+ handleCurrentStatementError();
+ return false;
+}
+
+void SQLTransaction::handleCurrentStatementError()
+{
+ // Spec 4.3.2.6.6: error - Call the statement's error callback, but if there was no error callback,
+ // or the transaction was rolled back, jump to the transaction error callback
+ if (m_currentStatement->hasStatementErrorCallback() && !m_sqliteTransaction->wasRolledBackBySqlite()) {
+ requestTransitToState(SQLTransactionState::DeliverStatementCallback);
+ return;
+ }
+
+ m_transactionError = m_currentStatement->sqlError();
+ if (!m_transactionError)
+ m_transactionError = SQLError::create(SQLError::DATABASE_ERR, "the statement failed to execute");
+
+ handleTransactionError();
+}
+
+void SQLTransaction::handleTransactionError()
+{
+ ASSERT(m_transactionError);
+ if (m_errorCallbackWrapper.hasCallback()) {
+ requestTransitToState(SQLTransactionState::DeliverTransactionErrorCallback);
+ return;
+ }
+
+ // No error callback, so fast-forward to the next state and rollback the
+ // transaction.
+ m_backend.cleanupAfterTransactionErrorCallback();
+}
+
+void SQLTransaction::postflightAndCommit()
+{
+ ASSERT(m_lockAcquired);
+
+ // Spec 4.3.2.7: Perform postflight steps, jumping to the error callback if they fail.
+ if (m_wrapper && !m_wrapper->performPostflight(*this)) {
+ m_transactionError = m_wrapper->sqlError();
+ if (!m_transactionError)
+ m_transactionError = SQLError::create(SQLError::UNKNOWN_ERR, "unknown error occurred during transaction postflight");
+
+ handleTransactionError();
+ return;
+ }
+
+ // Spec 4.3.2.7: Commit the transaction, jumping to the error callback if that fails.
+ ASSERT(m_sqliteTransaction);
+
+ m_database->disableAuthorizer();
+ m_sqliteTransaction->commit();
+ m_database->enableAuthorizer();
+
+ releaseOriginLockIfNeeded();
+
+ // If the commit failed, the transaction will still be marked as "in progress"
+ if (m_sqliteTransaction->inProgress()) {
+ if (m_wrapper)
+ m_wrapper->handleCommitFailedAfterPostflight(*this);
+ m_transactionError = SQLError::create(SQLError::DATABASE_ERR, "unable to commit transaction", m_database->sqliteDatabase().lastError(), m_database->sqliteDatabase().lastErrorMsg());
+
+ handleTransactionError();
+ return;
+ }
+
+ // Vacuum the database if anything was deleted.
+ if (m_database->hadDeletes())
+ m_database->incrementalVacuumIfNeeded();
+
+ // The commit was successful. If the transaction modified this database, notify the delegates.
+ if (m_modifiedDatabase)
+ m_database->transactionClient()->didCommitWriteTransaction(m_database.ptr());
+
+ // Spec 4.3.2.8: Deliver success callback, if there is one.
+ requestTransitToState(SQLTransactionState::DeliverSuccessCallback);
+}
+
+void SQLTransaction::acquireOriginLock()
+{
+ ASSERT(!m_originLock);
+ m_originLock = DatabaseTracker::tracker().originLockFor(m_database->securityOrigin());
+ m_originLock->lock();
+}
+
+void SQLTransaction::releaseOriginLockIfNeeded()
+{
+ if (m_originLock) {
+ m_originLock->unlock();
+ m_originLock = nullptr;
+ }
+}
+
} // namespace WebCore
Modified: trunk/Source/WebCore/Modules/webdatabase/SQLTransaction.h (204355 => 204356)
--- trunk/Source/WebCore/Modules/webdatabase/SQLTransaction.h 2016-08-10 21:25:28 UTC (rev 204355)
+++ trunk/Source/WebCore/Modules/webdatabase/SQLTransaction.h 2016-08-10 21:31:07 UTC (rev 204356)
@@ -64,11 +64,13 @@
void executeSQL(const String& sqlStatement, const Vector<SQLValue>& arguments, RefPtr<SQLStatementCallback>&&, RefPtr<SQLStatementErrorCallback>&&, ExceptionCode&);
+ void lockAcquired();
+ void performNextStep();
void performPendingCallback();
Database& database() { return m_database; }
bool isReadOnly() const { return m_readOnly; }
- SQLTransactionBackend& backend() { return m_backend; }
+ void notifyDatabaseThreadIsShuttingDown();
// APIs called from the backend published via SQLTransaction:
void requestTransitToState(SQLTransactionState);
@@ -78,6 +80,8 @@
SQLTransaction(Ref<Database>&&, RefPtr<SQLTransactionCallback>&&, RefPtr<VoidCallback>&& successCallback, RefPtr<SQLTransactionErrorCallback>&&, RefPtr<SQLTransactionWrapper>&&, bool readOnly);
+ void enqueueStatement(std::unique_ptr<SQLStatement>);
+
void clearCallbackWrappers();
// State Machine functions:
@@ -93,6 +97,15 @@
NO_RETURN_DUE_TO_ASSERT void unreachableState();
+ void getNextStatement();
+ bool runCurrentStatement();
+ void handleCurrentStatementError();
+ void handleTransactionError();
+ void postflightAndCommit();
+
+ void acquireOriginLock();
+ void releaseOriginLockIfNeeded();
+
Ref<Database> m_database;
SQLCallbackWrapper<SQLTransactionCallback> m_callbackWrapper;
SQLCallbackWrapper<VoidCallback> m_successCallbackWrapper;
Modified: trunk/Source/WebCore/Modules/webdatabase/SQLTransactionBackend.cpp (204355 => 204356)
--- trunk/Source/WebCore/Modules/webdatabase/SQLTransactionBackend.cpp 2016-08-10 21:25:28 UTC (rev 204355)
+++ trunk/Source/WebCore/Modules/webdatabase/SQLTransactionBackend.cpp 2016-08-10 21:31:07 UTC (rev 204356)
@@ -358,7 +358,7 @@
{
ASSERT(currentThread() == m_frontend.database().databaseContext()->databaseThread()->getThreadID());
- releaseOriginLockIfNeeded();
+ m_frontend.releaseOriginLockIfNeeded();
LockHolder locker(m_frontend.m_statementMutex);
m_frontend.m_statementQueue.clear();
@@ -426,12 +426,6 @@
return stateFunctions[static_cast<int>(state)];
}
-void SQLTransactionBackend::enqueueStatement(std::unique_ptr<SQLStatement> statement)
-{
- LockHolder locker(m_frontend.m_statementMutex);
- m_frontend.m_statementQueue.append(WTFMove(statement));
-}
-
void SQLTransactionBackend::computeNextStateAndCleanupIfNeeded()
{
// Only honor the requested state transition if we're not supposed to be
@@ -472,20 +466,6 @@
doCleanup();
}
-void SQLTransactionBackend::performNextStep()
-{
- computeNextStateAndCleanupIfNeeded();
- runStateMachine();
-}
-
-void SQLTransactionBackend::executeSQL(std::unique_ptr<SQLStatement> statement)
-{
- if (m_frontend.m_database->deleted())
- statement->setDatabaseDeletedError();
-
- enqueueStatement(WTFMove(statement));
-}
-
void SQLTransactionBackend::notifyDatabaseThreadIsShuttingDown()
{
ASSERT(currentThread() == m_frontend.m_database->databaseContext()->databaseThread()->getThreadID());
@@ -503,15 +483,6 @@
m_frontend.m_database->transactionCoordinator()->acquireLock(m_frontend);
}
-void SQLTransactionBackend::lockAcquired()
-{
- m_frontend.m_lockAcquired = true;
-
- m_requestedState = SQLTransactionState::OpenTransactionAndPreflight;
- ASSERT(m_requestedState != SQLTransactionState::End);
- m_frontend.m_database->scheduleTransactionStep(m_frontend);
-}
-
void SQLTransactionBackend::openTransactionAndPreflight()
{
ASSERT(!m_frontend.m_database->sqliteDatabase().transactionInProgress());
@@ -523,13 +494,13 @@
if (m_frontend.m_database->deleted()) {
m_frontend.m_transactionError = SQLError::create(SQLError::UNKNOWN_ERR, "unable to open a transaction, because the user deleted the database");
- handleTransactionError();
+ m_frontend.handleTransactionError();
return;
}
// Set the maximum usage for this transaction if this transactions is not read-only
if (!m_frontend.m_readOnly) {
- acquireOriginLock();
+ m_frontend.acquireOriginLock();
m_frontend.m_database->sqliteDatabase().setMaximumSize(m_frontend.m_database->maximumSize());
}
@@ -547,7 +518,7 @@
m_frontend.m_transactionError = SQLError::create(SQLError::DATABASE_ERR, "unable to begin transaction", m_frontend.m_database->sqliteDatabase().lastError(), m_frontend.m_database->sqliteDatabase().lastErrorMsg());
m_frontend.m_sqliteTransaction = nullptr;
- handleTransactionError();
+ m_frontend.handleTransactionError();
return;
}
@@ -561,7 +532,7 @@
m_frontend.m_sqliteTransaction = nullptr;
m_frontend.m_database->enableAuthorizer();
- handleTransactionError();
+ m_frontend.handleTransactionError();
return;
}
@@ -576,7 +547,7 @@
if (!m_frontend.m_transactionError)
m_frontend.m_transactionError = SQLError::create(SQLError::UNKNOWN_ERR, "unknown error occurred during transaction preflight");
- handleTransactionError();
+ m_frontend.handleTransactionError();
return;
}
@@ -611,142 +582,22 @@
// If the current statement has already been run, failed due to quota constraints, and we're not retrying it,
// that means it ended in an error. Handle it now
if (m_frontend.m_currentStatement && m_frontend.m_currentStatement->lastExecutionFailedDueToQuota()) {
- handleCurrentStatementError();
+ m_frontend.handleCurrentStatementError();
break;
}
// Otherwise, advance to the next statement
- getNextStatement();
+ m_frontend.getNextStatement();
}
- } while (runCurrentStatement());
+ } while (m_frontend.runCurrentStatement());
// If runCurrentStatement() returned false, that means either there was no current statement to run,
// or the current statement requires a callback to complete. In the later case, it also scheduled
// the callback or performed any other additional work so we can return.
if (!m_frontend.m_currentStatement)
- postflightAndCommit();
+ m_frontend.postflightAndCommit();
}
-void SQLTransactionBackend::getNextStatement()
-{
- m_frontend.m_currentStatement = nullptr;
-
- LockHolder locker(m_frontend.m_statementMutex);
- if (!m_frontend.m_statementQueue.isEmpty())
- m_frontend.m_currentStatement = m_frontend.m_statementQueue.takeFirst();
-}
-
-bool SQLTransactionBackend::runCurrentStatement()
-{
- if (!m_frontend.m_currentStatement) {
- // No more statements to run. So move on to the next state.
- return false;
- }
-
- m_frontend.m_database->resetAuthorizer();
-
- if (m_frontend.m_hasVersionMismatch)
- m_frontend.m_currentStatement->setVersionMismatchedError();
-
- if (m_frontend.m_currentStatement->execute(m_frontend.m_database)) {
- if (m_frontend.m_database->lastActionChangedDatabase()) {
- // Flag this transaction as having changed the database for later delegate notification
- m_frontend.m_modifiedDatabase = true;
- }
-
- if (m_frontend.m_currentStatement->hasStatementCallback()) {
- m_frontend.requestTransitToState(SQLTransactionState::DeliverStatementCallback);
- return false;
- }
-
- // If we get here, then the statement doesn't have a callback to invoke.
- // We can move on to the next statement. Hence, stay in this state.
- return true;
- }
-
- if (m_frontend.m_currentStatement->lastExecutionFailedDueToQuota()) {
- m_frontend.requestTransitToState(SQLTransactionState::DeliverQuotaIncreaseCallback);
- return false;
- }
-
- handleCurrentStatementError();
- return false;
-}
-
-void SQLTransactionBackend::handleCurrentStatementError()
-{
- // Spec 4.3.2.6.6: error - Call the statement's error callback, but if there was no error callback,
- // or the transaction was rolled back, jump to the transaction error callback
- if (m_frontend.m_currentStatement->hasStatementErrorCallback() && !m_frontend.m_sqliteTransaction->wasRolledBackBySqlite()) {
- m_frontend.requestTransitToState(SQLTransactionState::DeliverStatementCallback);
- return;
- }
-
- m_frontend.m_transactionError = m_frontend.m_currentStatement->sqlError();
- if (!m_frontend.m_transactionError)
- m_frontend.m_transactionError = SQLError::create(SQLError::DATABASE_ERR, "the statement failed to execute");
-
- handleTransactionError();
-}
-
-void SQLTransactionBackend::handleTransactionError()
-{
- ASSERT(m_frontend.m_transactionError);
- if (m_frontend.m_errorCallbackWrapper.hasCallback()) {
- m_frontend.requestTransitToState(SQLTransactionState::DeliverTransactionErrorCallback);
- return;
- }
-
- // No error callback, so fast-forward to the next state and rollback the
- // transaction.
- cleanupAfterTransactionErrorCallback();
-}
-
-void SQLTransactionBackend::postflightAndCommit()
-{
- ASSERT(m_frontend.m_lockAcquired);
-
- // Spec 4.3.2.7: Perform postflight steps, jumping to the error callback if they fail.
- if (m_frontend.m_wrapper && !m_frontend.m_wrapper->performPostflight(m_frontend)) {
- m_frontend.m_transactionError = m_frontend.m_wrapper->sqlError();
- if (!m_frontend.m_transactionError)
- m_frontend.m_transactionError = SQLError::create(SQLError::UNKNOWN_ERR, "unknown error occurred during transaction postflight");
-
- handleTransactionError();
- return;
- }
-
- // Spec 4.3.2.7: Commit the transaction, jumping to the error callback if that fails.
- ASSERT(m_frontend.m_sqliteTransaction);
-
- m_frontend.m_database->disableAuthorizer();
- m_frontend.m_sqliteTransaction->commit();
- m_frontend.m_database->enableAuthorizer();
-
- releaseOriginLockIfNeeded();
-
- // If the commit failed, the transaction will still be marked as "in progress"
- if (m_frontend.m_sqliteTransaction->inProgress()) {
- if (m_frontend.m_wrapper)
- m_frontend.m_wrapper->handleCommitFailedAfterPostflight(m_frontend);
- m_frontend.m_transactionError = SQLError::create(SQLError::DATABASE_ERR, "unable to commit transaction", m_frontend.m_database->sqliteDatabase().lastError(), m_frontend.m_database->sqliteDatabase().lastErrorMsg());
-
- handleTransactionError();
- return;
- }
-
- // Vacuum the database if anything was deleted.
- if (m_frontend.m_database->hadDeletes())
- m_frontend.m_database->incrementalVacuumIfNeeded();
-
- // The commit was successful. If the transaction modified this database, notify the delegates.
- if (m_frontend.m_modifiedDatabase)
- m_frontend.m_database->transactionClient()->didCommitWriteTransaction(m_frontend.m_database.ptr());
-
- // Spec 4.3.2.8: Deliver success callback, if there is one.
- m_frontend.requestTransitToState(SQLTransactionState::DeliverSuccessCallback);
-}
-
void SQLTransactionBackend::cleanupAndTerminate()
{
ASSERT(m_frontend.m_lockAcquired);
@@ -775,7 +626,7 @@
}
m_frontend.m_database->enableAuthorizer();
- releaseOriginLockIfNeeded();
+ m_frontend.releaseOriginLockIfNeeded();
ASSERT(!m_frontend.m_database->sqliteDatabase().transactionInProgress());
@@ -801,19 +652,4 @@
ASSERT_NOT_REACHED();
}
-void SQLTransactionBackend::acquireOriginLock()
-{
- ASSERT(!m_frontend.m_originLock);
- m_frontend.m_originLock = DatabaseTracker::tracker().originLockFor(m_frontend.m_database->securityOrigin());
- m_frontend.m_originLock->lock();
-}
-
-void SQLTransactionBackend::releaseOriginLockIfNeeded()
-{
- if (m_frontend.m_originLock) {
- m_frontend.m_originLock->unlock();
- m_frontend.m_originLock = nullptr;
- }
-}
-
} // namespace WebCore
Modified: trunk/Source/WebCore/Modules/webdatabase/SQLTransactionBackend.h (204355 => 204356)
--- trunk/Source/WebCore/Modules/webdatabase/SQLTransactionBackend.h 2016-08-10 21:25:28 UTC (rev 204355)
+++ trunk/Source/WebCore/Modules/webdatabase/SQLTransactionBackend.h 2016-08-10 21:31:07 UTC (rev 204356)
@@ -52,21 +52,16 @@
explicit SQLTransactionBackend(SQLTransaction&);
~SQLTransactionBackend();
- void lockAcquired();
- void performNextStep();
-
void notifyDatabaseThreadIsShuttingDown();
- // APIs called from the frontend published via SQLTransactionBackend:
+ // API called from the frontend published via SQLTransactionBackend:
void requestTransitToState(SQLTransactionState);
- void executeSQL(std::unique_ptr<SQLStatement>);
-
+
private:
+ friend class SQLTransaction;
void doCleanup();
- void enqueueStatement(std::unique_ptr<SQLStatement>);
-
// State Machine functions:
StateFunction stateFunctionFor(SQLTransactionState) override;
void computeNextStateAndCleanupIfNeeded();
@@ -80,15 +75,6 @@
NO_RETURN_DUE_TO_ASSERT void unreachableState();
- void getNextStatement();
- bool runCurrentStatement();
- void handleCurrentStatementError();
- void handleTransactionError();
- void postflightAndCommit();
-
- void acquireOriginLock();
- void releaseOriginLockIfNeeded();
-
SQLTransaction& m_frontend;
};
Modified: trunk/Source/WebCore/Modules/webdatabase/SQLTransactionCoordinator.cpp (204355 => 204356)
--- trunk/Source/WebCore/Modules/webdatabase/SQLTransactionCoordinator.cpp 2016-08-10 21:25:28 UTC (rev 204355)
+++ trunk/Source/WebCore/Modules/webdatabase/SQLTransactionCoordinator.cpp 2016-08-10 21:31:07 UTC (rev 204356)
@@ -62,12 +62,12 @@
do {
firstPendingTransaction = info.pendingTransactions.takeFirst();
info.activeReadTransactions.add(firstPendingTransaction);
- firstPendingTransaction->backend().lockAcquired();
+ firstPendingTransaction->lockAcquired();
} while (!info.pendingTransactions.isEmpty() && info.pendingTransactions.first()->isReadOnly());
} else if (info.activeReadTransactions.isEmpty()) {
info.pendingTransactions.removeFirst();
info.activeWriteTransaction = firstPendingTransaction;
- firstPendingTransaction->backend().lockAcquired();
+ firstPendingTransaction->lockAcquired();
}
}
@@ -122,9 +122,9 @@
// Transaction phase 4 cleanup. See comment on "What happens if a
// transaction is interrupted?" at the top of SQLTransactionBackend.cpp.
if (info.activeWriteTransaction)
- info.activeWriteTransaction->backend().notifyDatabaseThreadIsShuttingDown();
+ info.activeWriteTransaction->notifyDatabaseThreadIsShuttingDown();
for (auto& transaction : info.activeReadTransactions)
- transaction->backend().notifyDatabaseThreadIsShuttingDown();
+ transaction->notifyDatabaseThreadIsShuttingDown();
// Clean up transactions that have NOT reached "lockAcquired":
// Transaction phase 3 cleanup. See comment on "What happens if a
@@ -131,7 +131,7 @@
// transaction is interrupted?" at the top of SQLTransactionBackend.cpp.
while (!info.pendingTransactions.isEmpty()) {
RefPtr<SQLTransaction> transaction = info.pendingTransactions.first();
- transaction->backend().notifyDatabaseThreadIsShuttingDown();
+ transaction->notifyDatabaseThreadIsShuttingDown();
}
}