Index: components/dom_distiller/core/dom_distiller_database.cc |
diff --git a/components/dom_distiller/core/dom_distiller_database.cc b/components/dom_distiller/core/dom_distiller_database.cc |
deleted file mode 100644 |
index a799a622823cd3e049f777a155d6943a5efe1b7c..0000000000000000000000000000000000000000 |
--- a/components/dom_distiller/core/dom_distiller_database.cc |
+++ /dev/null |
@@ -1,224 +0,0 @@ |
-// Copyright 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "components/dom_distiller/core/dom_distiller_database.h" |
- |
-#include "base/bind.h" |
-#include "base/file_util.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/sequenced_task_runner.h" |
-#include "base/strings/string_util.h" |
-#include "base/threading/sequenced_worker_pool.h" |
-#include "components/dom_distiller/core/article_entry.h" |
-#include "third_party/leveldatabase/src/include/leveldb/db.h" |
-#include "third_party/leveldatabase/src/include/leveldb/iterator.h" |
-#include "third_party/leveldatabase/src/include/leveldb/options.h" |
-#include "third_party/leveldatabase/src/include/leveldb/slice.h" |
-#include "third_party/leveldatabase/src/include/leveldb/status.h" |
-#include "third_party/leveldatabase/src/include/leveldb/write_batch.h" |
- |
-using base::MessageLoop; |
-using base::SequencedTaskRunner; |
- |
-namespace dom_distiller { |
- |
-DomDistillerDatabase::LevelDB::LevelDB() {} |
- |
-DomDistillerDatabase::LevelDB::~LevelDB() { |
- DFAKE_SCOPED_LOCK(thread_checker_); |
-} |
- |
-bool DomDistillerDatabase::LevelDB::Init(const base::FilePath& database_dir) { |
- DFAKE_SCOPED_LOCK(thread_checker_); |
- |
- leveldb::Options options; |
- options.create_if_missing = true; |
- options.max_open_files = 0; // Use minimum. |
- |
- std::string path = database_dir.AsUTF8Unsafe(); |
- |
- leveldb::DB* db = NULL; |
- leveldb::Status status = leveldb::DB::Open(options, path, &db); |
- if (status.IsCorruption()) { |
- base::DeleteFile(database_dir, true); |
- status = leveldb::DB::Open(options, path, &db); |
- } |
- |
- if (status.ok()) { |
- CHECK(db); |
- db_.reset(db); |
- return true; |
- } |
- |
- LOG(WARNING) << "Unable to open " << database_dir.value() << ": " |
- << status.ToString(); |
- return false; |
-} |
- |
-bool DomDistillerDatabase::LevelDB::Save(const EntryVector& entries_to_save, |
- const EntryVector& entries_to_remove) { |
- DFAKE_SCOPED_LOCK(thread_checker_); |
- |
- leveldb::WriteBatch updates; |
- for (EntryVector::const_iterator it = entries_to_save.begin(); |
- it != entries_to_save.end(); |
- ++it) { |
- updates.Put(leveldb::Slice(it->entry_id()), |
- leveldb::Slice(it->SerializeAsString())); |
- } |
- for (EntryVector::const_iterator it = entries_to_remove.begin(); |
- it != entries_to_remove.end(); |
- ++it) { |
- updates.Delete(leveldb::Slice(it->entry_id())); |
- } |
- |
- leveldb::WriteOptions options; |
- options.sync = true; |
- leveldb::Status status = db_->Write(options, &updates); |
- if (status.ok()) |
- return true; |
- |
- DLOG(WARNING) << "Failed writing dom_distiller entries: " |
- << status.ToString(); |
- return false; |
-} |
- |
-bool DomDistillerDatabase::LevelDB::Load(EntryVector* entries) { |
- DFAKE_SCOPED_LOCK(thread_checker_); |
- |
- leveldb::ReadOptions options; |
- scoped_ptr<leveldb::Iterator> db_iterator(db_->NewIterator(options)); |
- for (db_iterator->SeekToFirst(); db_iterator->Valid(); db_iterator->Next()) { |
- leveldb::Slice value_slice = db_iterator->value(); |
- |
- ArticleEntry entry; |
- if (!entry.ParseFromArray(value_slice.data(), value_slice.size())) { |
- DLOG(WARNING) << "Unable to parse dom_distiller entry " |
- << db_iterator->key().ToString(); |
- // TODO(cjhopman): Decide what to do about un-parseable entries. |
- } |
- entries->push_back(entry); |
- } |
- return true; |
-} |
- |
-namespace { |
- |
-void RunInitCallback(DomDistillerDatabaseInterface::InitCallback callback, |
- const bool* success) { |
- callback.Run(*success); |
-} |
- |
-void RunUpdateCallback(DomDistillerDatabaseInterface::UpdateCallback callback, |
- const bool* success) { |
- callback.Run(*success); |
-} |
- |
-void RunLoadCallback(DomDistillerDatabaseInterface::LoadCallback callback, |
- const bool* success, |
- scoped_ptr<EntryVector> entries) { |
- callback.Run(*success, entries.Pass()); |
-} |
- |
-void InitFromTaskRunner(DomDistillerDatabase::Database* database, |
- const base::FilePath& database_dir, |
- bool* success) { |
- DCHECK(success); |
- |
- // TODO(cjhopman): Histogram for database size. |
- *success = database->Init(database_dir); |
-} |
- |
-void UpdateEntriesFromTaskRunner(DomDistillerDatabase::Database* database, |
- scoped_ptr<EntryVector> entries_to_save, |
- scoped_ptr<EntryVector> entries_to_remove, |
- bool* success) { |
- DCHECK(success); |
- *success = database->Save(*entries_to_save, *entries_to_remove); |
-} |
- |
-void LoadEntriesFromTaskRunner(DomDistillerDatabase::Database* database, |
- EntryVector* entries, |
- bool* success) { |
- DCHECK(success); |
- DCHECK(entries); |
- |
- entries->clear(); |
- *success = database->Load(entries); |
-} |
- |
-} // namespace |
- |
-DomDistillerDatabase::DomDistillerDatabase( |
- scoped_refptr<base::SequencedTaskRunner> task_runner) |
- : task_runner_(task_runner) { |
-} |
- |
-void DomDistillerDatabase::Init(const base::FilePath& database_dir, |
- InitCallback callback) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- InitWithDatabase(scoped_ptr<Database>(new LevelDB()), database_dir, callback); |
-} |
- |
-void DomDistillerDatabase::InitWithDatabase(scoped_ptr<Database> database, |
- const base::FilePath& database_dir, |
- InitCallback callback) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- DCHECK(!db_); |
- DCHECK(database); |
- db_.reset(database.release()); |
- bool* success = new bool(false); |
- task_runner_->PostTaskAndReply( |
- FROM_HERE, |
- base::Bind(InitFromTaskRunner, |
- base::Unretained(db_.get()), |
- database_dir, |
- success), |
- base::Bind(RunInitCallback, callback, base::Owned(success))); |
-} |
- |
-void DomDistillerDatabase::UpdateEntries( |
- scoped_ptr<EntryVector> entries_to_save, |
- scoped_ptr<EntryVector> entries_to_remove, |
- UpdateCallback callback) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- bool* success = new bool(false); |
- task_runner_->PostTaskAndReply( |
- FROM_HERE, |
- base::Bind(UpdateEntriesFromTaskRunner, |
- base::Unretained(db_.get()), |
- base::Passed(&entries_to_save), |
- base::Passed(&entries_to_remove), |
- success), |
- base::Bind(RunUpdateCallback, callback, base::Owned(success))); |
-} |
- |
-void DomDistillerDatabase::LoadEntries(LoadCallback callback) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- bool* success = new bool(false); |
- |
- scoped_ptr<EntryVector> entries(new EntryVector()); |
- // Get this pointer before entries is base::Passed() so we can use it below. |
- EntryVector* entries_ptr = entries.get(); |
- |
- task_runner_->PostTaskAndReply( |
- FROM_HERE, |
- base::Bind(LoadEntriesFromTaskRunner, |
- base::Unretained(db_.get()), |
- entries_ptr, |
- success), |
- base::Bind(RunLoadCallback, |
- callback, |
- base::Owned(success), |
- base::Passed(&entries))); |
-} |
- |
-DomDistillerDatabase::~DomDistillerDatabase() { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- if (!task_runner_->DeleteSoon(FROM_HERE, db_.release())) { |
- DLOG(WARNING) << "DOM distiller database will not be deleted."; |
- } |
-} |
- |
-} // namespace dom_distiller |