69750eb739e6807db1187dc0e6c844fc85012b27
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / IDBTransaction.h
1 /*
2  * Copyright (C) 2010 Google 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  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef IDBTransaction_h
27 #define IDBTransaction_h
28
29 #if ENABLE(INDEXED_DATABASE)
30
31 #include "ActiveDOMObject.h"
32 #include "DOMError.h"
33 #include "Event.h"
34 #include "EventListener.h"
35 #include "EventNames.h"
36 #include "EventTarget.h"
37 #include "IDBMetadata.h"
38 #include "ScriptWrappable.h"
39 #include <wtf/HashSet.h>
40 #include <wtf/RefCounted.h>
41
42 namespace WebCore {
43
44 class IDBCursor;
45 class IDBDatabase;
46 class IDBDatabaseBackendInterface;
47 class IDBDatabaseError;
48 class IDBObjectStore;
49 class IDBOpenDBRequest;
50 struct IDBObjectStoreMetadata;
51
52 class IDBTransaction : public ScriptWrappable, public RefCounted<IDBTransaction>, public EventTarget, public ActiveDOMObject {
53 public:
54     enum Mode {
55         READ_ONLY = 0,
56         READ_WRITE = 1,
57         VERSION_CHANGE = 2
58     };
59
60     static PassRefPtr<IDBTransaction> create(ScriptExecutionContext*, int64_t, const Vector<String>& objectStoreNames, Mode, IDBDatabase*);
61     static PassRefPtr<IDBTransaction> create(ScriptExecutionContext*, int64_t, IDBDatabase*, IDBOpenDBRequest*, const IDBDatabaseMetadata& previousMetadata);
62     virtual ~IDBTransaction();
63
64     static const AtomicString& modeReadOnly();
65     static const AtomicString& modeReadWrite();
66     static const AtomicString& modeVersionChange();
67     static const AtomicString& modeReadOnlyLegacy();
68     static const AtomicString& modeReadWriteLegacy();
69
70     static Mode stringToMode(const String&, ScriptExecutionContext*, ExceptionCode&);
71     static const AtomicString& modeToString(Mode);
72
73     IDBDatabaseBackendInterface* backendDB() const;
74
75     int64_t id() const { return m_id; }
76     bool isActive() const { return m_state == Active; }
77     bool isFinished() const { return m_state == Finished; }
78     bool isReadOnly() const { return m_mode == READ_ONLY; }
79     bool isVersionChange() const { return m_mode == VERSION_CHANGE; }
80
81     // Implement the IDBTransaction IDL
82     const String& mode() const;
83     IDBDatabase* db() const { return m_database.get(); }
84     PassRefPtr<DOMError> error() const { return m_error; }
85     PassRefPtr<IDBObjectStore> objectStore(const String& name, ExceptionCode&);
86     void abort(ExceptionCode&);
87
88     class OpenCursorNotifier {
89     public:
90         OpenCursorNotifier(PassRefPtr<IDBTransaction>, IDBCursor*);
91         ~OpenCursorNotifier();
92         void cursorFinished();
93     private:
94         RefPtr<IDBTransaction> m_transaction;
95         IDBCursor* m_cursor;
96     };
97
98     void registerRequest(IDBRequest*);
99     void unregisterRequest(IDBRequest*);
100     void objectStoreCreated(const String&, PassRefPtr<IDBObjectStore>);
101     void objectStoreDeleted(const String&);
102     void setActive(bool);
103     void setError(PassRefPtr<DOMError>, const String& errorMessage);
104     String webkitErrorMessage() const;
105
106     DEFINE_ATTRIBUTE_EVENT_LISTENER(abort);
107     DEFINE_ATTRIBUTE_EVENT_LISTENER(complete);
108     DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
109
110     virtual void onAbort(PassRefPtr<IDBDatabaseError>);
111     virtual void onComplete();
112
113     // EventTarget
114     virtual const AtomicString& interfaceName() const;
115     virtual ScriptExecutionContext* scriptExecutionContext() const;
116
117     using EventTarget::dispatchEvent;
118     virtual bool dispatchEvent(PassRefPtr<Event>) OVERRIDE;
119
120     // ActiveDOMObject
121     virtual bool hasPendingActivity() const OVERRIDE;
122     virtual bool canSuspend() const OVERRIDE;
123     virtual void stop() OVERRIDE;
124
125     using RefCounted<IDBTransaction>::ref;
126     using RefCounted<IDBTransaction>::deref;
127
128 private:
129     IDBTransaction(ScriptExecutionContext*, int64_t, const Vector<String>&, Mode, IDBDatabase*, IDBOpenDBRequest*, const IDBDatabaseMetadata&);
130
131     void enqueueEvent(PassRefPtr<Event>);
132     void closeOpenCursors();
133
134     void registerOpenCursor(IDBCursor*);
135     void unregisterOpenCursor(IDBCursor*);
136
137     // EventTarget
138     virtual void refEventTarget() { ref(); }
139     virtual void derefEventTarget() { deref(); }
140     virtual EventTargetData* eventTargetData();
141     virtual EventTargetData* ensureEventTargetData();
142
143     enum State {
144         Inactive, // Created or started, but not in an event callback
145         Active, // Created or started, in creation scope or an event callback
146         Finishing, // In the process of aborting or completing.
147         Finished, // No more events will fire and no new requests may be filed.
148     };
149
150     int64_t m_id;
151     RefPtr<IDBDatabase> m_database;
152     const Vector<String> m_objectStoreNames;
153     IDBOpenDBRequest* m_openDBRequest;
154     const Mode m_mode;
155     State m_state;
156     bool m_hasPendingActivity;
157     bool m_contextStopped;
158     RefPtr<DOMError> m_error;
159     String m_errorMessage;
160
161     ListHashSet<RefPtr<IDBRequest> > m_requestList;
162
163     typedef HashMap<String, RefPtr<IDBObjectStore> > IDBObjectStoreMap;
164     IDBObjectStoreMap m_objectStoreMap;
165
166     typedef HashSet<RefPtr<IDBObjectStore> > IDBObjectStoreSet;
167     IDBObjectStoreSet m_deletedObjectStores;
168
169     typedef HashMap<RefPtr<IDBObjectStore>, IDBObjectStoreMetadata> IDBObjectStoreMetadataMap;
170     IDBObjectStoreMetadataMap m_objectStoreCleanupMap;
171     IDBDatabaseMetadata m_previousMetadata;
172
173     HashSet<IDBCursor*> m_openCursors;
174
175     EventTargetData m_eventTargetData;
176 };
177
178 } // namespace WebCore
179
180 #endif // ENABLE(INDEXED_DATABASE)
181
182 #endif // IDBTransaction_h