Modern IDB: Memory indexes aren't deleted when their owning memory object stores...
[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 #ifndef MemoryObjectStore_h
27 #define MemoryObjectStore_h
28
29 #if ENABLE(INDEXED_DATABASE)
30
31 #include "IDBKeyData.h"
32 #include "IDBObjectStoreInfo.h"
33 #include "MemoryIndex.h"
34 #include "MemoryObjectStoreCursor.h"
35 #include "ThreadSafeDataBuffer.h"
36 #include <set>
37 #include <wtf/HashMap.h>
38
39 namespace WebCore {
40
41 class IDBCursorInfo;
42 class IDBError;
43 class IDBKeyData;
44
45 struct IDBKeyRangeData;
46
47 namespace IndexedDB {
48 enum class IndexRecordType;
49 }
50
51 namespace IDBServer {
52
53 class MemoryBackingStoreTransaction;
54
55 typedef HashMap<IDBKeyData, ThreadSafeDataBuffer, IDBKeyDataHash, IDBKeyDataHashTraits> KeyValueMap;
56
57 class MemoryObjectStore {
58     friend std::unique_ptr<MemoryObjectStore> std::make_unique<MemoryObjectStore>(const WebCore::IDBObjectStoreInfo&);
59 public:
60     static std::unique_ptr<MemoryObjectStore> create(const IDBObjectStoreInfo&);
61
62     ~MemoryObjectStore();
63
64     void writeTransactionStarted(MemoryBackingStoreTransaction&);
65     void writeTransactionFinished(MemoryBackingStoreTransaction&);
66     MemoryBackingStoreTransaction* writeTransaction() { return m_writeTransaction; }
67
68     IDBError createIndex(MemoryBackingStoreTransaction&, const IDBIndexInfo&);
69     IDBError deleteIndex(MemoryBackingStoreTransaction&, const String& indexName);
70     void deleteAllIndexes(MemoryBackingStoreTransaction&);
71     void registerIndex(std::unique_ptr<MemoryIndex>&&);
72
73     bool containsRecord(const IDBKeyData&);
74     void deleteRecord(const IDBKeyData&);
75     void deleteRange(const IDBKeyRangeData&);
76     IDBError addRecord(MemoryBackingStoreTransaction&, const IDBKeyData&, const ThreadSafeDataBuffer& value);
77
78     uint64_t currentKeyGeneratorValue() const { return m_keyGeneratorValue; }
79     void setKeyGeneratorValue(uint64_t value) { m_keyGeneratorValue = value; }
80
81     void clear();
82     void replaceKeyValueStore(std::unique_ptr<KeyValueMap>&&, std::unique_ptr<std::set<IDBKeyData>>&&);
83
84     ThreadSafeDataBuffer valueForKey(const IDBKeyData&) const;
85     ThreadSafeDataBuffer valueForKeyRange(const IDBKeyRangeData&) const;
86     IDBGetResult indexValueForKeyRange(uint64_t indexIdentifier, IndexedDB::IndexRecordType, const IDBKeyRangeData&) const;
87     uint64_t countForKeyRange(uint64_t indexIdentifier, const IDBKeyRangeData&) const;
88
89     const IDBObjectStoreInfo& info() const { return m_info; }
90
91     MemoryObjectStoreCursor* maybeOpenCursor(const IDBCursorInfo&);
92
93     std::set<IDBKeyData>* orderedKeys() { return m_orderedKeys.get(); }
94
95     MemoryIndex* indexForIdentifier(uint64_t);
96
97     void maybeRestoreDeletedIndex(std::unique_ptr<MemoryIndex>);
98
99 private:
100     MemoryObjectStore(const IDBObjectStoreInfo&);
101
102     IDBKeyData lowestKeyWithRecordInRange(const IDBKeyRangeData&) const;
103     std::set<IDBKeyData>::iterator lowestIteratorInRange(const IDBKeyRangeData&, bool reverse) const;
104
105     IDBError populateIndexWithExistingRecords(MemoryIndex&);
106     IDBError updateIndexesForPutRecord(const IDBKeyData&, const ThreadSafeDataBuffer& value);
107     void updateIndexesForDeleteRecord(const IDBKeyData& value);
108     void updateCursorsForPutRecord(std::set<IDBKeyData>::iterator);
109     void updateCursorsForDeleteRecord(const IDBKeyData&);
110
111     std::unique_ptr<MemoryIndex> takeIndexByName(const String& name);
112
113     IDBObjectStoreInfo m_info;
114
115     MemoryBackingStoreTransaction* m_writeTransaction { nullptr };
116     uint64_t m_keyGeneratorValue { 1 };
117
118     std::unique_ptr<KeyValueMap> m_keyValueStore;
119     std::unique_ptr<std::set<IDBKeyData>> m_orderedKeys;
120
121     void unregisterIndex(MemoryIndex&);
122     HashMap<uint64_t, std::unique_ptr<MemoryIndex>> m_indexesByIdentifier;
123     HashMap<String, MemoryIndex*> m_indexesByName;
124     HashMap<IDBResourceIdentifier, std::unique_ptr<MemoryObjectStoreCursor>> m_cursors;
125 };
126
127 } // namespace IDBServer
128 } // namespace WebCore
129
130 #endif // ENABLE(INDEXED_DATABASE)
131 #endif // MemoryObjectStore_h