| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "extensions/browser/value_store/leveldb_value_store.h" | 5 #include "extensions/browser/value_store/leveldb_value_store.h" |
| 6 | 6 |
| 7 #include "base/files/file_util.h" | 7 #include "base/files/file_util.h" |
| 8 #include "base/json/json_reader.h" | 8 #include "base/json/json_reader.h" |
| 9 #include "base/json/json_writer.h" | 9 #include "base/json/json_writer.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 | 230 |
| 231 for (std::vector<std::string>::const_iterator it = keys.begin(); | 231 for (std::vector<std::string>::const_iterator it = keys.begin(); |
| 232 it != keys.end(); ++it) { | 232 it != keys.end(); ++it) { |
| 233 scoped_ptr<base::Value> old_value; | 233 scoped_ptr<base::Value> old_value; |
| 234 scoped_ptr<Error> read_error = | 234 scoped_ptr<Error> read_error = |
| 235 ReadFromDb(leveldb::ReadOptions(), *it, &old_value); | 235 ReadFromDb(leveldb::ReadOptions(), *it, &old_value); |
| 236 if (read_error) | 236 if (read_error) |
| 237 return MakeWriteResult(read_error.Pass()); | 237 return MakeWriteResult(read_error.Pass()); |
| 238 | 238 |
| 239 if (old_value) { | 239 if (old_value) { |
| 240 changes->push_back(ValueStoreChange(*it, old_value.release(), NULL)); | 240 changes->push_back(ValueStoreChange(*it, old_value.release(), nullptr)); |
| 241 batch.Delete(*it); | 241 batch.Delete(*it); |
| 242 } | 242 } |
| 243 } | 243 } |
| 244 | 244 |
| 245 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); | 245 leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch); |
| 246 if (!status.ok() && !status.IsNotFound()) | 246 if (!status.ok() && !status.IsNotFound()) |
| 247 return MakeWriteResult(ToValueStoreError(status, util::NoKey())); | 247 return MakeWriteResult(ToValueStoreError(status, util::NoKey())); |
| 248 return MakeWriteResult(changes.Pass()); | 248 return MakeWriteResult(changes.Pass()); |
| 249 } | 249 } |
| 250 | 250 |
| 251 ValueStore::WriteResult LeveldbValueStore::Clear() { | 251 ValueStore::WriteResult LeveldbValueStore::Clear() { |
| 252 DCHECK_CURRENTLY_ON(BrowserThread::FILE); | 252 DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
| 253 | 253 |
| 254 scoped_ptr<ValueStoreChangeList> changes(new ValueStoreChangeList()); | 254 scoped_ptr<ValueStoreChangeList> changes(new ValueStoreChangeList()); |
| 255 | 255 |
| 256 ReadResult read_result = Get(); | 256 ReadResult read_result = Get(); |
| 257 if (read_result->HasError()) | 257 if (read_result->HasError()) |
| 258 return MakeWriteResult(read_result->PassError()); | 258 return MakeWriteResult(read_result->PassError()); |
| 259 | 259 |
| 260 base::DictionaryValue& whole_db = read_result->settings(); | 260 base::DictionaryValue& whole_db = read_result->settings(); |
| 261 while (!whole_db.empty()) { | 261 while (!whole_db.empty()) { |
| 262 std::string next_key = base::DictionaryValue::Iterator(whole_db).key(); | 262 std::string next_key = base::DictionaryValue::Iterator(whole_db).key(); |
| 263 scoped_ptr<base::Value> next_value; | 263 scoped_ptr<base::Value> next_value; |
| 264 whole_db.RemoveWithoutPathExpansion(next_key, &next_value); | 264 whole_db.RemoveWithoutPathExpansion(next_key, &next_value); |
| 265 changes->push_back( | 265 changes->push_back( |
| 266 ValueStoreChange(next_key, next_value.release(), NULL)); | 266 ValueStoreChange(next_key, next_value.release(), nullptr)); |
| 267 } | 267 } |
| 268 | 268 |
| 269 DeleteDbFile(); | 269 DeleteDbFile(); |
| 270 return MakeWriteResult(changes.Pass()); | 270 return MakeWriteResult(changes.Pass()); |
| 271 } | 271 } |
| 272 | 272 |
| 273 bool LeveldbValueStore::Restore() { | 273 bool LeveldbValueStore::Restore() { |
| 274 DCHECK_CURRENTLY_ON(BrowserThread::FILE); | 274 DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
| 275 | 275 |
| 276 ReadResult result = Get(); | 276 ReadResult result = Get(); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 322 scoped_ptr<ValueStore::Error> LeveldbValueStore::EnsureDbIsOpen() { | 322 scoped_ptr<ValueStore::Error> LeveldbValueStore::EnsureDbIsOpen() { |
| 323 DCHECK_CURRENTLY_ON(BrowserThread::FILE); | 323 DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
| 324 | 324 |
| 325 if (db_) | 325 if (db_) |
| 326 return util::NoError(); | 326 return util::NoError(); |
| 327 | 327 |
| 328 leveldb::Options options; | 328 leveldb::Options options; |
| 329 options.max_open_files = 0; // Use minimum. | 329 options.max_open_files = 0; // Use minimum. |
| 330 options.create_if_missing = true; | 330 options.create_if_missing = true; |
| 331 | 331 |
| 332 leveldb::DB* db = NULL; | 332 leveldb::DB* db = nullptr; |
| 333 leveldb::Status status = | 333 leveldb::Status status = |
| 334 leveldb::DB::Open(options, db_path_.AsUTF8Unsafe(), &db); | 334 leveldb::DB::Open(options, db_path_.AsUTF8Unsafe(), &db); |
| 335 if (!status.ok()) | 335 if (!status.ok()) |
| 336 return ToValueStoreError(status, util::NoKey()); | 336 return ToValueStoreError(status, util::NoKey()); |
| 337 | 337 |
| 338 CHECK(db); | 338 CHECK(db); |
| 339 db_.reset(db); | 339 db_.reset(db); |
| 340 return util::NoError(); | 340 return util::NoError(); |
| 341 } | 341 } |
| 342 | 342 |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 433 CHECK(!status.ok()); | 433 CHECK(!status.ok()); |
| 434 CHECK(!status.IsNotFound()); // not an error | 434 CHECK(!status.IsNotFound()); // not an error |
| 435 | 435 |
| 436 std::string message = status.ToString(); | 436 std::string message = status.ToString(); |
| 437 // The message may contain |db_path_|, which may be considered sensitive | 437 // The message may contain |db_path_|, which may be considered sensitive |
| 438 // data, and those strings are passed to the extension, so strip it out. | 438 // data, and those strings are passed to the extension, so strip it out. |
| 439 ReplaceSubstringsAfterOffset(&message, 0u, db_path_.AsUTF8Unsafe(), "..."); | 439 ReplaceSubstringsAfterOffset(&message, 0u, db_path_.AsUTF8Unsafe(), "..."); |
| 440 | 440 |
| 441 return Error::Create(CORRUPTION, message, key.Pass()); | 441 return Error::Create(CORRUPTION, message, key.Pass()); |
| 442 } | 442 } |
| OLD | NEW |