Title: [204356] trunk/Source/WebCore
Revision
204356
Author
ander...@apple.com
Date
2016-08-10 14:31:07 -0700 (Wed, 10 Aug 2016)

Log Message

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):

Modified Paths

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();
         }
     }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to