1 /* 2 * Copyright (C) 2007, 2008 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 * 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 Database_h 30 #define Database_h 31 32 #include <wtf/MessageQueue.h> 33 #include "PlatformString.h" 34 #include "SecurityOrigin.h" 35 #include "SQLiteDatabase.h" 36 #include "SQLTransaction.h" 37 #include "StringHash.h" 38 #include "Timer.h" 39 #include "VoidCallback.h" 40 41 #include <wtf/Forward.h> 42 #include <wtf/HashSet.h> 43 #include <wtf/OwnPtr.h> 44 #include <wtf/PassRefPtr.h> 45 #include <wtf/RefPtr.h> 46 #include <wtf/Deque.h> 47 48 namespace WebCore { 49 50 class DatabaseAuthorizer; 51 class DatabaseThread; 52 class Document; 53 class SQLResultSet; 54 class SQLTransactionCallback; 55 class SQLTransactionErrorCallback; 56 class SQLValue; 57 58 typedef int ExceptionCode; 59 60 class Database : public ThreadSafeShared<Database> { 61 friend class DatabaseTransactionTask; 62 friend class SQLStatement; 63 friend class SQLTransaction; 64 public: 65 ~Database(); 66 67 // Direct support for the DOM API 68 static PassRefPtr<Database> openDatabase(Document* document, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize, ExceptionCode&); 69 String version() const; 70 void changeVersion(const String& oldVersion, const String& newVersion, 71 PassRefPtr<SQLTransactionCallback> callback, PassRefPtr<SQLTransactionErrorCallback> errorCallback, 72 PassRefPtr<VoidCallback> successCallback); 73 void transaction(PassRefPtr<SQLTransactionCallback> callback, PassRefPtr<SQLTransactionErrorCallback> errorCallback, 74 PassRefPtr<VoidCallback> successCallback); 75 76 // Internal engine support 77 static const String& databaseInfoTableName(); 78 79 void disableAuthorizer(); 80 void enableAuthorizer(); 81 82 Vector<String> tableNames(); 83 document()84 Document* document() const { return m_document.get(); } 85 PassRefPtr<SecurityOrigin> securityOriginCopy() const; 86 String stringIdentifier() const; 87 88 bool getVersionFromDatabase(String&); 89 bool setVersionInDatabase(const String&); 90 void setExpectedVersion(const String&); 91 bool versionMatchesExpected() const; 92 93 void markAsDeletedAndClose(); deleted()94 bool deleted() const { return m_deleted; } 95 96 void close(); 97 98 void stop(); stopped()99 bool stopped() const { return m_stopped; } 100 101 unsigned long long databaseSize() const; 102 unsigned long long maximumSize() const; 103 104 // Called from DatabaseThread, must be prepared to work on the background thread 105 void resetAuthorizer(); 106 void performPolicyChecks(); 107 108 bool performOpenAndVerify(ExceptionCode&); 109 110 Vector<String> performGetTableNames(); 111 112 private: 113 Database(Document* document, const String& name, const String& expectedVersion); 114 115 bool openAndVerifyVersion(ExceptionCode&); 116 117 void scheduleTransaction(); 118 void scheduleTransactionCallback(SQLTransaction*); 119 void scheduleTransactionStep(SQLTransaction* transaction); 120 121 MessageQueue<RefPtr<SQLTransaction> > m_transactionQueue; 122 Mutex m_transactionInProgressMutex; 123 bool m_transactionInProgress; 124 125 static void deliverPendingCallback(void*); 126 127 RefPtr<Document> m_document; 128 RefPtr<SecurityOrigin> m_securityOrigin; 129 String m_name; 130 int m_guid; 131 String m_expectedVersion; 132 String m_filename; 133 134 bool m_deleted; 135 136 bool m_stopped; 137 138 SQLiteDatabase m_sqliteDatabase; 139 RefPtr<DatabaseAuthorizer> m_databaseAuthorizer; 140 141 #ifndef NDEBUG databaseDebugName()142 String databaseDebugName() const { return m_securityOrigin->toString() + "::" + m_name; } 143 #endif 144 }; 145 146 } // namespace WebCore 147 148 #endif // Database_h 149