[WTF] Import std::optional reference implementation as WTF::Optional
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / server / MemoryObjectStore.h
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 "IDBKeyData.h"
31 #include "IDBObjectStoreInfo.h"
32 #include "MemoryIndex.h"
33 #include "MemoryObjectStoreCursor.h"
34 #include "ThreadSafeDataBuffer.h"
35 #include <set>
36 #include <wtf/HashMap.h>
37 #include <wtf/RefCounted.h>
38
39 namespace WebCore {
40
41 class IDBCursorInfo;
42 class IDBError;
43 class IDBGetAllResult;
44 class IDBKeyData;
45 class IDBValue;
46
47 struct IDBKeyRangeData;
48
49 namespace IndexedDB {
50 enum class GetAllType;
51 enum class IndexRecordType;
52 }
53
54 namespace IDBServer {
55
56 class MemoryBackingStoreTransaction;
57
58 typedef HashMap<IDBKeyData, ThreadSafeDataBuffer, IDBKeyDataHash, IDBKeyDataHashTraits> KeyValueMap;
59
60 class MemoryObjectStore : public RefCounted<MemoryObjectStore> {
61 public:
62     static Ref<MemoryObjectStore> create(const IDBObjectStoreInfo&);
63
64     ~MemoryObjectStore();
65
66     void writeTransactionStarted(MemoryBackingStoreTransaction&);
67     void writeTransactionFinished(MemoryBackingStoreTransaction&);
68     MemoryBackingStoreTransaction* writeTransaction() { return m_writeTransaction; }
69
70     IDBError createIndex(MemoryBackingStoreTransaction&, const IDBIndexInfo&);
71     IDBError deleteIndex(MemoryBackingStoreTransaction&, uint64_t indexIdentifier);
72     void deleteAllIndexes(MemoryBackingStoreTransaction&);
73     void registerIndex(Ref<MemoryIndex>&&);
74
75     bool containsRecord(const IDBKeyData&);
76     void deleteRecord(const IDBKeyData&);
77     void deleteRange(const IDBKeyRangeData&);
78     IDBError addRecord(MemoryBackingStoreTransaction&, const IDBKeyData&, const IDBValue&);
79
80     uint64_t currentKeyGeneratorValue() const { return m_keyGeneratorValue; }
81     void setKeyGeneratorValue(uint64_t value) { m_keyGeneratorValue = value; }
82
83     void clear();
84     void replaceKeyValueStore(std::unique_ptr<KeyValueMap>&&, std::unique_ptr<std::set<IDBKeyData>>&&);
85
86     ThreadSafeDataBuffer valueForKey(const IDBKeyData&) const;
87     ThreadSafeDataBuffer valueForKeyRange(const IDBKeyRangeData&) const;
88     IDBGetResult indexValueForKeyRange(uint64_t indexIdentifier, IndexedDB::IndexRecordType, const IDBKeyRangeData&) const;
89     uint64_t countForKeyRange(uint64_t indexIdentifier, const IDBKeyRangeData&) const;
90
91     void getAllRecords(const IDBKeyRangeData&, std::optional<uint32_t> count, IndexedDB::GetAllType, IDBGetAllResult&) const;
92
93     const IDBObjectStoreInfo& info() const { return m_info; }
94
95     MemoryObjectStoreCursor* maybeOpenCursor(const IDBCursorInfo&);
96
97     std::set<IDBKeyData>* orderedKeys() { return m_orderedKeys.get(); }
98
99     MemoryIndex* indexForIdentifier(uint64_t);
100
101     void maybeRestoreDeletedIndex(Ref<MemoryIndex>&&);
102
103     void rename(const String& newName) { m_info.rename(newName); }
104     void renameIndex(MemoryIndex&, const String& newName);
105
106 private:
107     MemoryObjectStore(const IDBObjectStoreInfo&);
108
109     IDBKeyData lowestKeyWithRecordInRange(const IDBKeyRangeData&) const;
110     std::set<IDBKeyData>::iterator lowestIteratorInRange(const IDBKeyRangeData&, bool reverse) const;
111
112     IDBError populateIndexWithExistingRecords(MemoryIndex&);
113     IDBError updateIndexesForPutRecord(const IDBKeyData&, const ThreadSafeDataBuffer& value);
114     void updateIndexesForDeleteRecord(const IDBKeyData& value);
115     void updateCursorsForPutRecord(std::set<IDBKeyData>::iterator);
116     void updateCursorsForDeleteRecord(const IDBKeyData&);
117
118     RefPtr<MemoryIndex> takeIndexByIdentifier(uint64_t indexIdentifier);
119
120     IDBObjectStoreInfo m_info;
121
122     MemoryBackingStoreTransaction* m_writeTransaction { nullptr };
123     uint64_t m_keyGeneratorValue { 1 };
124
125     std::unique_ptr<KeyValueMap> m_keyValueStore;
126     std::unique_ptr<std::set<IDBKeyData>> m_orderedKeys;
127
128     void unregisterIndex(MemoryIndex&);
129     HashMap<uint64_t, RefPtr<MemoryIndex>> m_indexesByIdentifier;
130     HashMap<String, RefPtr<MemoryIndex>> m_indexesByName;
131     HashMap<IDBResourceIdentifier, std::unique_ptr<MemoryObjectStoreCursor>> m_cursors;
132 };
133
134 } // namespace IDBServer
135 } // namespace WebCore
136
137 #endif // ENABLE(INDEXED_DATABASE)