Chromium Code Reviews| Index: components/download/internal/download_store.cc |
| diff --git a/components/download/internal/download_store.cc b/components/download/internal/download_store.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..ab6c8967abcc3c744dbca1acafb13aea1e5eb911 |
| --- /dev/null |
| +++ b/components/download/internal/download_store.cc |
| @@ -0,0 +1,91 @@ |
| +// Copyright 2017 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/download/internal/download_store.h" |
| + |
| +#include "base/bind.h" |
| +#include "base/callback_helpers.h" |
| +#include "base/memory/ptr_util.h" |
| +#include "components/download/internal/entry.h" |
| +#include "components/download/internal/proto/entry.pb.h" |
| +#include "components/download/internal/proto_conversions.h" |
| +#include "components/leveldb_proto/proto_database_impl.h" |
| + |
| +namespace download { |
| +const char kDatabaseClientName[] = "DownloadService"; |
|
David Trainor- moved to gerrit
2017/05/23 06:18:00
put these in an anonymous namespace inside downloa
|
| + |
| +using KeyVector = std::vector<std::string>; |
| +using ProtoEntryVector = std::vector<protodb::Entry>; |
| +using KeyProtoEntryVector = std::vector<std::pair<std::string, protodb::Entry>>; |
| + |
| +DownloadStore::DownloadStore( |
| + const base::FilePath& database_dir, |
| + std::unique_ptr<leveldb_proto::ProtoDatabase<protodb::Entry>> db) |
| + : db_(std::move(db)), |
| + database_dir_(database_dir), |
| + is_initialized_(false), |
| + weak_factory_(this) {} |
| + |
| +DownloadStore::~DownloadStore() = default; |
| + |
| +bool DownloadStore::IsInitialized() { |
| + return is_initialized_; |
| +} |
| + |
| +void DownloadStore::Initialize(const InitCallback& callback) { |
| + DCHECK(!IsInitialized()); |
| + db_->InitWithOptions(kDatabaseClientName, |
| + leveldb_proto::Options(database_dir_), |
| + base::Bind(&DownloadStore::OnDatabaseInited, |
| + weak_factory_.GetWeakPtr(), callback)); |
| +} |
| + |
| +void DownloadStore::OnDatabaseInited(const InitCallback& callback, |
| + bool success) { |
| + if (!success) { |
| + callback.Run(success, base::MakeUnique<std::vector<Entry>>()); |
| + return; |
| + } |
| + |
| + db_->LoadEntries(base::Bind(&DownloadStore::OnDatabaseLoaded, |
| + weak_factory_.GetWeakPtr(), callback)); |
| +} |
| + |
| +void DownloadStore::OnDatabaseLoaded(const InitCallback& callback, |
| + bool success, |
| + std::unique_ptr<ProtoEntryVector> protos) { |
| + if (!success) { |
| + callback.Run(success, base::MakeUnique<std::vector<Entry>>()); |
| + return; |
| + } |
| + |
| + auto entries = ProtoConversions::EntryVectorFromProto(std::move(protos)); |
| + is_initialized_ = true; |
| + callback.Run(success, std::move(entries)); |
| +} |
| + |
| +void DownloadStore::Destroy(const StoreCallback& callback) { |
| + is_initialized_ = false; |
| + db_->Destroy(callback); |
| +} |
| + |
| +void DownloadStore::Update(const Entry& entry, const StoreCallback& callback) { |
| + DCHECK(IsInitialized()); |
| + auto entries_to_save = base::MakeUnique<KeyProtoEntryVector>(); |
| + protodb::Entry proto = ProtoConversions::EntryToProto(entry); |
| + entries_to_save->emplace_back(entry.guid, std::move(proto)); |
| + db_->UpdateEntries(std::move(entries_to_save), base::MakeUnique<KeyVector>(), |
| + callback); |
| +} |
| + |
| +void DownloadStore::Remove(const std::string& guid, |
| + const StoreCallback& callback) { |
| + DCHECK(IsInitialized()); |
| + auto keys_to_remove = base::MakeUnique<KeyVector>(); |
| + keys_to_remove->push_back(guid); |
| + db_->UpdateEntries(base::MakeUnique<KeyProtoEntryVector>(), |
| + std::move(keys_to_remove), callback); |
| +} |
| + |
| +} // namespace download |