1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/notifications/scheduler/internal/impression_store.h"
#include "chrome/browser/notifications/scheduler/internal/proto_conversion.h"
namespace leveldb_proto {
void DataToProto(notifications::ClientState* client_state,
notifications::proto::ClientState* proto) {
ClientStateToProto(client_state, proto);
}
void ProtoToData(notifications::proto::ClientState* proto,
notifications::ClientState* client_state) {
ClientStateFromProto(proto, client_state);
}
} // namespace leveldb_proto
namespace notifications {
ImpressionStore::ImpressionStore(
std::unique_ptr<
leveldb_proto::ProtoDatabase<proto::ClientState, ClientState>> db)
: db_(std::move(db)) {}
ImpressionStore::~ImpressionStore() = default;
void ImpressionStore::InitAndLoad(LoadCallback callback) {
db_->Init(base::BindOnce(&ImpressionStore::OnDbInitialized,
weak_ptr_factory_.GetWeakPtr(),
std::move(callback)));
}
void ImpressionStore::OnDbInitialized(LoadCallback callback,
leveldb_proto::Enums::InitStatus status) {
if (status != leveldb_proto::Enums::InitStatus::kOK) {
std::move(callback).Run(false, Entries());
return;
}
// Load the data after a successful initialization.
db_->LoadEntries(base::BindOnce(&ImpressionStore::OnDataLoaded,
weak_ptr_factory_.GetWeakPtr(),
std::move(callback)));
}
void ImpressionStore::OnDataLoaded(LoadCallback callback,
bool success,
std::unique_ptr<EntryVector> entry_vector) {
// The database failed to load.
if (!success) {
std::move(callback).Run(false, Entries());
return;
}
// Success to load but no data.
if (!entry_vector) {
std::move(callback).Run(true, Entries());
return;
}
// Load data.
Entries entries;
for (auto it = entry_vector->begin(); it != entry_vector->end(); ++it) {
std::unique_ptr<ClientState> client_state = std::make_unique<ClientState>();
*client_state = std::move(*it);
entries.emplace_back(std::move(client_state));
}
std::move(callback).Run(true, std::move(entries));
}
void ImpressionStore::Add(const std::string& key,
const ClientState& client_state,
UpdateCallback callback) {
Update(key, client_state, std::move(callback));
}
void ImpressionStore::Update(const std::string& key,
const ClientState& client_state,
UpdateCallback callback) {
auto entries_to_save = std::make_unique<KeyEntryVector>();
entries_to_save->emplace_back(std::make_pair(key, client_state));
db_->UpdateEntries(std::move(entries_to_save),
std::make_unique<KeyVector>() /*keys_to_remove*/,
std::move(callback));
}
void ImpressionStore::Delete(const std::string& key, UpdateCallback callback) {
auto keys_to_delete = std::make_unique<KeyVector>();
keys_to_delete->emplace_back(key);
db_->UpdateEntries(std::make_unique<KeyEntryVector>() /*entries_to_save*/,
std::move(keys_to_delete), std::move(callback));
}
} // namespace notifications
|