16c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen/*
26c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * Copyright (C) 2010 Google Inc. All rights reserved.
36c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen *
46c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * Redistribution and use in source and binary forms, with or without
56c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * modification, are permitted provided that the following conditions
66c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * are met:
76c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen *
86c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * 1.  Redistributions of source code must retain the above copyright
96c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen *     notice, this list of conditions and the following disclaimer.
106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * 2.  Redistributions in binary form must reproduce the above copyright
116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen *     notice, this list of conditions and the following disclaimer in the
126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen *     documentation and/or other materials provided with the distribution.
136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
146c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen *     its contributors may be used to endorse or promote products derived
156c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen *     from this software without specific prior written permission.
166c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen *
176c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
186c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
196c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
206c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
216c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
226c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
236c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
246c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
256c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
266c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen */
286c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
296c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#ifndef AbstractDatabase_h
306c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#define AbstractDatabase_h
316c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
326c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#if ENABLE(DATABASE)
336c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
34967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#include "ExceptionCode.h"
3506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#include "PlatformString.h"
36ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include "SQLiteDatabase.h"
37ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include <wtf/Forward.h>
382bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <wtf/ThreadSafeRefCounted.h>
3933227a6c6e4f49f430734efd6b339706181588c1Steve Block#if !LOG_DISABLED || !ERROR_DISABLED
40ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include "SecurityOrigin.h"
41ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#endif
4206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
436c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsennamespace WebCore {
446c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
45ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockclass DatabaseAuthorizer;
4606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenclass ScriptExecutionContext;
4706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenclass SecurityOrigin;
4806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
492bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass AbstractDatabase : public ThreadSafeRefCounted<AbstractDatabase> {
5006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenpublic:
5106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static bool isAvailable();
5206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static void setIsAvailable(bool available);
5306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
5406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    virtual ~AbstractDatabase();
5506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
56ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual String version() const;
57ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
58ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    bool opened() const { return m_opened; }
59ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    bool isNew() const { return m_new; }
60ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
61ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual ScriptExecutionContext* scriptExecutionContext() const;
62ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual SecurityOrigin* securityOrigin() const;
63ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual String stringIdentifier() const;
64ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual String displayName() const;
65ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual unsigned long estimatedSize() const;
66ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual String fileName() const;
67967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    SQLiteDatabase& sqliteDatabase() { return m_sqliteDatabase; }
68967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
69967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    unsigned long long maximumSize() const;
70967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    void incrementalVacuumIfNeeded();
71db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    void interrupt();
72db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    bool isInterrupted();
73ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
74ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // FIXME: move all version-related methods to a DatabaseVersionTracker class
75ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    bool versionMatchesExpected() const;
76ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    void setExpectedVersion(const String& version);
77ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    bool getVersionFromDatabase(String& version);
78ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    bool setVersionInDatabase(const String& version);
79ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
80ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    void disableAuthorizer();
81ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    void enableAuthorizer();
82ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    void setAuthorizerReadOnly();
83f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    void setAuthorizerPermissions(int permissions);
84ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    bool lastActionChangedDatabase();
85ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    bool lastActionWasInsert();
86ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    void resetDeletes();
87ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    bool hadDeletes();
88ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    void resetAuthorizer();
8906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
9006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    virtual void markAsDeletedAndClose() = 0;
9106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    virtual void closeImmediately() = 0;
92ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
93ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockprotected:
94ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    AbstractDatabase(ScriptExecutionContext*, const String& name, const String& expectedVersion,
95ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                     const String& displayName, unsigned long estimatedSize);
96ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
97ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    void closeDatabase();
98ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
99ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual bool performOpenAndVerify(bool shouldSetVersionInNewDatabase, ExceptionCode& ec);
100ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
101ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    static const String& databaseInfoTableName();
102ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
103ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    RefPtr<ScriptExecutionContext> m_scriptExecutionContext;
104ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    RefPtr<SecurityOrigin> m_contextThreadSecurityOrigin;
105ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
106ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    String m_name;
107ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    String m_expectedVersion;
108ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    String m_displayName;
109ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    unsigned long m_estimatedSize;
110ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    String m_filename;
111ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
11233227a6c6e4f49f430734efd6b339706181588c1Steve Block#if !LOG_DISABLED || !ERROR_DISABLED
113ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    String databaseDebugName() const { return m_contextThreadSecurityOrigin->toString() + "::" + m_name; }
114ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#endif
115ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
116ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockprivate:
117ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    static const String& databaseVersionKey();
118ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
119ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    int m_guid;
120ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    bool m_opened;
121ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    bool m_new;
122ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
123967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    SQLiteDatabase m_sqliteDatabase;
124967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
125ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    RefPtr<DatabaseAuthorizer> m_databaseAuthorizer;
1266c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen};
1276c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
1286c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} // namespace WebCore
1296c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
1306c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#endif // ENABLE(DATABASE)
1316c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
1326c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#endif // AbstractDatabase_h
133