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