// 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/feature_engagement_tracker/internal/persistent_store.h" #include #include "base/bind.h" #include "base/memory/ptr_util.h" #include "components/feature_engagement_tracker/internal/stats.h" namespace feature_engagement_tracker { namespace { // Corresponds to a UMA suffix "LevelDBOpenResults" in histograms.xml. // Please do not change. const char kDatabaseUMAName[] = "FeatureEngagementTrackerEventStore"; using KeyEventPair = std::pair; using KeyEventList = std::vector; void NoopUpdateCallback(bool success) { stats::RecordDbUpdate(success, stats::StoreType::EVENTS_STORE); } } // namespace PersistentStore::PersistentStore( const base::FilePath& storage_dir, std::unique_ptr> db) : storage_dir_(storage_dir), db_(std::move(db)), ready_(false), weak_ptr_factory_(this) {} PersistentStore::~PersistentStore() = default; void PersistentStore::Load(const OnLoadedCallback& callback) { DCHECK(!ready_); db_->Init(kDatabaseUMAName, storage_dir_, base::Bind(&PersistentStore::OnInitComplete, weak_ptr_factory_.GetWeakPtr(), callback)); } bool PersistentStore::IsReady() const { return ready_; } void PersistentStore::WriteEvent(const Event& event) { DCHECK(IsReady()); std::unique_ptr entries = base::MakeUnique(); entries->push_back(KeyEventPair(event.name(), event)); db_->UpdateEntries(std::move(entries), base::MakeUnique>(), base::Bind(&NoopUpdateCallback)); } void PersistentStore::DeleteEvent(const std::string& event_name) { DCHECK(IsReady()); auto deletes = base::MakeUnique>(); deletes->push_back(event_name); db_->UpdateEntries(base::MakeUnique(), std::move(deletes), base::Bind(&NoopUpdateCallback)); } void PersistentStore::OnInitComplete(const OnLoadedCallback& callback, bool success) { stats::RecordDbInitEvent(success, stats::StoreType::EVENTS_STORE); if (!success) { callback.Run(false, base::MakeUnique>()); return; } db_->LoadEntries(base::Bind(&PersistentStore::OnLoadComplete, weak_ptr_factory_.GetWeakPtr(), callback)); } void PersistentStore::OnLoadComplete( const OnLoadedCallback& callback, bool success, std::unique_ptr> entries) { stats::RecordEventDbLoadEvent(success, *entries.get()); ready_ = success; callback.Run(success, std::move(entries)); } } // namespace feature_engagement_tracker