| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/extensions/settings/settings_leveldb_storage.h" | 5 #include "chrome/browser/extensions/settings/settings_leveldb_storage.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
| 9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
| 10 #include "base/json/json_reader.h" | 10 #include "base/json/json_reader.h" |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 base::JSONReader json_reader; | 157 base::JSONReader json_reader; |
| 158 leveldb::ReadOptions options = leveldb::ReadOptions(); | 158 leveldb::ReadOptions options = leveldb::ReadOptions(); |
| 159 // All interaction with the db is done on the same thread, so snapshotting | 159 // All interaction with the db is done on the same thread, so snapshotting |
| 160 // isn't strictly necessary. This is just defensive. | 160 // isn't strictly necessary. This is just defensive. |
| 161 scoped_ptr<DictionaryValue> settings(new DictionaryValue()); | 161 scoped_ptr<DictionaryValue> settings(new DictionaryValue()); |
| 162 | 162 |
| 163 ScopedSnapshot snapshot(db_.get()); | 163 ScopedSnapshot snapshot(db_.get()); |
| 164 options.snapshot = snapshot.get(); | 164 options.snapshot = snapshot.get(); |
| 165 scoped_ptr<leveldb::Iterator> it(db_->NewIterator(options)); | 165 scoped_ptr<leveldb::Iterator> it(db_->NewIterator(options)); |
| 166 for (it->SeekToFirst(); it->Valid(); it->Next()) { | 166 for (it->SeekToFirst(); it->Valid(); it->Next()) { |
| 167 Value* value = | 167 Value* value = json_reader.ReadToValue(it->value().ToString()); |
| 168 json_reader.JsonToValue(it->value().ToString(), false, false); | |
| 169 if (value != NULL) { | 168 if (value != NULL) { |
| 170 settings->SetWithoutPathExpansion(it->key().ToString(), value); | 169 settings->SetWithoutPathExpansion(it->key().ToString(), value); |
| 171 } else { | 170 } else { |
| 172 // TODO(kalman): clear the offending non-JSON value from the database. | 171 // TODO(kalman): clear the offending non-JSON value from the database. |
| 173 LOG(ERROR) << "Invalid JSON: " << it->value().ToString(); | 172 LOG(ERROR) << "Invalid JSON: " << it->value().ToString(); |
| 174 } | 173 } |
| 175 } | 174 } |
| 176 | 175 |
| 177 if (!it->status().ok()) { | 176 if (!it->status().ok()) { |
| 178 LOG(ERROR) << "DB iteration failed: " << it->status().ToString(); | 177 LOG(ERROR) << "DB iteration failed: " << it->status().ToString(); |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 // isn't strictly necessary. This is just defensive. | 268 // isn't strictly necessary. This is just defensive. |
| 270 leveldb::WriteBatch batch; | 269 leveldb::WriteBatch batch; |
| 271 scoped_ptr<SettingChangeList> changes(new SettingChangeList()); | 270 scoped_ptr<SettingChangeList> changes(new SettingChangeList()); |
| 272 | 271 |
| 273 ScopedSnapshot snapshot(db_.get()); | 272 ScopedSnapshot snapshot(db_.get()); |
| 274 read_options.snapshot = snapshot.get(); | 273 read_options.snapshot = snapshot.get(); |
| 275 scoped_ptr<leveldb::Iterator> it(db_->NewIterator(read_options)); | 274 scoped_ptr<leveldb::Iterator> it(db_->NewIterator(read_options)); |
| 276 for (it->SeekToFirst(); it->Valid(); it->Next()) { | 275 for (it->SeekToFirst(); it->Valid(); it->Next()) { |
| 277 const std::string key = it->key().ToString(); | 276 const std::string key = it->key().ToString(); |
| 278 const std::string old_value_json = it->value().ToString(); | 277 const std::string old_value_json = it->value().ToString(); |
| 279 Value* old_value = | 278 Value* old_value = base::JSONReader().ReadToValue(old_value_json); |
| 280 base::JSONReader().JsonToValue(old_value_json, false, false); | |
| 281 if (old_value) { | 279 if (old_value) { |
| 282 changes->push_back(SettingChange(key, old_value, NULL)); | 280 changes->push_back(SettingChange(key, old_value, NULL)); |
| 283 } else { | 281 } else { |
| 284 LOG(ERROR) << "Invalid JSON in database: " << old_value_json; | 282 LOG(ERROR) << "Invalid JSON in database: " << old_value_json; |
| 285 } | 283 } |
| 286 batch.Delete(key); | 284 batch.Delete(key); |
| 287 } | 285 } |
| 288 | 286 |
| 289 if (!it->status().ok()) { | 287 if (!it->status().ok()) { |
| 290 LOG(WARNING) << "Clear iteration failed: " << it->status().ToString(); | 288 LOG(WARNING) << "Clear iteration failed: " << it->status().ToString(); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 312 if (s.IsNotFound()) { | 310 if (s.IsNotFound()) { |
| 313 // Despite there being no value, it was still a success. | 311 // Despite there being no value, it was still a success. |
| 314 return true; | 312 return true; |
| 315 } | 313 } |
| 316 | 314 |
| 317 if (!s.ok()) { | 315 if (!s.ok()) { |
| 318 LOG(ERROR) << "Error reading from database: " << s.ToString(); | 316 LOG(ERROR) << "Error reading from database: " << s.ToString(); |
| 319 return false; | 317 return false; |
| 320 } | 318 } |
| 321 | 319 |
| 322 Value* value = base::JSONReader().JsonToValue(value_as_json, false, false); | 320 Value* value = base::JSONReader().ReadToValue(value_as_json); |
| 323 if (value == NULL) { | 321 if (value == NULL) { |
| 324 // TODO(kalman): clear the offending non-JSON value from the database. | 322 // TODO(kalman): clear the offending non-JSON value from the database. |
| 325 LOG(ERROR) << "Invalid JSON in database: " << value_as_json; | 323 LOG(ERROR) << "Invalid JSON in database: " << value_as_json; |
| 326 return false; | 324 return false; |
| 327 } | 325 } |
| 328 | 326 |
| 329 setting->reset(value); | 327 setting->reset(value); |
| 330 return true; | 328 return true; |
| 331 } | 329 } |
| 332 | 330 |
| 333 bool SettingsLeveldbStorage::IsEmpty() { | 331 bool SettingsLeveldbStorage::IsEmpty() { |
| 334 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 332 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 335 scoped_ptr<leveldb::Iterator> it(db_->NewIterator(leveldb::ReadOptions())); | 333 scoped_ptr<leveldb::Iterator> it(db_->NewIterator(leveldb::ReadOptions())); |
| 336 | 334 |
| 337 it->SeekToFirst(); | 335 it->SeekToFirst(); |
| 338 bool is_empty = !it->Valid(); | 336 bool is_empty = !it->Valid(); |
| 339 if (!it->status().ok()) { | 337 if (!it->status().ok()) { |
| 340 LOG(ERROR) << "Checking DB emptiness failed: " << it->status().ToString(); | 338 LOG(ERROR) << "Checking DB emptiness failed: " << it->status().ToString(); |
| 341 return false; | 339 return false; |
| 342 } | 340 } |
| 343 return is_empty; | 341 return is_empty; |
| 344 } | 342 } |
| 345 | 343 |
| 346 } // namespace extensions | 344 } // namespace extensions |
| OLD | NEW |