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