Home | History | Annotate | Download | only in webdatabase
      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 
     29 #include "config.h"
     30 #include "modules/webdatabase/DatabaseTask.h"
     31 
     32 #include "modules/webdatabase/Database.h"
     33 #include "modules/webdatabase/DatabaseContext.h"
     34 #include "modules/webdatabase/DatabaseThread.h"
     35 #include "platform/Logging.h"
     36 
     37 namespace blink {
     38 
     39 DatabaseTask::DatabaseTask(Database* database, TaskSynchronizer* synchronizer)
     40     : m_database(database)
     41     , m_synchronizer(synchronizer)
     42 #if !LOG_DISABLED
     43     , m_complete(false)
     44 #endif
     45 {
     46 }
     47 
     48 DatabaseTask::~DatabaseTask()
     49 {
     50 #if !LOG_DISABLED
     51     ASSERT(m_complete || !m_synchronizer);
     52 #endif
     53 }
     54 
     55 void DatabaseTask::run()
     56 {
     57     // Database tasks are meant to be used only once, so make sure this one hasn't been performed before.
     58 #if !LOG_DISABLED
     59     ASSERT(!m_complete);
     60 #endif
     61 
     62     if (!m_synchronizer && !m_database->databaseContext()->databaseThread()->isDatabaseOpen(m_database.get())) {
     63         taskCancelled();
     64 #if !LOG_DISABLED
     65         m_complete = true;
     66 #endif
     67         return;
     68     }
     69 
     70     WTF_LOG(StorageAPI, "Performing %s %p\n", debugTaskName(), this);
     71 
     72     m_database->resetAuthorizer();
     73     doPerformTask();
     74 
     75     if (m_synchronizer)
     76         m_synchronizer->taskCompleted();
     77 
     78 #if !LOG_DISABLED
     79     m_complete = true;
     80 #endif
     81 }
     82 
     83 // *** DatabaseOpenTask ***
     84 // Opens the database file and verifies the version matches the expected version.
     85 
     86 Database::DatabaseOpenTask::DatabaseOpenTask(Database* database, bool setVersionInNewDatabase, TaskSynchronizer* synchronizer, DatabaseError& error, String& errorMessage, bool& success)
     87     : DatabaseTask(database, synchronizer)
     88     , m_setVersionInNewDatabase(setVersionInNewDatabase)
     89     , m_error(error)
     90     , m_errorMessage(errorMessage)
     91     , m_success(success)
     92 {
     93     ASSERT(synchronizer); // A task with output parameters is supposed to be synchronous.
     94 }
     95 
     96 void Database::DatabaseOpenTask::doPerformTask()
     97 {
     98     String errorMessage;
     99     m_success = database()->performOpenAndVerify(m_setVersionInNewDatabase, m_error, errorMessage);
    100     if (!m_success)
    101         m_errorMessage = errorMessage.isolatedCopy();
    102 }
    103 
    104 #if !LOG_DISABLED
    105 const char* Database::DatabaseOpenTask::debugTaskName() const
    106 {
    107     return "DatabaseOpenTask";
    108 }
    109 #endif
    110 
    111 // *** DatabaseCloseTask ***
    112 // Closes the database.
    113 
    114 Database::DatabaseCloseTask::DatabaseCloseTask(Database* database, TaskSynchronizer* synchronizer)
    115     : DatabaseTask(database, synchronizer)
    116 {
    117 }
    118 
    119 void Database::DatabaseCloseTask::doPerformTask()
    120 {
    121     database()->close();
    122 }
    123 
    124 #if !LOG_DISABLED
    125 const char* Database::DatabaseCloseTask::debugTaskName() const
    126 {
    127     return "DatabaseCloseTask";
    128 }
    129 #endif
    130 
    131 // *** DatabaseTransactionTask ***
    132 // Starts a transaction that will report its results via a callback.
    133 
    134 Database::DatabaseTransactionTask::DatabaseTransactionTask(PassRefPtrWillBeRawPtr<SQLTransactionBackend> transaction)
    135     : DatabaseTask(transaction->database(), 0)
    136     , m_transaction(transaction)
    137 {
    138 }
    139 
    140 Database::DatabaseTransactionTask::~DatabaseTransactionTask()
    141 {
    142 }
    143 
    144 void Database::DatabaseTransactionTask::doPerformTask()
    145 {
    146     m_transaction->performNextStep();
    147 }
    148 
    149 void Database::DatabaseTransactionTask::taskCancelled()
    150 {
    151     // If the task is being destructed without the transaction ever being run,
    152     // then we must either have an error or an interruption. Give the
    153     // transaction a chance to clean up since it may not have been able to
    154     // run to its clean up state.
    155 
    156     // Transaction phase 2 cleanup. See comment on "What happens if a
    157     // transaction is interrupted?" at the top of SQLTransactionBackend.cpp.
    158 
    159     m_transaction->notifyDatabaseThreadIsShuttingDown();
    160 }
    161 
    162 #if !LOG_DISABLED
    163 const char* Database::DatabaseTransactionTask::debugTaskName() const
    164 {
    165     return "DatabaseTransactionTask";
    166 }
    167 #endif
    168 
    169 // *** DatabaseTableNamesTask ***
    170 // Retrieves a list of all tables in the database - for WebInspector support.
    171 
    172 Database::DatabaseTableNamesTask::DatabaseTableNamesTask(Database* database, TaskSynchronizer* synchronizer, Vector<String>& names)
    173     : DatabaseTask(database, synchronizer)
    174     , m_tableNames(names)
    175 {
    176     ASSERT(synchronizer); // A task with output parameters is supposed to be synchronous.
    177 }
    178 
    179 void Database::DatabaseTableNamesTask::doPerformTask()
    180 {
    181     m_tableNames = database()->performGetTableNames();
    182 }
    183 
    184 #if !LOG_DISABLED
    185 const char* Database::DatabaseTableNamesTask::debugTaskName() const
    186 {
    187     return "DatabaseTableNamesTask";
    188 }
    189 #endif
    190 
    191 } // namespace blink
    192