1 // Copyright 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "components/leveldb_proto/internal/unique_proto_database.h"
6 
7 #include <memory>
8 #include <utility>
9 
10 #include "base/sequenced_task_runner.h"
11 #include "components/leveldb_proto/internal/leveldb_database.h"
12 #include "components/leveldb_proto/internal/proto_leveldb_wrapper.h"
13 
14 namespace leveldb_proto {
15 
UniqueProtoDatabase(const scoped_refptr<base::SequencedTaskRunner> & task_runner)16 UniqueProtoDatabase::UniqueProtoDatabase(
17     const scoped_refptr<base::SequencedTaskRunner>& task_runner)
18     : db_wrapper_(std::make_unique<ProtoLevelDBWrapper>(task_runner)) {}
19 
UniqueProtoDatabase(std::unique_ptr<ProtoLevelDBWrapper> db_wrapper)20 UniqueProtoDatabase::UniqueProtoDatabase(
21     std::unique_ptr<ProtoLevelDBWrapper> db_wrapper)
22     : db_wrapper_(std::move(db_wrapper)) {}
23 
UniqueProtoDatabase(const base::FilePath & database_dir,const leveldb_env::Options & options,const scoped_refptr<base::SequencedTaskRunner> & task_runner)24 UniqueProtoDatabase::UniqueProtoDatabase(
25     const base::FilePath& database_dir,
26     const leveldb_env::Options& options,
27     const scoped_refptr<base::SequencedTaskRunner>& task_runner)
28     : UniqueProtoDatabase(task_runner) {
29   database_dir_ = database_dir;
30   options_ = options;
31 }
32 
~UniqueProtoDatabase()33 UniqueProtoDatabase::~UniqueProtoDatabase() {
34   if (db_.get() &&
35       !db_wrapper_->task_runner()->DeleteSoon(FROM_HERE, db_.release())) {
36     DLOG(WARNING) << "Proto database will not be deleted.";
37   }
38 }
39 
Init(const std::string & client_name,Callbacks::InitStatusCallback callback)40 void UniqueProtoDatabase::Init(const std::string& client_name,
41                                Callbacks::InitStatusCallback callback) {
42   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
43   db_ = std::make_unique<LevelDB>(client_name.c_str());
44   db_wrapper_->SetMetricsId(client_name);
45   InitWithDatabase(db_.get(), database_dir_, options_, true,
46                    std::move(callback));
47 }
48 
InitWithDatabase(LevelDB * database,const base::FilePath & database_dir,const leveldb_env::Options & options,bool destroy_on_corruption,Callbacks::InitStatusCallback callback)49 void UniqueProtoDatabase::InitWithDatabase(
50     LevelDB* database,
51     const base::FilePath& database_dir,
52     const leveldb_env::Options& options,
53     bool destroy_on_corruption,
54     Callbacks::InitStatusCallback callback) {
55   // We set |destroy_on_corruption| to true to preserve the original behaviour
56   // where database corruption led to automatic destruction.
57   db_wrapper_->InitWithDatabase(database, database_dir, options,
58                                 destroy_on_corruption, std::move(callback));
59 }
60 
UpdateEntries(std::unique_ptr<KeyValueVector> entries_to_save,std::unique_ptr<KeyVector> keys_to_remove,Callbacks::UpdateCallback callback)61 void UniqueProtoDatabase::UpdateEntries(
62     std::unique_ptr<KeyValueVector> entries_to_save,
63     std::unique_ptr<KeyVector> keys_to_remove,
64     Callbacks::UpdateCallback callback) {
65   db_wrapper_->UpdateEntries(std::move(entries_to_save),
66                              std::move(keys_to_remove), std::move(callback));
67 }
68 
UpdateEntriesWithRemoveFilter(std::unique_ptr<KeyValueVector> entries_to_save,const KeyFilter & delete_key_filter,Callbacks::UpdateCallback callback)69 void UniqueProtoDatabase::UpdateEntriesWithRemoveFilter(
70     std::unique_ptr<KeyValueVector> entries_to_save,
71     const KeyFilter& delete_key_filter,
72     Callbacks::UpdateCallback callback) {
73   db_wrapper_->UpdateEntriesWithRemoveFilter(
74       std::move(entries_to_save), delete_key_filter, std::move(callback));
75 }
76 
UpdateEntriesWithRemoveFilter(std::unique_ptr<KeyValueVector> entries_to_save,const KeyFilter & delete_key_filter,const std::string & target_prefix,Callbacks::UpdateCallback callback)77 void UniqueProtoDatabase::UpdateEntriesWithRemoveFilter(
78     std::unique_ptr<KeyValueVector> entries_to_save,
79     const KeyFilter& delete_key_filter,
80     const std::string& target_prefix,
81     Callbacks::UpdateCallback callback) {
82   db_wrapper_->UpdateEntriesWithRemoveFilter(std::move(entries_to_save),
83                                              delete_key_filter, target_prefix,
84                                              std::move(callback));
85 }
86 
LoadEntries(typename Callbacks::LoadCallback callback)87 void UniqueProtoDatabase::LoadEntries(
88     typename Callbacks::LoadCallback callback) {
89   db_wrapper_->LoadEntries(std::move(callback));
90 }
91 
LoadEntriesWithFilter(const KeyFilter & filter,typename Callbacks::LoadCallback callback)92 void UniqueProtoDatabase::LoadEntriesWithFilter(
93     const KeyFilter& filter,
94     typename Callbacks::LoadCallback callback) {
95   db_wrapper_->LoadEntriesWithFilter(filter, std::move(callback));
96 }
97 
LoadEntriesWithFilter(const KeyFilter & key_filter,const leveldb::ReadOptions & options,const std::string & target_prefix,typename Callbacks::LoadCallback callback)98 void UniqueProtoDatabase::LoadEntriesWithFilter(
99     const KeyFilter& key_filter,
100     const leveldb::ReadOptions& options,
101     const std::string& target_prefix,
102     typename Callbacks::LoadCallback callback) {
103   db_wrapper_->LoadEntriesWithFilter(key_filter, options, target_prefix,
104                                      std::move(callback));
105 }
106 
LoadKeysAndEntries(typename Callbacks::LoadKeysAndEntriesCallback callback)107 void UniqueProtoDatabase::LoadKeysAndEntries(
108     typename Callbacks::LoadKeysAndEntriesCallback callback) {
109   db_wrapper_->LoadKeysAndEntries(std::move(callback));
110 }
111 
LoadKeysAndEntriesWithFilter(const KeyFilter & filter,typename Callbacks::LoadKeysAndEntriesCallback callback)112 void UniqueProtoDatabase::LoadKeysAndEntriesWithFilter(
113     const KeyFilter& filter,
114     typename Callbacks::LoadKeysAndEntriesCallback callback) {
115   db_wrapper_->LoadKeysAndEntriesWithFilter(filter, std::move(callback));
116 }
117 
LoadKeysAndEntriesWithFilter(const KeyFilter & filter,const leveldb::ReadOptions & options,const std::string & target_prefix,typename Callbacks::LoadKeysAndEntriesCallback callback)118 void UniqueProtoDatabase::LoadKeysAndEntriesWithFilter(
119     const KeyFilter& filter,
120     const leveldb::ReadOptions& options,
121     const std::string& target_prefix,
122     typename Callbacks::LoadKeysAndEntriesCallback callback) {
123   db_wrapper_->LoadKeysAndEntriesWithFilter(filter, options, target_prefix,
124                                             std::move(callback));
125 }
126 
LoadKeysAndEntriesInRange(const std::string & start,const std::string & end,typename Callbacks::LoadKeysAndEntriesCallback callback)127 void UniqueProtoDatabase::LoadKeysAndEntriesInRange(
128     const std::string& start,
129     const std::string& end,
130     typename Callbacks::LoadKeysAndEntriesCallback callback) {
131   db_wrapper_->LoadKeysAndEntriesInRange(start, end, std::move(callback));
132 }
133 
LoadKeys(Callbacks::LoadKeysCallback callback)134 void UniqueProtoDatabase::LoadKeys(Callbacks::LoadKeysCallback callback) {
135   db_wrapper_->LoadKeys(std::move(callback));
136 }
137 
LoadKeys(const std::string & target_prefix,Callbacks::LoadKeysCallback callback)138 void UniqueProtoDatabase::LoadKeys(const std::string& target_prefix,
139                                    Callbacks::LoadKeysCallback callback) {
140   db_wrapper_->LoadKeys(target_prefix, std::move(callback));
141 }
142 
GetEntry(const std::string & key,typename Callbacks::GetCallback callback)143 void UniqueProtoDatabase::GetEntry(const std::string& key,
144                                    typename Callbacks::GetCallback callback) {
145   db_wrapper_->GetEntry(key, std::move(callback));
146 }
147 
Destroy(Callbacks::DestroyCallback callback)148 void UniqueProtoDatabase::Destroy(Callbacks::DestroyCallback callback) {
149   db_wrapper_->Destroy(std::move(callback));
150 }
151 
RemoveKeysForTesting(const KeyFilter & key_filter,const std::string & target_prefix,Callbacks::UpdateCallback callback)152 void UniqueProtoDatabase::RemoveKeysForTesting(
153     const KeyFilter& key_filter,
154     const std::string& target_prefix,
155     Callbacks::UpdateCallback callback) {
156   db_wrapper_->RemoveKeys(key_filter, target_prefix, std::move(callback));
157 }
158 
GetApproximateMemoryUse(uint64_t * approx_mem_use)159 bool UniqueProtoDatabase::GetApproximateMemoryUse(uint64_t* approx_mem_use) {
160   return db_wrapper_->GetApproximateMemoryUse(approx_mem_use);
161 }
162 
SetMetricsId(const std::string & id)163 void UniqueProtoDatabase::SetMetricsId(const std::string& id) {
164   db_wrapper_->SetMetricsId(id);
165 }
166 
167 }  // namespace leveldb_proto
168