| 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 |