| // Copyright 2018 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. |
| |
| #ifndef COMPONENTS_IMAGE_FETCHER_CORE_CACHE_IMAGE_METADATA_STORE_LEVELDB_H_ |
| #define COMPONENTS_IMAGE_FETCHER_CORE_CACHE_IMAGE_METADATA_STORE_LEVELDB_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include "base/memory/weak_ptr.h" |
| #include "base/time/time.h" |
| #include "components/image_fetcher/core/cache/image_metadata_store.h" |
| #include "components/image_fetcher/core/cache/image_store_types.h" |
| #include "components/leveldb_proto/public/proto_database.h" |
| |
| namespace base { |
| class Clock; |
| class SequencedTaskRunner; |
| } // namespace base |
| |
| namespace leveldb_proto { |
| class ProtoDatabaseProvider; |
| } // namespace leveldb_proto |
| |
| namespace image_fetcher { |
| |
| class CachedImageMetadataProto; |
| |
| // Stores image metadata in leveldb. |
| class ImageMetadataStoreLevelDB : public ImageMetadataStore { |
| public: |
| // Initializes the database with |proto_database_provider|. |
| ImageMetadataStoreLevelDB( |
| leveldb_proto::ProtoDatabaseProvider* proto_database_provider, |
| const base::FilePath& database_dir, |
| scoped_refptr<base::SequencedTaskRunner> task_runner, |
| base::Clock* clock); |
| |
| // Creates storage using the given |database| for local storage. Useful for |
| // testing. |
| ImageMetadataStoreLevelDB( |
| std::unique_ptr<leveldb_proto::ProtoDatabase<CachedImageMetadataProto>> |
| database, |
| base::Clock* clock); |
| ~ImageMetadataStoreLevelDB() override; |
| |
| // ImageMetadataStorage: |
| void Initialize(base::OnceClosure callback) override; |
| bool IsInitialized() override; |
| void SaveImageMetadata(const std::string& key, |
| const size_t data_size) override; |
| void DeleteImageMetadata(const std::string& key) override; |
| void UpdateImageMetadata(const std::string& key) override; |
| void GetAllKeys(KeysCallback callback) override; |
| // Gets a size estimate. This is updated when things are added to the cache |
| // and when eviction is performed. This doesn't update more often because |
| // we want to minimize disk io. If the estimate is inaccurate, it's either 0 |
| // which means it hasn't been calculated yet, or it's an over-estimate. In |
| // the case of an over estimate, it will be recified if you call into an |
| // eviction routine. |
| int GetEstimatedSize() override; |
| void EvictImageMetadata(base::Time expiration_time, |
| const size_t bytes_left, |
| KeysCallback callback) override; |
| |
| private: |
| void OnDatabaseInitialized(base::OnceClosure callback, |
| leveldb_proto::Enums::InitStatus status); |
| void OnImageUpdated(bool success); |
| void UpdateImageMetadataImpl( |
| bool success, |
| std::unique_ptr<std::vector<CachedImageMetadataProto>> entries); |
| void GetAllKeysImpl(KeysCallback callback, |
| bool success, |
| std::unique_ptr<std::vector<std::string>> keys); |
| void EvictImageMetadataImpl( |
| base::Time expiration_time, |
| const size_t bytes_left, |
| KeysCallback callback, |
| bool success, |
| std::unique_ptr<std::vector<CachedImageMetadataProto>> entries); |
| void OnEvictImageMetadataDone(KeysCallback callback, |
| std::vector<std::string> deleted_keys, |
| bool success); |
| |
| int estimated_size_; |
| InitializationStatus initialization_status_; |
| std::unique_ptr<leveldb_proto::ProtoDatabase<CachedImageMetadataProto>> |
| database_; |
| // Clock is owned by the service that creates this object. |
| base::Clock* clock_; |
| base::WeakPtrFactory<ImageMetadataStoreLevelDB> weak_ptr_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ImageMetadataStoreLevelDB); |
| }; |
| |
| } // namespace image_fetcher |
| |
| #endif // COMPONENTS_IMAGE_FETCHER_CORE_CACHE_IMAGE_METADATA_STORE_LEVELDB_H_ |