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 are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #ifndef DatabaseSync_h 32 #define DatabaseSync_h 33 34 #include "bindings/v8/ScriptWrappable.h" 35 #include "modules/webdatabase/DatabaseBackendSync.h" 36 #include "modules/webdatabase/DatabaseBase.h" 37 #include "modules/webdatabase/DatabaseBasicTypes.h" 38 #include "platform/heap/Handle.h" 39 #include "wtf/Forward.h" 40 #include "wtf/text/WTFString.h" 41 42 #ifndef NDEBUG 43 #include "platform/weborigin/SecurityOrigin.h" 44 #endif 45 46 namespace WebCore { 47 48 class DatabaseCallback; 49 class ExceptionState; 50 class SQLTransactionSync; 51 class SQLTransactionSyncCallback; 52 class SecurityOrigin; 53 54 // Instances of this class should be created and used only on the worker's context thread. 55 class DatabaseSync FINAL : public DatabaseBackendSync, public DatabaseBase, public ScriptWrappable { 56 public: 57 virtual ~DatabaseSync(); 58 virtual void trace(Visitor*) OVERRIDE; 59 60 void changeVersion(const String& oldVersion, const String& newVersion, PassOwnPtr<SQLTransactionSyncCallback>, ExceptionState&); 61 void transaction(PassOwnPtr<SQLTransactionSyncCallback>, ExceptionState&); 62 void readTransaction(PassOwnPtr<SQLTransactionSyncCallback>, ExceptionState&); 63 64 virtual void closeImmediately() OVERRIDE; 65 void observeTransaction(SQLTransactionSync&); 66 67 const String& lastErrorMessage() const { return m_lastErrorMessage; } 68 void setLastErrorMessage(const String& message) { m_lastErrorMessage = message; } 69 void setLastErrorMessage(const char* message, int sqliteCode, const char* sqliteMessage) 70 { 71 setLastErrorMessage(String::format("%s (%d, %s)", message, sqliteCode, sqliteMessage)); 72 } 73 74 private: 75 DatabaseSync(DatabaseContext*, const String& name, 76 const String& expectedVersion, const String& displayName, unsigned long estimatedSize); 77 static PassRefPtrWillBeRawPtr<DatabaseSync> create(ExecutionContext*, PassRefPtrWillBeRawPtr<DatabaseBackendBase>); 78 79 void runTransaction(PassOwnPtr<SQLTransactionSyncCallback>, bool readOnly, ExceptionState&); 80 void rollbackTransaction(SQLTransactionSync&); 81 #if ENABLE(OILPAN) 82 class TransactionObserver { 83 public: 84 explicit TransactionObserver(SQLTransactionSync& transaction) : m_transaction(transaction) { } 85 ~TransactionObserver(); 86 87 private: 88 SQLTransactionSync& m_transaction; 89 }; 90 91 // Need a Persistent field because a HeapHashMap entry should be removed 92 // just after a SQLTransactionSync becomes untraceable. If this field was a 93 // Member<>, we could not assume the destruction order of DatabaseSync, 94 // SQLTransactionSync, and the field. We can not make the field static 95 // because multiple worker threads create SQLTransactionSync. 96 GC_PLUGIN_IGNORE("http://crbug.com/353083") 97 PersistentHeapHashMap<WeakMember<SQLTransactionSync>, OwnPtr<TransactionObserver> > m_observers; 98 #endif 99 100 String m_lastErrorMessage; 101 102 friend class DatabaseManager; 103 friend class DatabaseServer; // FIXME: remove this when the backend has been split out. 104 }; 105 106 } // namespace WebCore 107 108 #endif 109