1926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/*
2926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Copyright (C) 2012 Apple Inc. All rights reserved.
3926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *
4926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
5926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * modification, are permitted provided that the following conditions
6926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * are met:
7926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
8926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
9926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
10926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
11926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *    documentation and/or other materials provided with the distribution.
12926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *
13926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
25926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
26926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#ifndef DatabaseManager_h
27926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#define DatabaseManager_h
28926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/webdatabase/DatabaseBasicTypes.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "modules/webdatabase/DatabaseError.h"
3110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch#include "platform/heap/Handle.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/Assertions.h"
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/HashMap.h"
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/PassRefPtr.h"
353c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#include "wtf/ThreadingPrimitives.h"
3609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "wtf/text/WTFString.h"
37926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
38926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)namespace WebCore {
39926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
40926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class AbstractDatabaseServer;
41926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class Database;
42926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class DatabaseBackendBase;
43926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class DatabaseCallback;
44926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class DatabaseContext;
45926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class DatabaseSync;
46a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochclass TaskSynchronizer;
471e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)class ExceptionState;
48926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class SecurityOrigin;
491e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)class ExecutionContext;
50926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
517757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochtypedef int ExceptionCode;
527757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
53926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class DatabaseManager {
54926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WTF_MAKE_NONCOPYABLE(DatabaseManager); WTF_MAKE_FAST_ALLOCATED;
55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)public:
56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    static DatabaseManager& manager();
57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // These 2 methods are for DatabaseContext (un)registration, and should only
59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // be called by the DatabaseContext constructor and destructor.
60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void registerDatabaseContext(DatabaseContext*);
61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void unregisterDatabaseContext(DatabaseContext*);
62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
635d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#if ASSERT_ENABLED
64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void didConstructDatabaseContext();
65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void didDestructDatabaseContext();
66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#else
67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void didConstructDatabaseContext() { }
68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void didDestructDatabaseContext() { }
69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif
70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
71a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    static void throwExceptionForDatabaseError(DatabaseError, const String& errorMessage, ExceptionState&);
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
73d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    PassRefPtrWillBeRawPtr<Database> openDatabase(ExecutionContext*, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize, PassOwnPtr<DatabaseCallback>, DatabaseError&, String& errorMessage);
74d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    PassRefPtrWillBeRawPtr<DatabaseSync> openDatabaseSync(ExecutionContext*, const String& name, const String& expectedVersion, const String& displayName, unsigned long estimatedSize, PassOwnPtr<DatabaseCallback>, DatabaseError&, String& errorMessage);
75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    String fullPathForDatabase(SecurityOrigin*, const String& name, bool createIfDoesNotExist = true);
77926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void closeDatabasesImmediately(const String& originIdentifier, const String& name);
79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
80d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void interruptAllDatabasesForContext(DatabaseContext*);
81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)private:
83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DatabaseManager();
8407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    ~DatabaseManager();
85926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
8607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // This gets a DatabaseContext for the specified ExecutionContext.
8707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // If one doesn't already exist, it will create a new one.
8807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    DatabaseContext* databaseContextFor(ExecutionContext*);
891e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    // This gets a DatabaseContext for the specified ExecutionContext if
90926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // it already exist previously. Otherwise, it returns 0.
9107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    DatabaseContext* existingDatabaseContextFor(ExecutionContext*);
92926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
93d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    PassRefPtrWillBeRawPtr<DatabaseBackendBase> openDatabaseBackend(ExecutionContext*,
94926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        DatabaseType, const String& name, const String& expectedVersion, const String& displayName,
95926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        unsigned long estimatedSize, bool setVersionInNewDatabase, DatabaseError&, String& errorMessage);
96926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
971e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    static void logErrorMessage(ExecutionContext*, const String& message);
98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    AbstractDatabaseServer* m_server;
100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Access to the following fields require locking m_contextMapLock:
10207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#if ENABLE(OILPAN)
10307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // We can't use PersistentHeapHashMap because multiple threads update the map.
10407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    typedef HashMap<ExecutionContext*, OwnPtr<Persistent<DatabaseContext> > > ContextMap;
10507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#else
10607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    typedef HashMap<ExecutionContext*, RefPtr<DatabaseContext> > ContextMap;
10707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#endif
108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ContextMap m_contextMap;
1095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#if ASSERT_ENABLED
110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int m_databaseContextRegisteredCount;
111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int m_databaseContextInstanceCount;
112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif
113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Mutex m_contextMapLock;
114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} // namespace WebCore
117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif // DatabaseManager_h
119