12b8985d11fdfe5f2dc6dcbda725cc147ae6af2c
[WebKit-https.git] / Source / WebCore / Modules / webdatabase / AbstractDatabase.h
1 /*
2  * Copyright (C) 2011 Google 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 #ifndef AbstractDatabase_h
30 #define AbstractDatabase_h
31
32 #if ENABLE(SQL_DATABASE)
33
34 #include "PlatformString.h"
35 #include "SQLiteDatabase.h"
36 #include <wtf/Forward.h>
37 #include <wtf/ThreadSafeRefCounted.h>
38 #if !LOG_DISABLED || !ERROR_DISABLED
39 #include "SecurityOrigin.h"
40 #endif
41
42 namespace WebCore {
43
44 class DatabaseAuthorizer;
45 class DatabaseContext;
46 class ScriptExecutionContext;
47 class SecurityOrigin;
48
49 typedef int ExceptionCode;
50
51 class AbstractDatabase : public ThreadSafeRefCounted<AbstractDatabase> {
52 public:
53     static bool isAvailable();
54     static void setIsAvailable(bool available);
55
56     virtual ~AbstractDatabase();
57
58     virtual String version() const;
59
60     bool opened() const { return m_opened; }
61     bool isNew() const { return m_new; }
62     bool isSyncDatabase() const { return m_isSyncDatabase; }
63
64     virtual ScriptExecutionContext* scriptExecutionContext() const;
65     virtual SecurityOrigin* securityOrigin() const;
66     virtual String stringIdentifier() const;
67     virtual String displayName() const;
68     virtual unsigned long estimatedSize() const;
69     virtual String fileName() const;
70     SQLiteDatabase& sqliteDatabase() { return m_sqliteDatabase; }
71
72     unsigned long long maximumSize() const;
73     void incrementalVacuumIfNeeded();
74     void interrupt();
75     bool isInterrupted();
76
77     void disableAuthorizer();
78     void enableAuthorizer();
79     void setAuthorizerReadOnly();
80     void setAuthorizerPermissions(int permissions);
81     bool lastActionChangedDatabase();
82     bool lastActionWasInsert();
83     void resetDeletes();
84     bool hadDeletes();
85     void resetAuthorizer();
86
87     virtual void markAsDeletedAndClose() = 0;
88     virtual void closeImmediately() = 0;
89
90     DatabaseContext* databaseContext() const { return m_databaseContext; }
91
92 protected:
93     friend class ChangeVersionWrapper;
94     friend class SQLStatement;
95     friend class SQLStatementSync;
96     friend class SQLTransactionSync;
97     friend class SQLTransaction;
98
99     enum DatabaseType {
100         AsyncDatabase,
101         SyncDatabase
102     };
103
104     AbstractDatabase(ScriptExecutionContext*, const String& name, const String& expectedVersion,
105                      const String& displayName, unsigned long estimatedSize, DatabaseType);
106
107     void closeDatabase();
108
109     virtual bool performOpenAndVerify(bool shouldSetVersionInNewDatabase, ExceptionCode&, String& errorMessage);
110
111     bool getVersionFromDatabase(String& version, bool shouldCacheVersion = true);
112     bool setVersionInDatabase(const String& version, bool shouldCacheVersion = true);
113     void setExpectedVersion(const String&);
114     const String& expectedVersion() const { return m_expectedVersion; }
115     String getCachedVersion()const;
116     void setCachedVersion(const String&);
117     bool getActualVersionForTransaction(String& version);
118
119     void logErrorMessage(const String& message);
120
121     void reportOpenDatabaseResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode);
122     void reportChangeVersionResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode);
123     void reportStartTransactionResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode);
124     void reportCommitTransactionResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode);
125     void reportExecuteStatementResult(int errorSite, int webSqlErrorCode, int sqliteErrorCode);
126     void reportVacuumDatabaseResult(int sqliteErrorCode);
127
128     static const char* databaseInfoTableName();
129
130     RefPtr<SecurityOrigin> m_contextThreadSecurityOrigin;
131     RefPtr<ScriptExecutionContext> m_scriptExecutionContext;
132     DatabaseContext* m_databaseContext; // Owned by m_scriptExecutionContext.
133
134     String m_name;
135     String m_expectedVersion;
136     String m_displayName;
137     unsigned long m_estimatedSize;
138     String m_filename;
139
140 #if !LOG_DISABLED || !ERROR_DISABLED
141     String databaseDebugName() const { return m_contextThreadSecurityOrigin->toString() + "::" + m_name; }
142 #endif
143
144 private:
145     int m_guid;
146     bool m_opened;
147     bool m_new;
148     const bool m_isSyncDatabase;
149
150     SQLiteDatabase m_sqliteDatabase;
151
152     RefPtr<DatabaseAuthorizer> m_databaseAuthorizer;
153 };
154
155 } // namespace WebCore
156
157 #endif // ENABLE(SQL_DATABASE)
158
159 #endif // AbstractDatabase_h