1563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/*
22daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Copyright (C) 2011 Google Inc. All rights reserved.
3563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
4563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Redistribution and use in source and binary forms, with or without
5563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * modification, are permitted provided that the following conditions
6563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * are met:
7563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
8563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 1.  Redistributions of source code must retain the above copyright
9563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     notice, this list of conditions and the following disclaimer.
10563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 2.  Redistributions in binary form must reproduce the above copyright
11563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     notice, this list of conditions and the following disclaimer in the
12563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     documentation and/or other materials provided with the distribution.
13563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     its contributors may be used to endorse or promote products derived
15563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     from this software without specific prior written permission.
16563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
17563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark */
285af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
29d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "config.h"
30db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#include "IDBFactoryBackendImpl.h"
31563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
32db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#include "DOMStringList.h"
33dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "IDBDatabaseBackendImpl.h"
34f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include "IDBDatabaseException.h"
352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "IDBLevelDBBackingStore.h"
362bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "IDBSQLiteBackingStore.h"
37e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include "IDBTransactionCoordinator.h"
38e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include "SecurityOrigin.h"
39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <wtf/Threading.h>
406c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#include <wtf/UnusedParam.h>
41563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if ENABLE(INDEXED_DATABASE)
43d0825bca7fe65beaee391d30da42e937db621564Steve Block
44dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocknamespace WebCore {
45d0825bca7fe65beaee391d30da42e937db621564Steve Block
4681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochIDBFactoryBackendImpl::IDBFactoryBackendImpl()
47e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    : m_transactionCoordinator(IDBTransactionCoordinator::create())
48d0825bca7fe65beaee391d30da42e937db621564Steve Block{
49d0825bca7fe65beaee391d30da42e937db621564Steve Block}
5081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
51f486d19d62f1bc33246748b14b14a9dfa617b57fIain MerrickIDBFactoryBackendImpl::~IDBFactoryBackendImpl()
520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
53d0825bca7fe65beaee391d30da42e937db621564Steve Block}
54d0825bca7fe65beaee391d30da42e937db621564Steve Block
5528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuvoid IDBFactoryBackendImpl::removeIDBDatabaseBackend(const String& uniqueIdentifier)
56e14391e94c850b8bd03680c23b38978db68687a8John Reck{
5728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    ASSERT(m_databaseBackendMap.contains(uniqueIdentifier));
5828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    m_databaseBackendMap.remove(uniqueIdentifier);
5928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu}
6028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
6181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid IDBFactoryBackendImpl::addIDBBackingStore(const String& uniqueIdentifier, IDBBackingStore* backingStore)
624a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch{
6381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT(!m_backingStoreMap.contains(uniqueIdentifier));
6481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_backingStoreMap.set(uniqueIdentifier, backingStore);
654a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch}
664a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch
6781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid IDBFactoryBackendImpl::removeIDBBackingStore(const String& uniqueIdentifier)
684a156157940f51b91eadd76f6c86f862ec0a1da0Ben Murdoch{
6981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ASSERT(m_backingStoreMap.contains(uniqueIdentifier));
7081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_backingStoreMap.remove(uniqueIdentifier);
71f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
72f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid IDBFactoryBackendImpl::open(const String& name, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<SecurityOrigin> securityOrigin, Frame*, const String& dataDir, int64_t maximumSize, BackingStoreType backingStoreType)
74d0825bca7fe65beaee391d30da42e937db621564Steve Block{
75e14391e94c850b8bd03680c23b38978db68687a8John Reck    String fileIdentifier = securityOrigin->databaseIdentifier();
76e14391e94c850b8bd03680c23b38978db68687a8John Reck    String uniqueIdentifier = fileIdentifier + "@" + name;
77e14391e94c850b8bd03680c23b38978db68687a8John Reck    IDBDatabaseBackendMap::iterator it = m_databaseBackendMap.find(uniqueIdentifier);
78f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (it != m_databaseBackendMap.end()) {
7928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        callbacks->onSuccess(it->second);
80f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        return;
81f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    }
82f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
83f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // FIXME: Everything from now on should be done on another thread.
84f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
8581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RefPtr<IDBBackingStore> backingStore;
8681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    IDBBackingStoreMap::iterator it2 = m_backingStoreMap.find(fileIdentifier);
8781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (it2 != m_backingStoreMap.end())
8881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        backingStore = it2->second;
89e14391e94c850b8bd03680c23b38978db68687a8John Reck    else {
902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (backingStoreType == DefaultBackingStore)
912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            backingStore = IDBSQLiteBackingStore::open(securityOrigin.get(), dataDir, maximumSize, fileIdentifier, this);
922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if ENABLE(LEVELDB)
932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        else if (backingStoreType == LevelDBBackingStore)
942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            backingStore = IDBLevelDBBackingStore::open(securityOrigin.get(), dataDir, maximumSize, fileIdentifier, this);
952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
9681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (!backingStore) {
97e14391e94c850b8bd03680c23b38978db68687a8John Reck            callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UNKNOWN_ERR, "Internal error."));
98e14391e94c850b8bd03680c23b38978db68687a8John Reck            return;
99e14391e94c850b8bd03680c23b38978db68687a8John Reck        }
100f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    }
101f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
10281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RefPtr<IDBDatabaseBackendImpl> databaseBackend = IDBDatabaseBackendImpl::create(name, backingStore.get(), m_transactionCoordinator.get(), this, uniqueIdentifier);
103f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    callbacks->onSuccess(databaseBackend.get());
10428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    m_databaseBackendMap.set(uniqueIdentifier, databaseBackend.get());
105d0825bca7fe65beaee391d30da42e937db621564Steve Block}
106d0825bca7fe65beaee391d30da42e937db621564Steve Block
107d0825bca7fe65beaee391d30da42e937db621564Steve Block} // namespace WebCore
1080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
109d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif // ENABLE(INDEXED_DATABASE)
110