Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(15)

Side by Side Diff: chrome/browser/extensions/settings/settings_leveldb_storage.cc

Issue 10035042: Rewrite base::JSONReader to be 35-40% faster, depending on the input string. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Really fix Windows, address comments Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « chrome/browser/automation/testing_automation_provider.cc ('k') | chrome/browser/prefs/pref_model_associator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698