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#include "config.h" 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DatabaseTask.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 318ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch#if ENABLE(DATABASE) 328ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Database.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Logging.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 38643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockDatabaseTaskSynchronizer::DatabaseTaskSynchronizer() 39643ca7872b450ea4efacab6188849e5aac2ba161Steve Block : m_taskCompleted(false) 40f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#ifndef NDEBUG 41f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick , m_hasCheckedForTermination(false) 42f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#endif 43643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 44643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 45643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 46643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid DatabaseTaskSynchronizer::waitForTaskCompletion() 47643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 48643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_synchronousMutex.lock(); 49643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (!m_taskCompleted) 50643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_synchronousCondition.wait(m_synchronousMutex); 51643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_synchronousMutex.unlock(); 52643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 53643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 54643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid DatabaseTaskSynchronizer::taskCompleted() 55643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 56643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_synchronousMutex.lock(); 57643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_taskCompleted = true; 58643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_synchronousCondition.signal(); 59643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_synchronousMutex.unlock(); 60643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 61643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 62643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockDatabaseTask::DatabaseTask(Database* database, DatabaseTaskSynchronizer* synchronizer) 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : m_database(database) 64643ca7872b450ea4efacab6188849e5aac2ba161Steve Block , m_synchronizer(synchronizer) 6533227a6c6e4f49f430734efd6b339706181588c1Steve Block#if !LOG_DISABLED 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_complete(false) 67643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectDatabaseTask::~DatabaseTask() 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 7333227a6c6e4f49f430734efd6b339706181588c1Steve Block#if !LOG_DISABLED 74f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick ASSERT(m_complete || !m_synchronizer); 7533227a6c6e4f49f430734efd6b339706181588c1Steve Block#endif 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid DatabaseTask::performTask() 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Database tasks are meant to be used only once, so make sure this one hasn't been performed before. 8133227a6c6e4f49f430734efd6b339706181588c1Steve Block#if !LOG_DISABLED 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!m_complete); 8333227a6c6e4f49f430734efd6b339706181588c1Steve Block#endif 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG(StorageAPI, "Performing %s %p\n", debugTaskName(), this); 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_database->resetAuthorizer(); 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project doPerformTask(); 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 90643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (m_synchronizer) 91643ca7872b450ea4efacab6188849e5aac2ba161Steve Block m_synchronizer->taskCompleted(); 92f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick 9333227a6c6e4f49f430734efd6b339706181588c1Steve Block#if !LOG_DISABLED 94f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick m_complete = true; 95f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#endif 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// *** DatabaseOpenTask *** 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Opens the database file and verifies the version matches the expected version. 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 101ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve BlockDatabase::DatabaseOpenTask::DatabaseOpenTask(Database* database, bool setVersionInNewDatabase, DatabaseTaskSynchronizer* synchronizer, ExceptionCode& code, bool& success) 102643ca7872b450ea4efacab6188849e5aac2ba161Steve Block : DatabaseTask(database, synchronizer) 103ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block , m_setVersionInNewDatabase(setVersionInNewDatabase) 104643ca7872b450ea4efacab6188849e5aac2ba161Steve Block , m_code(code) 105643ca7872b450ea4efacab6188849e5aac2ba161Steve Block , m_success(success) 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 107643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(synchronizer); // A task with output parameters is supposed to be synchronous. 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 110ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockvoid Database::DatabaseOpenTask::doPerformTask() 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 112ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block m_success = database()->performOpenAndVerify(m_setVersionInNewDatabase, m_code); 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1151b88cab77a965f1887ae4728b9e8016e8504e2ecSteve Block#if !LOG_DISABLED 116ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockconst char* Database::DatabaseOpenTask::debugTaskName() const 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return "DatabaseOpenTask"; 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// *** DatabaseCloseTask *** 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Closes the database. 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 125ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve BlockDatabase::DatabaseCloseTask::DatabaseCloseTask(Database* database, DatabaseTaskSynchronizer* synchronizer) 126643ca7872b450ea4efacab6188849e5aac2ba161Steve Block : DatabaseTask(database, synchronizer) 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 130ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockvoid Database::DatabaseCloseTask::doPerformTask() 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 132ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block database()->close(); 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1351b88cab77a965f1887ae4728b9e8016e8504e2ecSteve Block#if !LOG_DISABLED 136ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockconst char* Database::DatabaseCloseTask::debugTaskName() const 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return "DatabaseCloseTask"; 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// *** DatabaseTransactionTask *** 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Starts a transaction that will report its results via a callback. 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 145ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve BlockDatabase::DatabaseTransactionTask::DatabaseTransactionTask(PassRefPtr<SQLTransaction> transaction) 146643ca7872b450ea4efacab6188849e5aac2ba161Steve Block : DatabaseTask(transaction->database(), 0) 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_transaction(transaction) 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 151ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockvoid Database::DatabaseTransactionTask::doPerformTask() 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 153545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch if (m_transaction->performNextStep()) 154545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch m_transaction->database()->inProgressTransactionCompleted(); 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1571b88cab77a965f1887ae4728b9e8016e8504e2ecSteve Block#if !LOG_DISABLED 158ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockconst char* Database::DatabaseTransactionTask::debugTaskName() const 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return "DatabaseTransactionTask"; 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// *** DatabaseTableNamesTask *** 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Retrieves a list of all tables in the database - for WebInspector support. 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 167ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve BlockDatabase::DatabaseTableNamesTask::DatabaseTableNamesTask(Database* database, DatabaseTaskSynchronizer* synchronizer, Vector<String>& names) 168643ca7872b450ea4efacab6188849e5aac2ba161Steve Block : DatabaseTask(database, synchronizer) 169643ca7872b450ea4efacab6188849e5aac2ba161Steve Block , m_tableNames(names) 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 171643ca7872b450ea4efacab6188849e5aac2ba161Steve Block ASSERT(synchronizer); // A task with output parameters is supposed to be synchronous. 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 174ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockvoid Database::DatabaseTableNamesTask::doPerformTask() 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_tableNames = database()->performGetTableNames(); 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1791b88cab77a965f1887ae4728b9e8016e8504e2ecSteve Block#if !LOG_DISABLED 180ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockconst char* Database::DatabaseTableNamesTask::debugTaskName() const 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return "DatabaseTableNamesTask"; 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore 1878ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch 1888ccf722629b08f2a06b2cadbdc3d0c9dc885e25dBen Murdoch#endif 189