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 IDBTransactionBackendImpl_h
27#define IDBTransactionBackendImpl_h
28
29#if ENABLE(INDEXED_DATABASE)
30
31#include "DOMStringList.h"
32#include "IDBBackingStore.h"
33#include "IDBTransactionBackendInterface.h"
34#include "IDBTransactionCallbacks.h"
35#include "Timer.h"
36#include <wtf/Deque.h>
37#include <wtf/RefPtr.h>
38
39namespace WebCore {
40
41class IDBDatabaseBackendImpl;
42
43class IDBTransactionBackendImpl : public IDBTransactionBackendInterface {
44public:
45    static PassRefPtr<IDBTransactionBackendImpl> create(DOMStringList* objectStores, unsigned short mode, IDBDatabaseBackendImpl*);
46    virtual ~IDBTransactionBackendImpl();
47
48    virtual PassRefPtr<IDBObjectStoreBackendInterface> objectStore(const String& name, ExceptionCode&);
49    virtual unsigned short mode() const { return m_mode; }
50    virtual bool scheduleTask(PassOwnPtr<ScriptExecutionContext::Task> task, PassOwnPtr<ScriptExecutionContext::Task> abortTask);
51    virtual void didCompleteTaskEvents();
52    virtual void abort();
53    virtual void setCallbacks(IDBTransactionCallbacks* callbacks) { m_callbacks = callbacks; }
54
55    void run();
56
57private:
58    IDBTransactionBackendImpl(DOMStringList* objectStores, unsigned short mode, IDBDatabaseBackendImpl*);
59
60    enum State {
61        Unused, // Created, but no tasks yet.
62        StartPending, // Enqueued tasks, but SQLite transaction not yet started.
63        Running, // SQLite transaction started but not yet finished.
64        Finished, // Either aborted or committed.
65    };
66
67    void start();
68    void commit();
69
70    void taskTimerFired(Timer<IDBTransactionBackendImpl>*);
71    void taskEventTimerFired(Timer<IDBTransactionBackendImpl>*);
72
73    RefPtr<DOMStringList> m_objectStoreNames;
74    unsigned short m_mode;
75
76    State m_state;
77    RefPtr<IDBTransactionCallbacks> m_callbacks;
78    RefPtr<IDBDatabaseBackendImpl> m_database;
79
80    typedef Deque<OwnPtr<ScriptExecutionContext::Task> > TaskQueue;
81    TaskQueue m_taskQueue;
82    TaskQueue m_abortTaskQueue;
83
84    RefPtr<IDBBackingStore::Transaction> m_transaction;
85
86    // FIXME: delete the timer once we have threads instead.
87    Timer<IDBTransactionBackendImpl> m_taskTimer;
88    Timer<IDBTransactionBackendImpl> m_taskEventTimer;
89    int m_pendingEvents;
90};
91
92} // namespace WebCore
93
94#endif // ENABLE(INDEXED_DATABASE)
95
96#endif // IDBTransactionBackendImpl_h
97