1/*
2 * Copyright (C) 2007, 2013 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 *
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 * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14 *     its contributors may be used to endorse or promote products derived
15 *     from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#ifndef SQLTransaction_h
30#define SQLTransaction_h
31
32#include "bindings/v8/ScriptWrappable.h"
33#include "modules/webdatabase/AbstractSQLTransaction.h"
34#include "modules/webdatabase/SQLCallbackWrapper.h"
35#include "modules/webdatabase/SQLStatement.h"
36#include "modules/webdatabase/SQLTransactionStateMachine.h"
37#include "wtf/PassRefPtr.h"
38#include "wtf/RefPtr.h"
39
40namespace WebCore {
41
42class AbstractSQLTransactionBackend;
43class Database;
44class ExceptionState;
45class SQLError;
46class SQLStatementCallback;
47class SQLStatementErrorCallback;
48class SQLTransactionCallback;
49class SQLTransactionErrorCallback;
50class SQLValue;
51class VoidCallback;
52
53class SQLTransaction : public SQLTransactionStateMachine<SQLTransaction>, public AbstractSQLTransaction, public ScriptWrappable {
54public:
55    static PassRefPtr<SQLTransaction> create(Database*, PassOwnPtr<SQLTransactionCallback>,
56        PassOwnPtr<VoidCallback> successCallback, PassOwnPtr<SQLTransactionErrorCallback>,
57        bool readOnly);
58
59    void performPendingCallback();
60
61    void executeSQL(const String& sqlStatement, const Vector<SQLValue>& arguments,
62        PassOwnPtr<SQLStatementCallback>, PassOwnPtr<SQLStatementErrorCallback>, ExceptionState&);
63
64    Database* database() { return m_database.get(); }
65
66    PassOwnPtr<SQLTransactionErrorCallback> releaseErrorCallback();
67
68private:
69    SQLTransaction(Database*, PassOwnPtr<SQLTransactionCallback>,
70        PassOwnPtr<VoidCallback> successCallback, PassOwnPtr<SQLTransactionErrorCallback>,
71        bool readOnly);
72
73    void clearCallbackWrappers();
74
75    // APIs called from the backend published via AbstractSQLTransaction:
76    virtual void requestTransitToState(SQLTransactionState) OVERRIDE;
77    virtual bool hasCallback() const OVERRIDE;
78    virtual bool hasSuccessCallback() const OVERRIDE;
79    virtual bool hasErrorCallback() const OVERRIDE;
80    virtual void setBackend(AbstractSQLTransactionBackend*) OVERRIDE;
81
82    // State Machine functions:
83    virtual StateFunction stateFunctionFor(SQLTransactionState) OVERRIDE;
84    bool computeNextStateAndCleanupIfNeeded();
85
86    // State functions:
87    SQLTransactionState deliverTransactionCallback();
88    SQLTransactionState deliverTransactionErrorCallback();
89    SQLTransactionState deliverStatementCallback();
90    SQLTransactionState deliverQuotaIncreaseCallback();
91    SQLTransactionState deliverSuccessCallback();
92
93    SQLTransactionState unreachableState();
94    SQLTransactionState sendToBackendState();
95
96    SQLTransactionState nextStateForTransactionError();
97
98    RefPtr<Database> m_database;
99    RefPtr<AbstractSQLTransactionBackend> m_backend;
100    SQLCallbackWrapper<SQLTransactionCallback> m_callbackWrapper;
101    SQLCallbackWrapper<VoidCallback> m_successCallbackWrapper;
102    SQLCallbackWrapper<SQLTransactionErrorCallback> m_errorCallbackWrapper;
103
104    bool m_executeSqlAllowed;
105    RefPtr<SQLError> m_transactionError;
106
107    bool m_readOnly;
108};
109
110} // namespace WebCore
111
112#endif // SQLTransaction_h
113