1/*
2 * Copyright (C) 2015 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#pragma once
27
28#if ENABLE(INDEXED_DATABASE)
29
30#include "IDBIndexInfo.h"
31#include "IDBResourceIdentifier.h"
32#include <wtf/HashMap.h>
33#include <wtf/HashSet.h>
34
35namespace WebCore {
36
37class IDBCursorInfo;
38class IDBError;
39class IDBGetAllResult;
40class IDBGetResult;
41class IDBKeyData;
42class IndexKey;
43class ThreadSafeDataBuffer;
44
45struct IDBKeyRangeData;
46
47namespace IndexedDB {
48enum class GetAllType;
49enum class IndexRecordType;
50}
51
52namespace IDBServer {
53
54class IndexValueStore;
55class MemoryBackingStoreTransaction;
56class MemoryIndexCursor;
57class MemoryObjectStore;
58
59class MemoryIndex : public RefCounted<MemoryIndex> {
60public:
61 static Ref<MemoryIndex> create(const IDBIndexInfo&, MemoryObjectStore&);
62
63 ~MemoryIndex();
64
65 const IDBIndexInfo& info() const { return m_info; }
66
67 void rename(const String& newName) { m_info.rename(newName); }
68
69 IDBGetResult getResultForKeyRange(IndexedDB::IndexRecordType, const IDBKeyRangeData&) const;
70 uint64_t countForKeyRange(const IDBKeyRangeData&);
71 void getAllRecords(const IDBKeyRangeData&, Optional<uint32_t> count, IndexedDB::GetAllType, IDBGetAllResult&) const;
72
73 IDBError putIndexKey(const IDBKeyData&, const IndexKey&);
74
75 void removeEntriesWithValueKey(const IDBKeyData&);
76 void removeRecord(const IDBKeyData&, const IndexKey&);
77
78 void objectStoreCleared();
79 void clearIndexValueStore();
80 void replaceIndexValueStore(std::unique_ptr<IndexValueStore>&&);
81
82 MemoryIndexCursor* maybeOpenCursor(const IDBCursorInfo&);
83
84 IndexValueStore* valueStore() { return m_records.get(); }
85
86 MemoryObjectStore& objectStore() { return m_objectStore; }
87
88 void cursorDidBecomeClean(MemoryIndexCursor&);
89 void cursorDidBecomeDirty(MemoryIndexCursor&);
90
91 void notifyCursorsOfValueChange(const IDBKeyData& indexKey, const IDBKeyData& primaryKey);
92
93private:
94 MemoryIndex(const IDBIndexInfo&, MemoryObjectStore&);
95
96 uint64_t recordCountForKey(const IDBKeyData&) const;
97
98 void notifyCursorsOfAllRecordsChanged();
99
100 IDBIndexInfo m_info;
101 MemoryObjectStore& m_objectStore;
102
103 std::unique_ptr<IndexValueStore> m_records;
104
105 HashMap<IDBResourceIdentifier, std::unique_ptr<MemoryIndexCursor>> m_cursors;
106 HashSet<MemoryIndexCursor*> m_cleanCursors;
107};
108
109} // namespace IDBServer
110} // namespace WebCore
111
112#endif // ENABLE(INDEXED_DATABASE)
113