18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * from this software without specific prior written permission. 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef DatabaseTask_h 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define DatabaseTask_h 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 318ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch#if ENABLE(DATABASE) 32dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "Database.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ExceptionCode.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "PlatformString.h" 35545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "SQLTransaction.h" 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/OwnPtr.h> 37643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include <wtf/PassOwnPtr.h> 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/PassRefPtr.h> 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Threading.h> 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Vector.h> 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 44643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Can be used to wait until DatabaseTask is completed. 45643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Has to be passed into DatabaseTask::create to be associated with the task. 46ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochclass DatabaseTaskSynchronizer { 47ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch WTF_MAKE_NONCOPYABLE(DatabaseTaskSynchronizer); 48643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockpublic: 49643ca7872b450ea4efacab6188849e5aac2ba161Steve Block DatabaseTaskSynchronizer(); 50643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 51643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Called from main thread to wait until task is completed. 52643ca7872b450ea4efacab6188849e5aac2ba161Steve Block void waitForTaskCompletion(); 53643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 54643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Called by the task. 55643ca7872b450ea4efacab6188849e5aac2ba161Steve Block void taskCompleted(); 56643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 57f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#ifndef NDEBUG 58f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick bool hasCheckedForTermination() const { return m_hasCheckedForTermination; } 59f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick void setHasCheckedForTermination() { m_hasCheckedForTermination = true; } 60f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#endif 61f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 62f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrickprivate: 63643ca7872b450ea4efacab6188849e5aac2ba161Steve Block bool m_taskCompleted; 64643ca7872b450ea4efacab6188849e5aac2ba161Steve Block Mutex m_synchronousMutex; 65643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ThreadCondition m_synchronousCondition; 66f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#ifndef NDEBUG 67f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick bool m_hasCheckedForTermination; 68f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#endif 69643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}; 70643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 71ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochclass DatabaseTask { 72ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch WTF_MAKE_NONCOPYABLE(DatabaseTask); WTF_MAKE_FAST_ALLOCATED; 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic: 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual ~DatabaseTask(); 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void performTask(); 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Database* database() const { return m_database; } 79f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#ifndef NDEBUG 80f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick bool hasSynchronizer() const { return m_synchronizer; } 81f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick bool hasCheckedForTermination() const { return m_synchronizer->hasCheckedForTermination(); } 82f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#endif 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprotected: 85643ca7872b450ea4efacab6188849e5aac2ba161Steve Block DatabaseTask(Database*, DatabaseTaskSynchronizer*); 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate: 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual void doPerformTask() = 0; 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Database* m_database; 91643ca7872b450ea4efacab6188849e5aac2ba161Steve Block DatabaseTaskSynchronizer* m_synchronizer; 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 931b88cab77a965f1887ae4728b9e8016e8504e2ecSteve Block#if !LOG_DISABLED 94f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick virtual const char* debugTaskName() const = 0; 95f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick bool m_complete; 96643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 99ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockclass Database::DatabaseOpenTask : public DatabaseTask { 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic: 101ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block static PassOwnPtr<DatabaseOpenTask> create(Database* db, bool setVersionInNewDatabase, DatabaseTaskSynchronizer* synchronizer, ExceptionCode& code, bool& success) 102643ca7872b450ea4efacab6188849e5aac2ba161Steve Block { 103e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block return adoptPtr(new DatabaseOpenTask(db, setVersionInNewDatabase, synchronizer, code, success)); 104643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate: 107ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block DatabaseOpenTask(Database*, bool setVersionInNewDatabase, DatabaseTaskSynchronizer*, ExceptionCode&, bool& success); 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual void doPerformTask(); 1101b88cab77a965f1887ae4728b9e8016e8504e2ecSteve Block#if !LOG_DISABLED 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual const char* debugTaskName() const; 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 114ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block bool m_setVersionInNewDatabase; 115643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ExceptionCode& m_code; 116643ca7872b450ea4efacab6188849e5aac2ba161Steve Block bool& m_success; 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 119ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockclass Database::DatabaseCloseTask : public DatabaseTask { 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic: 121ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block static PassOwnPtr<DatabaseCloseTask> create(Database* db, DatabaseTaskSynchronizer* synchronizer) 122ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block { 123e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block return adoptPtr(new DatabaseCloseTask(db, synchronizer)); 124643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate: 127ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block DatabaseCloseTask(Database*, DatabaseTaskSynchronizer*); 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual void doPerformTask(); 1301b88cab77a965f1887ae4728b9e8016e8504e2ecSteve Block#if !LOG_DISABLED 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual const char* debugTaskName() const; 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 135ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockclass Database::DatabaseTransactionTask : public DatabaseTask { 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic: 137643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // Transaction task is never synchronous, so no 'synchronizer' parameter. 138643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static PassOwnPtr<DatabaseTransactionTask> create(PassRefPtr<SQLTransaction> transaction) 139643ca7872b450ea4efacab6188849e5aac2ba161Steve Block { 140e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block return adoptPtr(new DatabaseTransactionTask(transaction)); 141643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SQLTransaction* transaction() const { return m_transaction.get(); } 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate: 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DatabaseTransactionTask(PassRefPtr<SQLTransaction>); 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual void doPerformTask(); 1491b88cab77a965f1887ae4728b9e8016e8504e2ecSteve Block#if !LOG_DISABLED 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual const char* debugTaskName() const; 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<SQLTransaction> m_transaction; 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 156ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockclass Database::DatabaseTableNamesTask : public DatabaseTask { 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic: 158643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static PassOwnPtr<DatabaseTableNamesTask> create(Database* db, DatabaseTaskSynchronizer* synchronizer, Vector<String>& names) 159643ca7872b450ea4efacab6188849e5aac2ba161Steve Block { 160e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block return adoptPtr(new DatabaseTableNamesTask(db, synchronizer, names)); 161643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate: 164643ca7872b450ea4efacab6188849e5aac2ba161Steve Block DatabaseTableNamesTask(Database*, DatabaseTaskSynchronizer*, Vector<String>& names); 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual void doPerformTask(); 1671b88cab77a965f1887ae4728b9e8016e8504e2ecSteve Block#if !LOG_DISABLED 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual const char* debugTaskName() const; 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 171643ca7872b450ea4efacab6188849e5aac2ba161Steve Block Vector<String>& m_tableNames; 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1768ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch#endif // ENABLE(DATABASE) 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // DatabaseTask_h 178