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 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/sqlite_proto/table_manager.h"
#include <utility>
#include "base/check.h"
#include "base/functional/bind.h"
#include "base/task/sequenced_task_runner.h"
#include "sql/database.h"
namespace sqlite_proto {
using DBTask = base::OnceCallback<void(sql::Database*)>;
base::SequencedTaskRunner* TableManager::GetTaskRunner() {
return db_task_runner_.get();
}
void TableManager::ScheduleDBTask(const base::Location& from_here,
DBTask task) {
GetTaskRunner()->PostTask(
from_here, base::BindOnce(&TableManager::ExecuteDBTaskOnDBSequence, this,
std::move(task)));
}
void TableManager::ScheduleDBTaskWithReply(const base::Location& from_here,
DBTask task,
base::OnceClosure reply) {
GetTaskRunner()->PostTaskAndReply(
from_here,
base::BindOnce(&TableManager::ExecuteDBTaskOnDBSequence, this,
std::move(task)),
std::move(reply));
}
void TableManager::ExecuteDBTaskOnDBSequence(DBTask task) {
DCHECK(GetTaskRunner()->RunsTasksInCurrentSequence());
if (CantAccessDatabase())
return;
std::move(task).Run(DB());
}
TableManager::TableManager(
scoped_refptr<base::SequencedTaskRunner> db_task_runner)
: db_task_runner_(std::move(db_task_runner)), db_(nullptr) {}
TableManager::~TableManager() = default;
void TableManager::Initialize(sql::Database* db) {
DCHECK(db_task_runner_->RunsTasksInCurrentSequence());
db_ = db;
CreateOrClearTablesIfNecessary();
}
void TableManager::SetCancelled() {
cancelled_.Set();
}
bool TableManager::IsCancelled() {
return cancelled_.IsSet();
}
sql::Database* TableManager::DB() {
DCHECK(db_task_runner_->RunsTasksInCurrentSequence());
return db_;
}
void TableManager::ResetDB() {
DCHECK(db_task_runner_->RunsTasksInCurrentSequence());
db_ = nullptr;
}
bool TableManager::CantAccessDatabase() {
DCHECK(db_task_runner_->RunsTasksInCurrentSequence());
return cancelled_.IsSet() || !db_;
}
} // namespace sqlite_proto
|