1/* 2 * Copyright (C) 2007, 2008, 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#ifndef DatabaseTask_h 29#define DatabaseTask_h 30 31#if ENABLE(SQL_DATABASE) 32 33#include "DatabaseBackend.h" 34#include "DatabaseBasicTypes.h" 35#include "DatabaseError.h" 36#include "SQLTransactionBackend.h" 37#include <wtf/OwnPtr.h> 38#include <wtf/PassOwnPtr.h> 39#include <wtf/PassRefPtr.h> 40#include <wtf/Threading.h> 41#include <wtf/Vector.h> 42#include <wtf/text/WTFString.h> 43 44namespace WebCore { 45 46// Can be used to wait until DatabaseTask is completed. 47// Has to be passed into DatabaseTask::create to be associated with the task. 48class DatabaseTaskSynchronizer { 49 WTF_MAKE_NONCOPYABLE(DatabaseTaskSynchronizer); 50public: 51 DatabaseTaskSynchronizer(); 52 53 // Called from main thread to wait until task is completed. 54 void waitForTaskCompletion(); 55 56 // Called by the task. 57 void taskCompleted(); 58 59#ifndef NDEBUG 60 bool hasCheckedForTermination() const { return m_hasCheckedForTermination; } 61 void setHasCheckedForTermination() { m_hasCheckedForTermination = true; } 62#endif 63 64private: 65 bool m_taskCompleted; 66 Mutex m_synchronousMutex; 67 ThreadCondition m_synchronousCondition; 68#ifndef NDEBUG 69 bool m_hasCheckedForTermination; 70#endif 71}; 72 73class DatabaseTask { 74 WTF_MAKE_NONCOPYABLE(DatabaseTask); WTF_MAKE_FAST_ALLOCATED; 75public: 76 virtual ~DatabaseTask(); 77 78 void performTask(); 79 80 DatabaseBackend* database() const { return m_database; } 81#ifndef NDEBUG 82 bool hasSynchronizer() const { return m_synchronizer; } 83 bool hasCheckedForTermination() const { return m_synchronizer->hasCheckedForTermination(); } 84#endif 85 86protected: 87 DatabaseTask(DatabaseBackend*, DatabaseTaskSynchronizer*); 88 89private: 90 virtual void doPerformTask() = 0; 91 92 DatabaseBackend* m_database; 93 DatabaseTaskSynchronizer* m_synchronizer; 94 95#if !LOG_DISABLED 96 virtual const char* debugTaskName() const = 0; 97 bool m_complete; 98#endif 99}; 100 101class DatabaseBackend::DatabaseOpenTask : public DatabaseTask { 102public: 103 static PassOwnPtr<DatabaseOpenTask> create(DatabaseBackend* db, bool setVersionInNewDatabase, DatabaseTaskSynchronizer* synchronizer, DatabaseError& error, String& errorMessage, bool& success) 104 { 105 return adoptPtr(new DatabaseOpenTask(db, setVersionInNewDatabase, synchronizer, error, errorMessage, success)); 106 } 107 108private: 109 DatabaseOpenTask(DatabaseBackend*, bool setVersionInNewDatabase, DatabaseTaskSynchronizer*, DatabaseError&, String& errorMessage, bool& success); 110 111 virtual void doPerformTask(); 112#if !LOG_DISABLED 113 virtual const char* debugTaskName() const; 114#endif 115 116 bool m_setVersionInNewDatabase; 117 DatabaseError& m_error; 118 String& m_errorMessage; 119 bool& m_success; 120}; 121 122class DatabaseBackend::DatabaseCloseTask : public DatabaseTask { 123public: 124 static PassOwnPtr<DatabaseCloseTask> create(DatabaseBackend* db, DatabaseTaskSynchronizer* synchronizer) 125 { 126 return adoptPtr(new DatabaseCloseTask(db, synchronizer)); 127 } 128 129private: 130 DatabaseCloseTask(DatabaseBackend*, DatabaseTaskSynchronizer*); 131 132 virtual void doPerformTask(); 133#if !LOG_DISABLED 134 virtual const char* debugTaskName() const; 135#endif 136}; 137 138class DatabaseBackend::DatabaseTransactionTask : public DatabaseTask { 139public: 140 virtual ~DatabaseTransactionTask(); 141 142 // Transaction task is never synchronous, so no 'synchronizer' parameter. 143 static PassOwnPtr<DatabaseTransactionTask> create(PassRefPtr<SQLTransactionBackend> transaction) 144 { 145 return adoptPtr(new DatabaseTransactionTask(transaction)); 146 } 147 148 SQLTransactionBackend* transaction() const { return m_transaction.get(); } 149 150private: 151 explicit DatabaseTransactionTask(PassRefPtr<SQLTransactionBackend>); 152 153 virtual void doPerformTask(); 154#if !LOG_DISABLED 155 virtual const char* debugTaskName() const; 156#endif 157 158 RefPtr<SQLTransactionBackend> m_transaction; 159 bool m_didPerformTask; 160}; 161 162class DatabaseBackend::DatabaseTableNamesTask : public DatabaseTask { 163public: 164 static PassOwnPtr<DatabaseTableNamesTask> create(DatabaseBackend* db, DatabaseTaskSynchronizer* synchronizer, Vector<String>& names) 165 { 166 return adoptPtr(new DatabaseTableNamesTask(db, synchronizer, names)); 167 } 168 169private: 170 DatabaseTableNamesTask(DatabaseBackend*, DatabaseTaskSynchronizer*, Vector<String>& names); 171 172 virtual void doPerformTask(); 173#if !LOG_DISABLED 174 virtual const char* debugTaskName() const; 175#endif 176 177 Vector<String>& m_tableNames; 178}; 179 180} // namespace WebCore 181 182#endif // ENABLE(SQL_DATABASE) 183 184#endif // DatabaseTask_h 185