// Copyright 2011 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "sql/transaction.h" #include "base/check.h" #include "base/sequence_checker.h" #include "sql/database.h" #include "sql/internal_api_token.h" namespace sql { Transaction::Transaction(Database* database) { CHECK(database); database_ = database->GetWeakPtr(InternalApiToken{}); } Transaction::~Transaction() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); #if DCHECK_IS_ON() DCHECK(begin_called_) << "Begin() not called immediately after Transaction creation"; #endif // DCHECK_IS_ON() if (is_active_ && database_ && database_->is_open()) database_->RollbackTransaction(); } bool Transaction::Begin() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); #if DCHECK_IS_ON() DCHECK(!begin_called_) << __func__ << " already called"; begin_called_ = true; #endif // DCHECK_IS_ON() DCHECK(!is_active_); if (!database_) { return false; } is_active_ = database_->BeginTransaction(); return is_active_; } void Transaction::Rollback() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); #if DCHECK_IS_ON() DCHECK(begin_called_) << __func__ << " called before Begin()"; DCHECK(!commit_called_) << __func__ << " called after Commit()"; DCHECK(!rollback_called_) << __func__ << " called twice"; rollback_called_ = true; #endif // DCHECK_IS_ON() DCHECK(is_active_) << __func__ << " called after Begin() failed"; is_active_ = false; if (!database_) { return; } database_->RollbackTransaction(); } bool Transaction::Commit() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); #if DCHECK_IS_ON() DCHECK(begin_called_) << __func__ << " called before Begin()"; DCHECK(!rollback_called_) << __func__ << " called after Rollback()"; DCHECK(!commit_called_) << __func__ << " called after Commit()"; commit_called_ = true; #endif // DCHECK_IS_ON() DCHECK(is_active_) << __func__ << " called after Begin() failed"; is_active_ = false; if (!database_) { return false; } return database_->CommitTransaction(); } } // namespace sql