OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/leveldb_wrapper_impl.h" | 5 #include "content/browser/leveldb_wrapper_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/metrics/histogram_macros.h" | 8 #include "base/metrics/histogram_macros.h" |
9 #include "base/threading/thread_task_runner_handle.h" | 9 #include "base/threading/thread_task_runner_handle.h" |
10 #include "components/leveldb/public/cpp/util.h" | 10 #include "components/leveldb/public/cpp/util.h" |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 void LevelDBWrapperImpl::AddObserver( | 102 void LevelDBWrapperImpl::AddObserver( |
103 mojom::LevelDBObserverAssociatedPtrInfo observer) { | 103 mojom::LevelDBObserverAssociatedPtrInfo observer) { |
104 mojom::LevelDBObserverAssociatedPtr observer_ptr; | 104 mojom::LevelDBObserverAssociatedPtr observer_ptr; |
105 observer_ptr.Bind(std::move(observer)); | 105 observer_ptr.Bind(std::move(observer)); |
106 observers_.AddPtr(std::move(observer_ptr)); | 106 observers_.AddPtr(std::move(observer_ptr)); |
107 } | 107 } |
108 | 108 |
109 void LevelDBWrapperImpl::Put(const std::vector<uint8_t>& key, | 109 void LevelDBWrapperImpl::Put(const std::vector<uint8_t>& key, |
110 const std::vector<uint8_t>& value, | 110 const std::vector<uint8_t>& value, |
111 const std::string& source, | 111 const std::string& source, |
112 const PutCallback& callback) { | 112 PutCallback callback) { |
113 if (!map_) { | 113 if (!map_) { |
114 LoadMap(base::Bind(&LevelDBWrapperImpl::Put, base::Unretained(this), key, | 114 LoadMap(base::Bind(&LevelDBWrapperImpl::Put, base::Unretained(this), key, |
115 value, source, callback)); | 115 value, source, base::Passed(&callback))); |
116 return; | 116 return; |
117 } | 117 } |
118 | 118 |
119 bool has_old_item = false; | 119 bool has_old_item = false; |
120 size_t old_item_size = 0; | 120 size_t old_item_size = 0; |
121 auto found = map_->find(key); | 121 auto found = map_->find(key); |
122 if (found != map_->end()) { | 122 if (found != map_->end()) { |
123 if (found->second == value) { | 123 if (found->second == value) { |
124 callback.Run(true); // Key already has this value. | 124 std::move(callback).Run(true); // Key already has this value. |
125 return; | 125 return; |
126 } | 126 } |
127 old_item_size = key.size() + found->second.size(); | 127 old_item_size = key.size() + found->second.size(); |
128 has_old_item = true; | 128 has_old_item = true; |
129 } | 129 } |
130 size_t new_item_size = key.size() + value.size(); | 130 size_t new_item_size = key.size() + value.size(); |
131 size_t new_bytes_used = bytes_used_ - old_item_size + new_item_size; | 131 size_t new_bytes_used = bytes_used_ - old_item_size + new_item_size; |
132 | 132 |
133 // Only check quota if the size is increasing, this allows | 133 // Only check quota if the size is increasing, this allows |
134 // shrinking changes to pre-existing maps that are over budget. | 134 // shrinking changes to pre-existing maps that are over budget. |
135 if (new_item_size > old_item_size && new_bytes_used > max_size_) { | 135 if (new_item_size > old_item_size && new_bytes_used > max_size_) { |
136 callback.Run(false); | 136 std::move(callback).Run(false); |
137 return; | 137 return; |
138 } | 138 } |
139 | 139 |
140 if (database_) { | 140 if (database_) { |
141 CreateCommitBatchIfNeeded(); | 141 CreateCommitBatchIfNeeded(); |
142 commit_batch_->changed_keys.insert(key); | 142 commit_batch_->changed_keys.insert(key); |
143 } | 143 } |
144 | 144 |
145 std::vector<uint8_t> old_value; | 145 std::vector<uint8_t> old_value; |
146 if (has_old_item) { | 146 if (has_old_item) { |
147 old_value.swap((*map_)[key]); | 147 old_value.swap((*map_)[key]); |
148 } | 148 } |
149 (*map_)[key] = value; | 149 (*map_)[key] = value; |
150 bytes_used_ = new_bytes_used; | 150 bytes_used_ = new_bytes_used; |
151 if (!has_old_item) { | 151 if (!has_old_item) { |
152 // We added a new key/value pair. | 152 // We added a new key/value pair. |
153 observers_.ForAllPtrs( | 153 observers_.ForAllPtrs( |
154 [&key, &value, &source](mojom::LevelDBObserver* observer) { | 154 [&key, &value, &source](mojom::LevelDBObserver* observer) { |
155 observer->KeyAdded(key, value, source); | 155 observer->KeyAdded(key, value, source); |
156 }); | 156 }); |
157 } else { | 157 } else { |
158 // We changed the value for an existing key. | 158 // We changed the value for an existing key. |
159 observers_.ForAllPtrs( | 159 observers_.ForAllPtrs( |
160 [&key, &value, &source, &old_value](mojom::LevelDBObserver* observer) { | 160 [&key, &value, &source, &old_value](mojom::LevelDBObserver* observer) { |
161 observer->KeyChanged(key, value, old_value, source); | 161 observer->KeyChanged(key, value, old_value, source); |
162 }); | 162 }); |
163 } | 163 } |
164 callback.Run(true); | 164 std::move(callback).Run(true); |
165 } | 165 } |
166 | 166 |
167 void LevelDBWrapperImpl::Delete(const std::vector<uint8_t>& key, | 167 void LevelDBWrapperImpl::Delete(const std::vector<uint8_t>& key, |
168 const std::string& source, | 168 const std::string& source, |
169 const DeleteCallback& callback) { | 169 DeleteCallback callback) { |
170 if (!map_) { | 170 if (!map_) { |
171 LoadMap(base::Bind(&LevelDBWrapperImpl::Delete, base::Unretained(this), key, | 171 LoadMap(base::Bind(&LevelDBWrapperImpl::Delete, base::Unretained(this), key, |
172 source, callback)); | 172 source, base::Passed(&callback))); |
173 return; | 173 return; |
174 } | 174 } |
175 | 175 |
176 auto found = map_->find(key); | 176 auto found = map_->find(key); |
177 if (found == map_->end()) { | 177 if (found == map_->end()) { |
178 callback.Run(true); | 178 std::move(callback).Run(true); |
179 return; | 179 return; |
180 } | 180 } |
181 | 181 |
182 if (database_) { | 182 if (database_) { |
183 CreateCommitBatchIfNeeded(); | 183 CreateCommitBatchIfNeeded(); |
184 commit_batch_->changed_keys.insert(std::move(found->first)); | 184 commit_batch_->changed_keys.insert(std::move(found->first)); |
185 } | 185 } |
186 | 186 |
187 std::vector<uint8_t> old_value(std::move(found->second)); | 187 std::vector<uint8_t> old_value(std::move(found->second)); |
188 map_->erase(found); | 188 map_->erase(found); |
189 bytes_used_ -= key.size() + old_value.size(); | 189 bytes_used_ -= key.size() + old_value.size(); |
190 observers_.ForAllPtrs( | 190 observers_.ForAllPtrs( |
191 [&key, &source, &old_value](mojom::LevelDBObserver* observer) { | 191 [&key, &source, &old_value](mojom::LevelDBObserver* observer) { |
192 observer->KeyDeleted(key, old_value, source); | 192 observer->KeyDeleted(key, old_value, source); |
193 }); | 193 }); |
194 callback.Run(true); | 194 std::move(callback).Run(true); |
195 } | 195 } |
196 | 196 |
197 void LevelDBWrapperImpl::DeleteAll(const std::string& source, | 197 void LevelDBWrapperImpl::DeleteAll(const std::string& source, |
198 const DeleteAllCallback& callback) { | 198 DeleteAllCallback callback) { |
199 if (!map_) { | 199 if (!map_) { |
200 LoadMap( | 200 LoadMap(base::Bind(&LevelDBWrapperImpl::DeleteAll, base::Unretained(this), |
201 base::Bind(&LevelDBWrapperImpl::DeleteAll, base::Unretained(this), | 201 source, base::Passed(&callback))); |
202 source, callback)); | |
203 return; | 202 return; |
204 } | 203 } |
205 | 204 |
206 if (map_->empty()) { | 205 if (map_->empty()) { |
207 callback.Run(true); | 206 std::move(callback).Run(true); |
208 return; | 207 return; |
209 } | 208 } |
210 | 209 |
211 if (database_) { | 210 if (database_) { |
212 CreateCommitBatchIfNeeded(); | 211 CreateCommitBatchIfNeeded(); |
213 commit_batch_->clear_all_first = true; | 212 commit_batch_->clear_all_first = true; |
214 commit_batch_->changed_keys.clear(); | 213 commit_batch_->changed_keys.clear(); |
215 } | 214 } |
216 | 215 |
217 map_->clear(); | 216 map_->clear(); |
218 bytes_used_ = 0; | 217 bytes_used_ = 0; |
219 observers_.ForAllPtrs( | 218 observers_.ForAllPtrs( |
220 [&source](mojom::LevelDBObserver* observer) { | 219 [&source](mojom::LevelDBObserver* observer) { |
221 observer->AllDeleted(source); | 220 observer->AllDeleted(source); |
222 }); | 221 }); |
223 callback.Run(true); | 222 std::move(callback).Run(true); |
224 } | 223 } |
225 | 224 |
226 void LevelDBWrapperImpl::Get(const std::vector<uint8_t>& key, | 225 void LevelDBWrapperImpl::Get(const std::vector<uint8_t>& key, |
227 const GetCallback& callback) { | 226 GetCallback callback) { |
228 if (!map_) { | 227 if (!map_) { |
229 LoadMap(base::Bind(&LevelDBWrapperImpl::Get, base::Unretained(this), key, | 228 LoadMap(base::Bind(&LevelDBWrapperImpl::Get, base::Unretained(this), key, |
230 callback)); | 229 base::Passed(&callback))); |
231 return; | 230 return; |
232 } | 231 } |
233 | 232 |
234 auto found = map_->find(key); | 233 auto found = map_->find(key); |
235 if (found == map_->end()) { | 234 if (found == map_->end()) { |
236 callback.Run(false, std::vector<uint8_t>()); | 235 std::move(callback).Run(false, std::vector<uint8_t>()); |
237 return; | 236 return; |
238 } | 237 } |
239 callback.Run(true, found->second); | 238 std::move(callback).Run(true, found->second); |
240 } | 239 } |
241 | 240 |
242 void LevelDBWrapperImpl::GetAll( | 241 void LevelDBWrapperImpl::GetAll( |
243 mojom::LevelDBWrapperGetAllCallbackAssociatedPtrInfo complete_callback, | 242 mojom::LevelDBWrapperGetAllCallbackAssociatedPtrInfo complete_callback, |
244 const GetAllCallback& callback) { | 243 GetAllCallback callback) { |
245 if (!map_) { | 244 if (!map_) { |
246 LoadMap(base::Bind(&LevelDBWrapperImpl::GetAll, base::Unretained(this), | 245 LoadMap(base::Bind(&LevelDBWrapperImpl::GetAll, base::Unretained(this), |
247 base::Passed(std::move(complete_callback)), callback)); | 246 base::Passed(&complete_callback), |
| 247 base::Passed(&callback))); |
248 return; | 248 return; |
249 } | 249 } |
250 | 250 |
251 std::vector<mojom::KeyValuePtr> all; | 251 std::vector<mojom::KeyValuePtr> all; |
252 for (const auto& it : (*map_)) { | 252 for (const auto& it : (*map_)) { |
253 mojom::KeyValuePtr kv = mojom::KeyValue::New(); | 253 mojom::KeyValuePtr kv = mojom::KeyValue::New(); |
254 kv->key = it.first; | 254 kv->key = it.first; |
255 kv->value = it.second; | 255 kv->value = it.second; |
256 all.push_back(std::move(kv)); | 256 all.push_back(std::move(kv)); |
257 } | 257 } |
258 callback.Run(leveldb::mojom::DatabaseError::OK, std::move(all)); | 258 std::move(callback).Run(leveldb::mojom::DatabaseError::OK, std::move(all)); |
259 if (complete_callback.is_valid()) { | 259 if (complete_callback.is_valid()) { |
260 mojom::LevelDBWrapperGetAllCallbackAssociatedPtr complete_ptr; | 260 mojom::LevelDBWrapperGetAllCallbackAssociatedPtr complete_ptr; |
261 complete_ptr.Bind(std::move(complete_callback)); | 261 complete_ptr.Bind(std::move(complete_callback)); |
262 complete_ptr->Complete(true); | 262 complete_ptr->Complete(true); |
263 } | 263 } |
264 } | 264 } |
265 | 265 |
266 void LevelDBWrapperImpl::OnConnectionError() { | 266 void LevelDBWrapperImpl::OnConnectionError() { |
267 if (!bindings_.empty()) | 267 if (!bindings_.empty()) |
268 return; | 268 return; |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
436 weak_ptr_factory_.GetWeakPtr())); | 436 weak_ptr_factory_.GetWeakPtr())); |
437 } | 437 } |
438 | 438 |
439 void LevelDBWrapperImpl::OnCommitComplete(leveldb::mojom::DatabaseError error) { | 439 void LevelDBWrapperImpl::OnCommitComplete(leveldb::mojom::DatabaseError error) { |
440 --commit_batches_in_flight_; | 440 --commit_batches_in_flight_; |
441 StartCommitTimer(); | 441 StartCommitTimer(); |
442 delegate_->DidCommit(error); | 442 delegate_->DidCommit(error); |
443 } | 443 } |
444 | 444 |
445 } // namespace content | 445 } // namespace content |
OLD | NEW |