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