1
0
Fork 0
mirror of https://github.com/LadybirdBrowser/ladybird.git synced 2025-06-08 05:27:14 +09:00
ladybird/Libraries/LibWeb/IndexedDB/Internal/Index.h

77 lines
2.7 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (c) 2025, stelar7 <dudedbz@gmail.com>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/Vector.h>
#include <LibGC/Ptr.h>
#include <LibJS/Heap/Cell.h>
#include <LibJS/Runtime/Realm.h>
#include <LibWeb/IndexedDB/Internal/ObjectStore.h>
namespace Web::IndexedDB {
using KeyPath = Variant<String, Vector<String>>;
// https://w3c.github.io/IndexedDB/#index-list-of-records
struct IndexRecord {
GC::Ref<Key> key;
GC::Ref<Key> value;
};
// https://w3c.github.io/IndexedDB/#index-construct
class Index : public JS::Cell {
GC_CELL(Index, JS::Cell);
GC_DECLARE_ALLOCATOR(Index);
public:
[[nodiscard]] static GC::Ref<Index> create(JS::Realm&, GC::Ref<ObjectStore>, String const&, KeyPath const&, bool, bool);
virtual ~Index();
void set_name(String name);
[[nodiscard]] String name() const { return m_name; }
[[nodiscard]] bool unique() const { return m_unique; }
[[nodiscard]] bool multi_entry() const { return m_multi_entry; }
[[nodiscard]] GC::Ref<ObjectStore> object_store() const { return m_object_store; }
[[nodiscard]] AK::ReadonlySpan<IndexRecord> records() const { return m_records; }
[[nodiscard]] KeyPath const& key_path() const { return m_key_path; }
[[nodiscard]] bool has_record_with_key(GC::Ref<Key> key);
void clear_records();
Optional<IndexRecord&> first_in_range(GC::Ref<IDBKeyRange> range);
GC::ConservativeVector<IndexRecord> first_n_in_range(GC::Ref<IDBKeyRange> range, Optional<WebIDL::UnsignedLong> count);
u64 count_records_in_range(GC::Ref<IDBKeyRange> range);
void store_a_record(IndexRecord const& record);
void remove_records_with_value_in_range(GC::Ref<IDBKeyRange> range);
HTML::SerializationRecord referenced_value(IndexRecord const& index_record) const;
protected:
virtual void visit_edges(Visitor&) override;
private:
Index(GC::Ref<ObjectStore>, String const&, KeyPath const&, bool, bool);
// An index [...] has a referenced object store.
GC::Ref<ObjectStore> m_object_store;
// The index has a list of records which hold the data stored in the index.
Vector<IndexRecord> m_records;
// An index has a name, which is a name. At any one time, the name is unique within indexs referenced object store.
String m_name;
// An index has a unique flag. When true, the index enforces that no two records in the index has the same key.
bool m_unique { false };
// An index has a multiEntry flag. This flag affects how the index behaves when the result of evaluating the indexs key path yields an array key.
bool m_multi_entry { false };
// The keys are derived from the referenced object stores values using a key path.
KeyPath m_key_path;
};
}