1 /* 2 * Copyright (C) 2010 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(DATABASE) 33 34 #include "ExceptionCode.h" 35 #include "PlatformString.h" 36 #include "SQLiteDatabase.h" 37 #include <wtf/Forward.h> 38 #include <wtf/ThreadSafeRefCounted.h> 39 #if !LOG_DISABLED || !ERROR_DISABLED 40 #include "SecurityOrigin.h" 41 #endif 42 43 namespace WebCore { 44 45 class DatabaseAuthorizer; 46 class ScriptExecutionContext; 47 class SecurityOrigin; 48 49 class AbstractDatabase : public ThreadSafeRefCounted<AbstractDatabase> { 50 public: 51 static bool isAvailable(); 52 static void setIsAvailable(bool available); 53 54 virtual ~AbstractDatabase(); 55 56 virtual String version() const; 57 58 bool opened() const { return m_opened; } 59 bool isNew() const { return m_new; } 60 61 virtual ScriptExecutionContext* scriptExecutionContext() const; 62 virtual SecurityOrigin* securityOrigin() const; 63 virtual String stringIdentifier() const; 64 virtual String displayName() const; 65 virtual unsigned long estimatedSize() const; 66 virtual String fileName() const; 67 SQLiteDatabase& sqliteDatabase() { return m_sqliteDatabase; } 68 69 unsigned long long maximumSize() const; 70 void incrementalVacuumIfNeeded(); 71 void interrupt(); 72 bool isInterrupted(); 73 74 // FIXME: move all version-related methods to a DatabaseVersionTracker class 75 bool versionMatchesExpected() const; 76 void setExpectedVersion(const String& version); 77 bool getVersionFromDatabase(String& version); 78 bool setVersionInDatabase(const String& version); 79 80 void disableAuthorizer(); 81 void enableAuthorizer(); 82 void setAuthorizerReadOnly(); 83 void setAuthorizerPermissions(int permissions); 84 bool lastActionChangedDatabase(); 85 bool lastActionWasInsert(); 86 void resetDeletes(); 87 bool hadDeletes(); 88 void resetAuthorizer(); 89 90 virtual void markAsDeletedAndClose() = 0; 91 virtual void closeImmediately() = 0; 92 93 protected: 94 AbstractDatabase(ScriptExecutionContext*, const String& name, const String& expectedVersion, 95 const String& displayName, unsigned long estimatedSize); 96 97 void closeDatabase(); 98 99 virtual bool performOpenAndVerify(bool shouldSetVersionInNewDatabase, ExceptionCode& ec); 100 101 static const String& databaseInfoTableName(); 102 103 RefPtr<ScriptExecutionContext> m_scriptExecutionContext; 104 RefPtr<SecurityOrigin> m_contextThreadSecurityOrigin; 105 106 String m_name; 107 String m_expectedVersion; 108 String m_displayName; 109 unsigned long m_estimatedSize; 110 String m_filename; 111 112 #if !LOG_DISABLED || !ERROR_DISABLED 113 String databaseDebugName() const { return m_contextThreadSecurityOrigin->toString() + "::" + m_name; } 114 #endif 115 116 private: 117 static const String& databaseVersionKey(); 118 119 int m_guid; 120 bool m_opened; 121 bool m_new; 122 123 SQLiteDatabase m_sqliteDatabase; 124 125 RefPtr<DatabaseAuthorizer> m_databaseAuthorizer; 126 }; 127 128 } // namespace WebCore 129 130 #endif // ENABLE(DATABASE) 131 132 #endif // AbstractDatabase_h 133