// Copyright 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef COMPONENTS_SQLITE_PROTO_TABLE_MANAGER_H_ #define COMPONENTS_SQLITE_PROTO_TABLE_MANAGER_H_ #include "base/callback.h" #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/synchronization/atomic_flag.h" namespace base { class Location; class SequencedTaskRunner; } // namespace base namespace sql { class Database; } namespace sqlite_proto { // Base class encapsulating database operation scheduling and management, scoped // to a collection of tables (possibly, but not necessarily, all of the // database's tables). // // Refcounted as it is created and destroyed in the main thread (e.g., the UI // thread in the browser process) but all database related functions need to // happen in the database sequence. The task runner for this sequence is // provided by the client to the constructor of this class. class TableManager : public base::RefCountedThreadSafe { public: // Returns a SequencedTaskRunner that is used to run tasks on the DB sequence. base::SequencedTaskRunner* GetTaskRunner(); TableManager(const TableManager&) = delete; TableManager& operator=(const TableManager&) = delete; virtual void ScheduleDBTask(const base::Location& from_here, base::OnceCallback task); virtual void ExecuteDBTaskOnDBSequence( base::OnceCallback task); protected: explicit TableManager( scoped_refptr db_task_runner); virtual ~TableManager(); // DB sequence functions. virtual void CreateTablesIfNonExistent() = 0; virtual void LogDatabaseStats() = 0; void Initialize(sql::Database* db); void SetCancelled(); bool IsCancelled(); sql::Database* DB(); void ResetDB(); bool CantAccessDatabase(); private: base::AtomicFlag cancelled_; friend class base::RefCountedThreadSafe; scoped_refptr db_task_runner_; sql::Database* db_; }; } // namespace sqlite_proto #endif // COMPONENTS_SQLITE_PROTO_TABLE_MANAGER_H_