1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
// 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/dcheck_is_on.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(InternalApiToken());
}
}
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(InternalApiToken());
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(InternalApiToken());
}
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(InternalApiToken());
}
} // namespace sql
|