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