1/*
2 * Copyright (C) 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 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#ifndef DatabaseBackend_h
27#define DatabaseBackend_h
28
29#if ENABLE(SQL_DATABASE)
30
31#include "DatabaseBackendBase.h"
32#include <wtf/Deque.h>
33#include <wtf/text/WTFString.h>
34
35namespace WebCore {
36
37class ChangeVersionData;
38class Database;
39class DatabaseServer;
40class SQLTransaction;
41class SQLTransactionBackend;
42class SQLTransactionClient;
43class SQLTransactionCoordinator;
44
45// FIXME: This implementation of DatabaseBackend is only a place holder
46// for the split out of the Database backend to be done later. This
47// place holder is needed to allow other code that need to reference the
48// DatabaseBackend to do so before the proper backend split is
49// available. This should be replaced with the actual implementation later.
50
51class DatabaseBackend : public DatabaseBackendBase {
52public:
53    DatabaseBackend(PassRefPtr<DatabaseBackendContext>, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize);
54
55    virtual bool openAndVerifyVersion(bool setVersionInNewDatabase, DatabaseError&, String& errorMessage);
56    void close();
57
58    PassRefPtr<SQLTransactionBackend> runTransaction(PassRefPtr<SQLTransaction>, bool readOnly, const ChangeVersionData*);
59    void scheduleTransactionStep(SQLTransactionBackend*);
60    void inProgressTransactionCompleted();
61
62    SQLTransactionClient* transactionClient() const;
63    SQLTransactionCoordinator* transactionCoordinator() const;
64
65private:
66    class DatabaseOpenTask;
67    class DatabaseCloseTask;
68    class DatabaseTransactionTask;
69    class DatabaseTableNamesTask;
70
71    virtual bool performOpenAndVerify(bool setVersionInNewDatabase, DatabaseError&, String& errorMessage);
72
73    void scheduleTransaction();
74
75    Deque<RefPtr<SQLTransactionBackend>> m_transactionQueue;
76    Mutex m_transactionInProgressMutex;
77    bool m_transactionInProgress;
78    bool m_isTransactionQueueEnabled;
79
80    friend class Database;
81};
82
83} // namespace WebCore
84
85#endif // ENABLE(SQL_DATABASE)
86
87#endif // DatabaseBackend_h
88