// Copyright 2014 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_LEVELDB_PROTO_PROTO_DATABASE_H_ #define COMPONENTS_LEVELDB_PROTO_PROTO_DATABASE_H_ #include #include #include "base/sequenced_task_runner.h" #include "base/threading/thread_checker.h" #include "components/leveldb_proto/leveldb_database.h" #include "components/leveldb_proto/proto_leveldb_wrapper.h" namespace leveldb_proto { // Interface for classes providing persistent storage of Protocol Buffer // entries (T must be a Proto type extending MessageLite). template class ProtoDatabase { public: using InitCallback = base::OnceCallback; using UpdateCallback = base::OnceCallback; using LoadCallback = base::OnceCallback>)>; using LoadKeysCallback = base::OnceCallback>)>; using LoadKeysAndEntriesCallback = base::OnceCallback>)>; using GetCallback = base::OnceCallback)>; using DestroyCallback = base::OnceCallback; // A list of key-value (string, T) tuples. using KeyEntryVector = std::vector>; explicit ProtoDatabase( const scoped_refptr& task_runner) : db_wrapper_(std::make_unique(task_runner)) {} virtual ~ProtoDatabase() {} // Asynchronously initializes the object with the specified |options|. // |callback| will be invoked on the calling thread when complete. virtual void Init(const char* client_name, const base::FilePath& database_dir, const leveldb_env::Options& options, typename ProtoDatabase::InitCallback callback) = 0; virtual void InitWithDatabase(LevelDB* database, const base::FilePath& database_dir, const leveldb_env::Options& options, InitCallback callback) { db_wrapper_->InitWithDatabase(database, database_dir, options, std::move(callback)); } // Asynchronously saves |entries_to_save| and deletes entries from // |keys_to_remove| from the database. |callback| will be invoked on the // calling thread when complete. virtual void UpdateEntries( std::unique_ptr entries_to_save, std::unique_ptr> keys_to_remove, UpdateCallback callback) { db_wrapper_->template UpdateEntries(std::move(entries_to_save), std::move(keys_to_remove), std::move(callback)); } // Asynchronously saves |entries_to_save| and deletes entries that satisfies // the |delete_key_filter| from the database. |callback| will be invoked on // the calling thread when complete. The filter will be called on // ProtoDatabase's taskrunner. virtual void UpdateEntriesWithRemoveFilter( std::unique_ptr entries_to_save, const LevelDB::KeyFilter& delete_key_filter, UpdateCallback callback) { db_wrapper_->template UpdateEntriesWithRemoveFilter( std::move(entries_to_save), delete_key_filter, std::move(callback)); } // Asynchronously loads all entries from the database and invokes |callback| // when complete. virtual void LoadEntries(LoadCallback callback) { db_wrapper_->template LoadEntries(std::move(callback)); } // Asynchronously loads entries that satisfies the |filter| from the database // and invokes |callback| when complete. The filter will be called on // ProtoDatabase's taskrunner. virtual void LoadEntriesWithFilter(const LevelDB::KeyFilter& filter, LoadCallback callback) { db_wrapper_->template LoadEntriesWithFilter(filter, std::move(callback)); } virtual void LoadEntriesWithFilter(const LevelDB::KeyFilter& key_filter, const leveldb::ReadOptions& options, const std::string& target_prefix, LoadCallback callback) { db_wrapper_->template LoadEntriesWithFilter( key_filter, options, target_prefix, std::move(callback)); } virtual void LoadKeysAndEntries(LoadKeysAndEntriesCallback callback) { db_wrapper_->template LoadKeysAndEntries(std::move(callback)); } virtual void LoadKeysAndEntriesWithFilter( const LevelDB::KeyFilter& filter, typename ProtoDatabase::LoadKeysAndEntriesCallback callback) { db_wrapper_->template LoadKeysAndEntriesWithFilter(filter, std::move(callback)); } virtual void LoadKeysAndEntriesWithFilter( const LevelDB::KeyFilter& filter, const leveldb::ReadOptions& options, const std::string& target_prefix, typename ProtoDatabase::LoadKeysAndEntriesCallback callback) { db_wrapper_->template LoadKeysAndEntriesWithFilter( filter, options, target_prefix, std::move(callback)); } // Asynchronously loads all keys from the database and invokes |callback| with // those keys when complete. virtual void LoadKeys(LoadKeysCallback callback) { db_wrapper_->LoadKeys(std::move(callback)); } // Asynchronously loads a single entry, identified by |key|, from the database // and invokes |callback| when complete. If no entry with |key| is found, // a nullptr is passed to the callback, but the success flag is still true. virtual void GetEntry(const std::string& key, GetCallback callback) { db_wrapper_->template GetEntry(key, std::move(callback)); } // Asynchronously destroys the database. virtual void Destroy(DestroyCallback callback) { db_wrapper_->Destroy(std::move(callback)); } bool GetApproximateMemoryUse(uint64_t* approx_mem_use) { return db_wrapper_->GetApproximateMemoryUse(approx_mem_use); } protected: std::unique_ptr db_wrapper_; }; // Return a new instance of Options, but with two additions: // 1) create_if_missing = true // 2) max_open_files = 0 leveldb_env::Options CreateSimpleOptions(); } // namespace leveldb_proto #endif // COMPONENTS_LEVELDB_PROTO_PROTO_DATABASE_H_