Modern IDB: Refactor memory objectstore/transaction interation.
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / server / MemoryIDBBackingStore.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. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef MemoryIDBBackingStore_h
27 #define MemoryIDBBackingStore_h
28
29 #if ENABLE(INDEXED_DATABASE)
30
31 #include "IDBBackingStore.h"
32 #include "IDBDatabaseIdentifier.h"
33 #include "IDBResourceIdentifier.h"
34 #include "MemoryBackingStoreTransaction.h"
35 #include <wtf/HashMap.h>
36
37 namespace WebCore {
38 namespace IDBServer {
39
40 class MemoryObjectStore;
41
42 class MemoryIDBBackingStore : public IDBBackingStore {
43     friend std::unique_ptr<MemoryIDBBackingStore> std::make_unique<MemoryIDBBackingStore>(const WebCore::IDBDatabaseIdentifier&);
44 public:
45     static std::unique_ptr<MemoryIDBBackingStore> create(const IDBDatabaseIdentifier&);
46     
47     virtual ~MemoryIDBBackingStore() override final;
48
49     virtual const IDBDatabaseInfo& getOrEstablishDatabaseInfo() override final;
50     void setDatabaseInfo(const IDBDatabaseInfo&);
51
52     virtual IDBError beginTransaction(const IDBTransactionInfo&) override final;
53     virtual IDBError abortTransaction(const IDBResourceIdentifier& transactionIdentifier) override final;
54     virtual IDBError commitTransaction(const IDBResourceIdentifier& transactionIdentifier) override final;
55     virtual IDBError createObjectStore(const IDBResourceIdentifier& transactionIdentifier, const IDBObjectStoreInfo&) override final;
56     virtual IDBError deleteObjectStore(const IDBResourceIdentifier& transactionIdentifier, const String& objectStoreName) override final;
57     virtual IDBError clearObjectStore(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier) override final;
58     virtual IDBError createIndex(const IDBResourceIdentifier& transactionIdentifier, const IDBIndexInfo&) override final;
59     virtual IDBError keyExistsInObjectStore(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, const IDBKeyData&, bool& keyExists) override final;
60     virtual IDBError deleteRange(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, const IDBKeyRangeData&) override final;
61     virtual IDBError addRecord(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, const IDBKeyData&, const ThreadSafeDataBuffer& value) override final;
62     virtual IDBError getRecord(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, const IDBKeyRangeData&, ThreadSafeDataBuffer& outValue) override final;
63     virtual IDBError getIndexRecord(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, IndexedDB::IndexRecordType, const IDBKeyRangeData&, IDBGetResult& outValue) override final;
64     virtual IDBError getCount(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const IDBKeyRangeData&, uint64_t& outCount) override final;
65     virtual IDBError generateKeyNumber(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, uint64_t& keyNumber) override final;
66
67     void removeObjectStoreForVersionChangeAbort(MemoryObjectStore&);
68     void restoreObjectStoreForVersionChangeAbort(std::unique_ptr<MemoryObjectStore>&&);
69
70 private:
71     MemoryIDBBackingStore(const IDBDatabaseIdentifier&);
72
73     std::unique_ptr<MemoryObjectStore> takeObjectStoreByName(const String& name);
74
75     IDBDatabaseIdentifier m_identifier;
76     std::unique_ptr<IDBDatabaseInfo> m_databaseInfo;
77
78     HashMap<IDBResourceIdentifier, std::unique_ptr<MemoryBackingStoreTransaction>> m_transactions;
79
80     void registerObjectStore(std::unique_ptr<MemoryObjectStore>&&);
81     void unregisterObjectStore(MemoryObjectStore&);
82     HashMap<uint64_t, std::unique_ptr<MemoryObjectStore>> m_objectStoresByIdentifier;
83     HashMap<String, MemoryObjectStore*> m_objectStoresByName;
84 };
85
86 } // namespace IDBServer
87 } // namespace WebCore
88
89 #endif // ENABLE(INDEXED_DATABASE)
90 #endif // MemoryIDBBackingStore_h