2
* Copyright (C) 2007 Apple Inc. All rights reserved.
4
* Redistribution and use in source and binary forms, with or without
5
* modification, are permitted provided that the following conditions
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.
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.
28
#ifndef SQLTransaction_h
29
#define SQLTransaction_h
31
#if ENABLE(SQL_DATABASE)
33
#include "SQLStatement.h"
34
#include <wtf/Deque.h>
35
#include <wtf/Forward.h>
36
#include <wtf/ThreadSafeRefCounted.h>
37
#include <wtf/Vector.h>
43
class SQLiteTransaction;
44
class SQLStatementCallback;
45
class SQLStatementErrorCallback;
47
class SQLTransactionCallback;
48
class SQLTransactionErrorCallback;
52
typedef int ExceptionCode;
54
class SQLTransactionWrapper : public ThreadSafeRefCounted<SQLTransactionWrapper> {
56
virtual ~SQLTransactionWrapper() { }
57
virtual bool performPreflight(SQLTransaction*) = 0;
58
virtual bool performPostflight(SQLTransaction*) = 0;
59
virtual SQLError* sqlError() const = 0;
60
virtual void handleCommitFailedAfterPostflight(SQLTransaction*) = 0;
63
class SQLTransaction : public ThreadSafeRefCounted<SQLTransaction> {
65
static PassRefPtr<SQLTransaction> create(Database*, PassRefPtr<SQLTransactionCallback>, PassRefPtr<SQLTransactionErrorCallback>,
66
PassRefPtr<VoidCallback>, PassRefPtr<SQLTransactionWrapper>, bool readOnly = false);
70
void executeSQL(const String& sqlStatement, const Vector<SQLValue>& arguments,
71
PassRefPtr<SQLStatementCallback>, PassRefPtr<SQLStatementErrorCallback>, ExceptionCode&);
74
bool performNextStep();
75
void performPendingCallback();
77
Database* database() { return m_database.get(); }
78
bool isReadOnly() { return m_readOnly; }
79
void notifyDatabaseThreadIsShuttingDown();
82
SQLTransaction(Database*, PassRefPtr<SQLTransactionCallback>, PassRefPtr<SQLTransactionErrorCallback>,
83
PassRefPtr<VoidCallback>, PassRefPtr<SQLTransactionWrapper>, bool readOnly);
85
typedef void (SQLTransaction::*TransactionStepMethod)();
86
TransactionStepMethod m_nextStep;
88
void enqueueStatement(PassRefPtr<SQLStatement>);
90
void checkAndHandleClosedOrInterruptedDatabase();
93
void openTransactionAndPreflight();
94
void deliverTransactionCallback();
95
void scheduleToRunStatements();
97
void getNextStatement();
98
bool runCurrentStatement();
99
void handleCurrentStatementError();
100
void deliverStatementCallback();
101
void deliverQuotaIncreaseCallback();
102
void postflightAndCommit();
103
void deliverSuccessCallback();
104
void cleanupAfterSuccessCallback();
105
void handleTransactionError(bool inCallback);
106
void deliverTransactionErrorCallback();
107
void cleanupAfterTransactionErrorCallback();
110
static const char* debugStepName(TransactionStepMethod);
113
RefPtr<SQLStatement> m_currentStatement;
115
bool m_executeSqlAllowed;
117
RefPtr<Database> m_database;
118
RefPtr<SQLTransactionWrapper> m_wrapper;
119
SQLCallbackWrapper<SQLTransactionCallback> m_callbackWrapper;
120
SQLCallbackWrapper<VoidCallback> m_successCallbackWrapper;
121
SQLCallbackWrapper<SQLTransactionErrorCallback> m_errorCallbackWrapper;
122
RefPtr<SQLError> m_transactionError;
123
bool m_shouldRetryCurrentStatement;
124
bool m_modifiedDatabase;
127
bool m_hasVersionMismatch;
129
Mutex m_statementMutex;
130
Deque<RefPtr<SQLStatement> > m_statementQueue;
132
OwnPtr<SQLiteTransaction> m_sqliteTransaction;
135
} // namespace WebCore
139
#endif // SQLTransaction_h