diff --git a/dom/indexedDB/IDBTransactionRequest.cpp b/dom/indexedDB/IDBTransactionRequest.cpp index 056a040b8fd..68a177c4a80 100644 --- a/dom/indexedDB/IDBTransactionRequest.cpp +++ b/dom/indexedDB/IDBTransactionRequest.cpp @@ -209,6 +209,22 @@ IDBTransactionRequest::ReleaseSavepoint() return NS_OK; } +void +IDBTransactionRequest::RollbackSavepoint() +{ + NS_PRECONDITION(!NS_IsMainThread(), "Wrong thread!"); + NS_PRECONDITION(mConnection, "No connection!"); + + NS_ASSERTION(mSavepointCount == 1, "Mismatch!"); + mSavepointCount = 0; + + // TODO try to cache this statement + NS_NAMED_LITERAL_CSTRING(savepoint, "ROLLBACK TO " SAVEPOINT_INTERMEDIATE); + if (NS_FAILED(mConnection->ExecuteSimpleSQL(savepoint))) { + NS_ERROR("Rollback failed!"); + } +} + nsresult IDBTransactionRequest::GetOrCreateConnection(mozIStorageConnection** aResult) { diff --git a/dom/indexedDB/IDBTransactionRequest.h b/dom/indexedDB/IDBTransactionRequest.h index a21081d6a8d..a09868f5d33 100644 --- a/dom/indexedDB/IDBTransactionRequest.h +++ b/dom/indexedDB/IDBTransactionRequest.h @@ -88,6 +88,7 @@ public: bool StartSavepoint(); nsresult ReleaseSavepoint(); + void RollbackSavepoint(); already_AddRefed AddStatement(bool aCreate, bool aOverwrite, diff --git a/dom/indexedDB/Savepoint.h b/dom/indexedDB/Savepoint.h index 34e5b31043c..a484637969a 100644 --- a/dom/indexedDB/Savepoint.h +++ b/dom/indexedDB/Savepoint.h @@ -53,13 +53,17 @@ public: : mTransaction(aTransaction) , mHasSavepoint(false) { + NS_ASSERTION(mTransaction, "Null pointer!"); + mHasSavepoint = mTransaction->StartSavepoint(); NS_WARN_IF_FALSE(mHasSavepoint, "Failed to make savepoint!"); } ~Savepoint() { - Release(); + if (mHasSavepoint) { + mTransaction->RollbackSavepoint(); + } } nsresult Release()