/* * Copyright (c) 2024-2025, stelar7 * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include namespace Web::IndexedDB { // https://www.w3.org/TR/IndexedDB/#database-construct class Database : public Bindings::PlatformObject { WEB_PLATFORM_OBJECT(Database, Bindings::PlatformObject); GC_DECLARE_ALLOCATOR(Database); public: void set_version(u64 version) { m_version = version; } u64 version() const { return m_version; } String name() const { return m_name; } void set_upgrade_transaction(GC::Ptr transaction) { m_upgrade_transaction = transaction; } [[nodiscard]] GC::Ptr upgrade_transaction() { return m_upgrade_transaction; } void associate(GC::Ref connection) { m_associated_connections.append(connection); } ReadonlySpan> associated_connections() { return m_associated_connections; } Vector> associated_connections_except(IDBDatabase& connection) { Vector> connections; for (auto& associated_connection : m_associated_connections) { if (associated_connection != &connection) connections.append(associated_connection); } return connections; } bool has_object_store_named(String const& name) const; void add_object_store(GC::Ref object_store) { m_object_stores.append(object_store); } [[nodiscard]] static Vector> for_key(StorageAPI::StorageKey const&); [[nodiscard]] static Optional const&> for_key_and_name(StorageAPI::StorageKey&, String&); [[nodiscard]] static ErrorOr> create_for_key_and_name(JS::Realm&, StorageAPI::StorageKey&, String&); [[nodiscard]] static ErrorOr delete_for_key_and_name(StorageAPI::StorageKey&, String&); [[nodiscard]] static GC::Ref create(JS::Realm&, String const&); virtual ~Database(); protected: explicit Database(IDBDatabase& database); explicit Database(JS::Realm& realm, String name) : PlatformObject(realm) , m_name(move(name)) { } virtual void visit_edges(Visitor&) override; private: Vector> m_associated_connections; // A database has a name which identifies it within a specific storage key. String m_name; // A database has a version. When a database is first created, its version is 0 (zero). u64 m_version { 0 }; // A database has at most one associated upgrade transaction, which is either null or an upgrade transaction, and is initially null. GC::Ptr m_upgrade_transaction; // A database has zero or more object stores which hold the data stored in the database. Vector> m_object_stores; }; }