blob: b30658818095aebdb59dc48c4d5ce4a2ce3eefc2 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_PERSISTENT_CACHE_SQLITE_SQLITE_BACKEND_IMPL_H_
#define COMPONENTS_PERSISTENT_CACHE_SQLITE_SQLITE_BACKEND_IMPL_H_
#include <memory>
#include <optional>
#include "base/component_export.h"
#include "base/files/file_path.h"
#include "base/types/pass_key.h"
#include "components/persistent_cache/backend.h"
#include "components/persistent_cache/backend_params.h"
#include "components/persistent_cache/entry.h"
#include "components/persistent_cache/sqlite/vfs/sqlite_database_vfs_file_set.h"
#include "components/persistent_cache/sqlite/vfs/sqlite_sandboxed_vfs.h"
#include "sql/database.h"
namespace persistent_cache {
class COMPONENT_EXPORT(PERSISTENT_CACHE) SqliteBackendImpl : public Backend {
public:
using Passkey = base::PassKey<SqliteBackendImpl>;
explicit SqliteBackendImpl(BackendParams backend_params);
explicit SqliteBackendImpl(SqliteVfsFileSet vfs_file_set);
~SqliteBackendImpl() override;
SqliteBackendImpl(const SqliteBackendImpl&) = delete;
SqliteBackendImpl(SqliteBackendImpl&&) = delete;
SqliteBackendImpl& operator=(const SqliteBackendImpl&) = delete;
SqliteBackendImpl& operator=(SqliteBackendImpl&&) = delete;
// `Backend`:
[[nodiscard]] bool Initialize() override;
[[nodiscard]] std::unique_ptr<Entry> Find(std::string_view key) override;
void Insert(std::string_view key,
base::span<const uint8_t> content,
EntryMetadata metadata) override;
BackendType GetType() const override;
bool IsReadOnly() const override;
private:
static SqliteVfsFileSet GetVfsFileSetFromParams(BackendParams backend_params);
base::FilePath database_path_;
// The set of of `SanboxedFiles` accessible by this backend. This class owns
// the `SandboxedFiles`.
SqliteVfsFileSet vfs_file_set_;
// Owns the registration / unregistration of the `SanboxedFiles` own by this
// backend to the `SqliteSandboxedVfsDelegate`. Must be defined after
// `vfs_file_set_` to ensures unregistration occurs before the `vfs_file_set_`
// is released.
SqliteSandboxedVfsDelegate::UnregisterRunner unregister_runner_;
// Defined after `unregister_runner_` to ensure that files remain available
// through the VFS throughout the database's lifetime.
sql::Database db_;
bool initialized_ = false;
};
} // namespace persistent_cache
#endif // COMPONENTS_PERSISTENT_CACHE_SQLITE_SQLITE_BACKEND_IMPL_H_