summaryrefslogtreecommitdiffstats
path: root/WebCore/storage/IDBDatabase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/storage/IDBDatabase.cpp')
-rw-r--r--WebCore/storage/IDBDatabase.cpp52
1 files changed, 33 insertions, 19 deletions
diff --git a/WebCore/storage/IDBDatabase.cpp b/WebCore/storage/IDBDatabase.cpp
index 0ea7ac2..1ee0fa9 100644
--- a/WebCore/storage/IDBDatabase.cpp
+++ b/WebCore/storage/IDBDatabase.cpp
@@ -27,7 +27,10 @@
#include "IDBDatabase.h"
#include "IDBAny.h"
+#include "IDBDatabaseError.h"
+#include "IDBDatabaseException.h"
#include "IDBFactoryBackendInterface.h"
+#include "IDBIndex.h"
#include "IDBObjectStore.h"
#include "IDBRequest.h"
#include "IDBTransaction.h"
@@ -40,7 +43,7 @@ namespace WebCore {
IDBDatabase::IDBDatabase(PassRefPtr<IDBDatabaseBackendInterface> backend)
: m_backend(backend)
{
- // We pass a reference to this object before it can be adopted.
+ // We pass a reference of this object before it can be adopted.
relaxAdoptionRequirement();
}
@@ -48,47 +51,58 @@ IDBDatabase::~IDBDatabase()
{
}
-PassRefPtr<IDBRequest> IDBDatabase::createObjectStore(ScriptExecutionContext* context, const String& name, const String& keyPath, bool autoIncrement)
+void IDBDatabase::setSetVersionTransaction(IDBTransactionBackendInterface* transaction)
{
- RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this));
- m_backend->createObjectStore(name, keyPath, autoIncrement, request);
- return request;
+ m_setVersionTransaction = transaction;
}
-// FIXME: remove this method.
-PassRefPtr<IDBObjectStore> IDBDatabase::objectStore(const String& name, unsigned short mode)
+PassRefPtr<IDBObjectStore> IDBDatabase::createObjectStore(const String& name, const String& keyPath, bool autoIncrement, ExceptionCode& ec)
{
- RefPtr<IDBObjectStoreBackendInterface> objectStore = m_backend->objectStore(name, mode);
- ASSERT(objectStore); // FIXME: If this is null, we should raise a NOT_FOUND_ERR.
- return IDBObjectStore::create(objectStore.release(), 0);
+ if (!m_setVersionTransaction) {
+ ec = IDBDatabaseException::NOT_ALLOWED_ERR;
+ return 0;
+ }
+
+ RefPtr<IDBObjectStoreBackendInterface> objectStore = m_backend->createObjectStore(name, keyPath, autoIncrement, m_setVersionTransaction.get(), ec);
+ if (!objectStore)
+ return 0;
+ return IDBObjectStore::create(objectStore.release(), m_setVersionTransaction.get());
}
-PassRefPtr<IDBRequest> IDBDatabase::removeObjectStore(ScriptExecutionContext* context, const String& name)
+void IDBDatabase::removeObjectStore(const String& name, ExceptionCode& ec)
{
- RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this));
- m_backend->removeObjectStore(name, request);
- return request;
+ if (!m_setVersionTransaction) {
+ ec = IDBDatabaseException::NOT_ALLOWED_ERR;
+ return;
+ }
+
+ m_backend->removeObjectStore(name, m_setVersionTransaction.get(), ec);
}
-PassRefPtr<IDBRequest> IDBDatabase::setVersion(ScriptExecutionContext* context, const String& version)
+PassRefPtr<IDBRequest> IDBDatabase::setVersion(ScriptExecutionContext* context, const String& version, ExceptionCode& ec)
{
- RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this));
- m_backend->setVersion(version, request);
+ RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), 0);
+ m_backend->setVersion(version, request, ec);
return request;
}
-PassRefPtr<IDBTransaction> IDBDatabase::transaction(ScriptExecutionContext* context, DOMStringList* storeNames, unsigned short mode, unsigned long timeout)
+PassRefPtr<IDBTransaction> IDBDatabase::transaction(ScriptExecutionContext* context, DOMStringList* storeNames, unsigned short mode, unsigned long timeout, ExceptionCode& ec)
{
// We need to create a new transaction synchronously. Locks are acquired asynchronously. Operations
// can be queued against the transaction at any point. They will start executing as soon as the
// appropriate locks have been acquired.
// Also note that each backend object corresponds to exactly one IDBTransaction object.
- RefPtr<IDBTransactionBackendInterface> transactionBackend = m_backend->transaction(storeNames, mode, timeout);
+ RefPtr<IDBTransactionBackendInterface> transactionBackend = m_backend->transaction(storeNames, mode, timeout, ec);
RefPtr<IDBTransaction> transaction = IDBTransaction::create(context, transactionBackend, this);
transactionBackend->setCallbacks(transaction.get());
return transaction.release();
}
+void IDBDatabase::close()
+{
+ m_backend->close();
+}
+
} // namespace WebCore
#endif // ENABLE(INDEXED_DATABASE)