#ifndef SQLTransaction_h
#define SQLTransaction_h
#include "SQLCallbackWrapper.h"
#include "SQLStatement.h"
#include "SQLTransactionStateMachine.h"
#include <wtf/PassRefPtr.h>
#include <wtf/Ref.h>
#include <wtf/RefPtr.h>
namespace WebCore {
class Database;
class SQLError;
class SQLStatementCallback;
class SQLStatementErrorCallback;
class SQLTransactionBackend;
class SQLTransactionCallback;
class SQLTransactionErrorCallback;
class SQLValue;
class VoidCallback;
class SQLTransaction : public ThreadSafeRefCounted<SQLTransaction>, public SQLTransactionStateMachine<SQLTransaction> {
public:
static Ref<SQLTransaction> create(Ref<Database>&&, RefPtr<SQLTransactionCallback>&&, RefPtr<VoidCallback>&& successCallback, RefPtr<SQLTransactionErrorCallback>&&, bool readOnly);
~SQLTransaction();
void performPendingCallback();
void executeSQL(const String& sqlStatement, const Vector<SQLValue>& arguments, RefPtr<SQLStatementCallback>&&, RefPtr<SQLStatementErrorCallback>&&, ExceptionCode&);
Database& database() { return m_database; }
void requestTransitToState(SQLTransactionState);
bool hasCallback() const;
bool hasSuccessCallback() const;
bool hasErrorCallback() const;
void setBackend(SQLTransactionBackend*);
private:
SQLTransaction(Ref<Database>&&, RefPtr<SQLTransactionCallback>&&, RefPtr<VoidCallback>&& successCallback, RefPtr<SQLTransactionErrorCallback>&&, bool readOnly);
void clearCallbackWrappers();
virtual StateFunction stateFunctionFor(SQLTransactionState) override;
bool computeNextStateAndCleanupIfNeeded();
SQLTransactionState deliverTransactionCallback();
SQLTransactionState deliverTransactionErrorCallback();
SQLTransactionState deliverStatementCallback();
SQLTransactionState deliverQuotaIncreaseCallback();
SQLTransactionState deliverSuccessCallback();
SQLTransactionState unreachableState();
SQLTransactionState sendToBackendState();
SQLTransactionState nextStateForTransactionError();
Ref<Database> m_database;
RefPtr<SQLTransactionBackend> m_backend;
SQLCallbackWrapper<SQLTransactionCallback> m_callbackWrapper;
SQLCallbackWrapper<VoidCallback> m_successCallbackWrapper;
SQLCallbackWrapper<SQLTransactionErrorCallback> m_errorCallbackWrapper;
bool m_executeSqlAllowed;
RefPtr<SQLError> m_transactionError;
bool m_readOnly;
};
}
#endif // SQLTransaction_h