/src/3rdparty/webkit/Source/WebCore/storage/SQLTransaction.h

https://bitbucket.org/ultra_iter/qt-vtl · C Header · 137 lines · 85 code · 25 blank · 27 comment · 0 complexity · fab0394aef372f4eecff75e927df51fd MD5 · raw file

  1. /*
  2. * Copyright (C) 2007 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. #ifndef SQLTransaction_h
  29. #define SQLTransaction_h
  30. #if ENABLE(DATABASE)
  31. #include "ExceptionCode.h"
  32. #include "SQLStatement.h"
  33. #include <wtf/Deque.h>
  34. #include <wtf/Forward.h>
  35. #include <wtf/ThreadSafeRefCounted.h>
  36. #include <wtf/Vector.h>
  37. namespace WebCore {
  38. class Database;
  39. class SQLError;
  40. class SQLiteTransaction;
  41. class SQLStatementCallback;
  42. class SQLStatementErrorCallback;
  43. class SQLTransaction;
  44. class SQLTransactionCallback;
  45. class SQLTransactionErrorCallback;
  46. class SQLValue;
  47. class VoidCallback;
  48. class SQLTransactionWrapper : public ThreadSafeRefCounted<SQLTransactionWrapper> {
  49. public:
  50. virtual ~SQLTransactionWrapper() { }
  51. virtual bool performPreflight(SQLTransaction*) = 0;
  52. virtual bool performPostflight(SQLTransaction*) = 0;
  53. virtual SQLError* sqlError() const = 0;
  54. };
  55. class SQLTransaction : public ThreadSafeRefCounted<SQLTransaction> {
  56. public:
  57. static PassRefPtr<SQLTransaction> create(Database*, PassRefPtr<SQLTransactionCallback>, PassRefPtr<SQLTransactionErrorCallback>,
  58. PassRefPtr<VoidCallback>, PassRefPtr<SQLTransactionWrapper>, bool readOnly = false);
  59. ~SQLTransaction();
  60. void executeSQL(const String& sqlStatement, const Vector<SQLValue>& arguments,
  61. PassRefPtr<SQLStatementCallback>, PassRefPtr<SQLStatementErrorCallback>, ExceptionCode&);
  62. void lockAcquired();
  63. bool performNextStep();
  64. void performPendingCallback();
  65. Database* database() { return m_database.get(); }
  66. bool isReadOnly() { return m_readOnly; }
  67. void notifyDatabaseThreadIsShuttingDown();
  68. private:
  69. SQLTransaction(Database*, PassRefPtr<SQLTransactionCallback>, PassRefPtr<SQLTransactionErrorCallback>,
  70. PassRefPtr<VoidCallback>, PassRefPtr<SQLTransactionWrapper>, bool readOnly);
  71. typedef void (SQLTransaction::*TransactionStepMethod)();
  72. TransactionStepMethod m_nextStep;
  73. void enqueueStatement(PassRefPtr<SQLStatement>);
  74. void checkAndHandleClosedOrInterruptedDatabase();
  75. void acquireLock();
  76. void openTransactionAndPreflight();
  77. void deliverTransactionCallback();
  78. void scheduleToRunStatements();
  79. void runStatements();
  80. void getNextStatement();
  81. bool runCurrentStatement();
  82. void handleCurrentStatementError();
  83. void deliverStatementCallback();
  84. void deliverQuotaIncreaseCallback();
  85. void postflightAndCommit();
  86. void deliverSuccessCallback();
  87. void cleanupAfterSuccessCallback();
  88. void handleTransactionError(bool inCallback);
  89. void deliverTransactionErrorCallback();
  90. void cleanupAfterTransactionErrorCallback();
  91. #ifndef NDEBUG
  92. static const char* debugStepName(TransactionStepMethod);
  93. #endif
  94. RefPtr<SQLStatement> m_currentStatement;
  95. bool m_executeSqlAllowed;
  96. RefPtr<Database> m_database;
  97. RefPtr<SQLTransactionWrapper> m_wrapper;
  98. SQLCallbackWrapper<SQLTransactionCallback> m_callbackWrapper;
  99. SQLCallbackWrapper<VoidCallback> m_successCallbackWrapper;
  100. SQLCallbackWrapper<SQLTransactionErrorCallback> m_errorCallbackWrapper;
  101. RefPtr<SQLError> m_transactionError;
  102. bool m_shouldRetryCurrentStatement;
  103. bool m_modifiedDatabase;
  104. bool m_lockAcquired;
  105. bool m_readOnly;
  106. Mutex m_statementMutex;
  107. Deque<RefPtr<SQLStatement> > m_statementQueue;
  108. OwnPtr<SQLiteTransaction> m_sqliteTransaction;
  109. };
  110. } // namespace WebCore
  111. #endif
  112. #endif // SQLTransaction_h