18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2010 Google Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 255af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "config.h" 27db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#include "IDBIndex.h" 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 29dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if ENABLE(INDEXED_DATABASE) 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3168513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "IDBCursorBackendInterface.h" 324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include "IDBDatabaseException.h" 3368513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "IDBIndexBackendInterface.h" 3468513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "IDBKey.h" 3568513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "IDBKeyRange.h" 3681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "IDBObjectStore.h" 3768513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "IDBRequest.h" 382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "IDBTransaction.h" 3968513a70bcd92384395513322f1b801e7bf9c729Steve Block 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangstatic const unsigned short defaultDirection = IDBCursor::NEXT; 434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 4481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochIDBIndex::IDBIndex(PassRefPtr<IDBIndexBackendInterface> backend, IDBObjectStore* objectStore, IDBTransaction* transaction) 45db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block : m_backend(backend) 4681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch , m_objectStore(objectStore) 47a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch , m_transaction(transaction) 485af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{ 49a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch ASSERT(m_backend); 5081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(m_objectStore); 51a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch ASSERT(m_transaction); 525af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke} 535af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 54db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve BlockIDBIndex::~IDBIndex() 555af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{ 565af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke} 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 582fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockPassRefPtr<IDBRequest> IDBIndex::openCursor(ScriptExecutionContext* context, PassRefPtr<IDBKeyRange> keyRange, unsigned short direction, ExceptionCode& ec) 5968513a70bcd92384395513322f1b801e7bf9c729Steve Block{ 604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (direction != IDBCursor::NEXT && direction != IDBCursor::NEXT_NO_DUPLICATE && direction != IDBCursor::PREV && direction != IDBCursor::PREV_NO_DUPLICATE) { 614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang // FIXME: May need to change when specced: http://www.w3.org/Bugs/Public/show_bug.cgi?id=11406 624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ec = IDBDatabaseException::CONSTRAINT_ERR; 634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return 0; 644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 66a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get()); 6781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch request->setCursorType(IDBCursorBackendInterface::IndexCursor); 682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_backend->openCursor(keyRange, direction, request, m_transaction->backend(), ec); 6981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (ec) { 7081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch request->markEarlyDeath(); 71a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return 0; 7281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 7368513a70bcd92384395513322f1b801e7bf9c729Steve Block return request; 7468513a70bcd92384395513322f1b801e7bf9c729Steve Block} 7568513a70bcd92384395513322f1b801e7bf9c729Steve Block 762fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockPassRefPtr<IDBRequest> IDBIndex::openKeyCursor(ScriptExecutionContext* context, PassRefPtr<IDBKeyRange> keyRange, unsigned short direction, ExceptionCode& ec) 7768513a70bcd92384395513322f1b801e7bf9c729Steve Block{ 784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (direction != IDBCursor::NEXT && direction != IDBCursor::NEXT_NO_DUPLICATE && direction != IDBCursor::PREV && direction != IDBCursor::PREV_NO_DUPLICATE) { 794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang // FIXME: May need to change when specced: http://www.w3.org/Bugs/Public/show_bug.cgi?id=11406 804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ec = IDBDatabaseException::CONSTRAINT_ERR; 814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return 0; 824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang } 834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 84a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get()); 8581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch request->setCursorType(IDBCursorBackendInterface::IndexKeyCursor); 862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_backend->openKeyCursor(keyRange, direction, request, m_transaction->backend(), ec); 8781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (ec) { 8881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch request->markEarlyDeath(); 89a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return 0; 9081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 9168513a70bcd92384395513322f1b801e7bf9c729Steve Block return request; 9268513a70bcd92384395513322f1b801e7bf9c729Steve Block} 9368513a70bcd92384395513322f1b801e7bf9c729Steve Block 94a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochPassRefPtr<IDBRequest> IDBIndex::get(ScriptExecutionContext* context, PassRefPtr<IDBKey> key, ExceptionCode& ec) 9568513a70bcd92384395513322f1b801e7bf9c729Steve Block{ 96a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get()); 972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_backend->get(key, request, m_transaction->backend(), ec); 9881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (ec) { 9981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch request->markEarlyDeath(); 100a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return 0; 10181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 10268513a70bcd92384395513322f1b801e7bf9c729Steve Block return request; 10368513a70bcd92384395513322f1b801e7bf9c729Steve Block} 10468513a70bcd92384395513322f1b801e7bf9c729Steve Block 105a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochPassRefPtr<IDBRequest> IDBIndex::getKey(ScriptExecutionContext* context, PassRefPtr<IDBKey> key, ExceptionCode& ec) 10668513a70bcd92384395513322f1b801e7bf9c729Steve Block{ 107a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get()); 1082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_backend->getKey(key, request, m_transaction->backend(), ec); 10981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (ec) { 11081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch request->markEarlyDeath(); 111a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return 0; 11281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 11368513a70bcd92384395513322f1b801e7bf9c729Steve Block return request; 11468513a70bcd92384395513322f1b801e7bf9c729Steve Block} 11568513a70bcd92384395513322f1b801e7bf9c729Steve Block 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif // ENABLE(INDEXED_DATABASE) 119