15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     documentation and/or other materials provided with the distribution.
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef IDBObjectStore_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define IDBObjectStore_h
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptWrappable.h"
30197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/SerializedScriptValue.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/indexeddb/IDBCursor.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/indexeddb/IDBIndex.h"
337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "modules/indexeddb/IDBIndexParameters.h"
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/indexeddb/IDBKey.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/indexeddb/IDBKeyRange.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/indexeddb/IDBMetadata.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/indexeddb/IDBRequest.h"
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/indexeddb/IDBTransaction.h"
3909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "public/platform/WebIDBCursor.h"
4051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "public/platform/WebIDBDatabase.h"
4176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "public/platform/WebIDBTypes.h"
4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/PassRefPtr.h"
4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/RefPtr.h"
4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/text/WTFString.h"
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class DOMStringList;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class IDBAny;
50e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochclass ExceptionState;
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
52d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)class IDBObjectStore : public GarbageCollectedFinalized<IDBObjectStore>, public ScriptWrappable {
537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    DEFINE_WRAPPERTYPEINFO();
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
55d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    static IDBObjectStore* create(const IDBObjectStoreMetadata& metadata, IDBTransaction* transaction)
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
57d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return new IDBObjectStore(metadata, transaction);
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ~IDBObjectStore() { }
60323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    void trace(Visitor*);
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Implement the IDBObjectStore IDL
63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int64_t id() const { return m_metadata.id; }
64c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    const String& name() const { return m_metadata.name; }
65f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    ScriptValue keyPath(ScriptState*) const;
66323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    PassRefPtrWillBeRawPtr<DOMStringList> indexNames() const;
67f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    IDBTransaction* transaction() const { return m_transaction.get(); }
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool autoIncrement() const { return m_metadata.autoIncrement; }
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
70d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    IDBRequest* openCursor(ScriptState*, const ScriptValue& range, const String& direction, ExceptionState&);
71d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    IDBRequest* openKeyCursor(ScriptState*, const ScriptValue& range, const String& direction, ExceptionState&);
72d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    IDBRequest* get(ScriptState*, const ScriptValue& key, ExceptionState&);
737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    IDBRequest* add(ScriptState*, const ScriptValue&, const ScriptValue& key, ExceptionState&);
747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    IDBRequest* put(ScriptState*, const ScriptValue&, const ScriptValue& key, ExceptionState&);
75d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    IDBRequest* deleteFunction(ScriptState*, const ScriptValue& key, ExceptionState&);
76d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    IDBRequest* clear(ScriptState*, ExceptionState&);
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    IDBIndex* createIndex(ScriptState* scriptState, const String& name, const String& keyPath, const IDBIndexParameters& options, ExceptionState& exceptionState)
796f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    {
806f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        return createIndex(scriptState, name, IDBKeyPath(keyPath), options, exceptionState);
816f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    }
827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    IDBIndex* createIndex(ScriptState* scriptState, const String& name, const Vector<String>& keyPath, const IDBIndexParameters& options, ExceptionState& exceptionState)
836f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    {
846f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        return createIndex(scriptState, name, IDBKeyPath(keyPath), options, exceptionState);
856f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    }
86d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    IDBIndex* index(const String& name, ExceptionState&);
87e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    void deleteIndex(const String& name, ExceptionState&);
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
89d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    IDBRequest* count(ScriptState*, const ScriptValue& range, ExceptionState&);
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // Used by IDBCursor::update():
927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    IDBRequest* put(ScriptState*, WebIDBPutMode, IDBAny* source, const ScriptValue&, IDBKey*, ExceptionState&);
9353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
94c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    // Used internally and by InspectorIndexedDBAgent:
95e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    IDBRequest* openCursor(ScriptState*, IDBKeyRange*, WebIDBCursorDirection, WebIDBTaskType = WebIDBTaskTypeNormal);
96c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void markDeleted() { m_deleted = true; }
9853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    bool isDeleted() const { return m_deleted; }
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void transactionFinished();
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    const IDBObjectStoreMetadata& metadata() const { return m_metadata; }
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setMetadata(const IDBObjectStoreMetadata& metadata) { m_metadata = metadata; }
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
104d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    typedef HeapVector<Member<IDBKey> > IndexKeys;
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
106e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WebIDBDatabase* backendDB() const;
10751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    IDBObjectStore(const IDBObjectStoreMetadata&, IDBTransaction*);
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    IDBIndex* createIndex(ScriptState*, const String& name, const IDBKeyPath&, const IDBIndexParameters&, ExceptionState&);
1127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    IDBRequest* put(ScriptState*, WebIDBPutMode, IDBAny* source, const ScriptValue&, const ScriptValue& key, ExceptionState&);
11353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int64_t findIndexId(const String& name) const;
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool containsIndex(const String& name) const
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return findIndexId(name) != IDBIndexMetadata::InvalidId;
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IDBObjectStoreMetadata m_metadata;
121d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    Member<IDBTransaction> m_transaction;
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_deleted;
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
124d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    typedef HeapHashMap<String, Member<IDBIndex> > IDBIndexMap;
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IDBIndexMap m_indexMap;
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
128c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // IDBObjectStore_h
131