| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright (C) 2010 Google Inc. All rights reserved. | 2  * Copyright (C) 2010 Google Inc. All rights reserved. | 
| 3  * | 3  * | 
| 4  * Redistribution and use in source and binary forms, with or without | 4  * Redistribution and use in source and binary forms, with or without | 
| 5  * modification, are permitted provided that the following conditions | 5  * modification, are permitted provided that the following conditions | 
| 6  * are met: | 6  * are met: | 
| 7  * | 7  * | 
| 8  * 1.  Redistributions of source code must retain the above copyright | 8  * 1.  Redistributions of source code must retain the above copyright | 
| 9  *     notice, this list of conditions and the following disclaimer. | 9  *     notice, this list of conditions and the following disclaimer. | 
| 10  * 2.  Redistributions in binary form must reproduce the above copyright | 10  * 2.  Redistributions in binary form must reproduce the above copyright | 
| (...skipping 22 matching lines...) Expand all  Loading... | 
| 33 #include "modules/indexeddb/IDBDatabaseError.h" | 33 #include "modules/indexeddb/IDBDatabaseError.h" | 
| 34 #include "modules/indexeddb/IDBDatabaseException.h" | 34 #include "modules/indexeddb/IDBDatabaseException.h" | 
| 35 #include "modules/indexeddb/IDBKeyRange.h" | 35 #include "modules/indexeddb/IDBKeyRange.h" | 
| 36 #include "modules/indexeddb/IDBTracing.h" | 36 #include "modules/indexeddb/IDBTracing.h" | 
| 37 #include "modules/indexeddb/IDBTransactionBackendImpl.h" | 37 #include "modules/indexeddb/IDBTransactionBackendImpl.h" | 
| 38 | 38 | 
| 39 namespace WebCore { | 39 namespace WebCore { | 
| 40 | 40 | 
| 41 class IDBCursorBackendImpl::CursorIterationOperation : public IDBTransactionBack
     endImpl::Operation { | 41 class IDBCursorBackendImpl::CursorIterationOperation : public IDBTransactionBack
     endImpl::Operation { | 
| 42 public: | 42 public: | 
| 43     static PassOwnPtr<IDBTransactionBackendImpl::Operation> create(PassRefPtr<ID
     BCursorBackendImpl> cursor, PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks> cal
     lbacks) | 43     static PassOwnPtr<IDBTransactionBackendImpl::Operation> create(PassRefPtr<ID
     BCursorBackendImpl> cursor, PassRefPtr<IDBKey> key, IDBCallbacks* callbacks) | 
| 44     { | 44     { | 
| 45         return adoptPtr(new CursorIterationOperation(cursor, key, callbacks)); | 45         return adoptPtr(new CursorIterationOperation(cursor, key, callbacks)); | 
| 46     } | 46     } | 
| 47     virtual void perform(IDBTransactionBackendImpl*); | 47     virtual void perform(IDBTransactionBackendImpl*); | 
| 48 private: | 48 private: | 
| 49     CursorIterationOperation(PassRefPtr<IDBCursorBackendImpl> cursor, PassRefPtr
     <IDBKey> key, PassRefPtr<IDBCallbacks> callbacks) | 49     CursorIterationOperation(PassRefPtr<IDBCursorBackendImpl> cursor, PassRefPtr
     <IDBKey> key, IDBCallbacks* callbacks) | 
| 50         : m_cursor(cursor) | 50         : m_cursor(cursor) | 
| 51         , m_key(key) | 51         , m_key(key) | 
| 52         , m_callbacks(callbacks) | 52         , m_callbacks(callbacks) | 
| 53     { | 53     { | 
| 54     } | 54     } | 
| 55 | 55 | 
| 56     RefPtr<IDBCursorBackendImpl> m_cursor; | 56     RefPtr<IDBCursorBackendImpl> m_cursor; | 
| 57     RefPtr<IDBKey> m_key; | 57     RefPtr<IDBKey> m_key; | 
| 58     RefPtr<IDBCallbacks> m_callbacks; | 58     Persistent<IDBCallbacks> m_callbacks; | 
| 59 }; | 59 }; | 
| 60 | 60 | 
| 61 class IDBCursorBackendImpl::CursorAdvanceOperation : public IDBTransactionBacken
     dImpl::Operation { | 61 class IDBCursorBackendImpl::CursorAdvanceOperation : public IDBTransactionBacken
     dImpl::Operation { | 
| 62 public: | 62 public: | 
| 63     static PassOwnPtr<IDBTransactionBackendImpl::Operation> create(PassRefPtr<ID
     BCursorBackendImpl> cursor, unsigned long count, PassRefPtr<IDBCallbacks> callba
     cks) | 63     static PassOwnPtr<IDBTransactionBackendImpl::Operation> create(PassRefPtr<ID
     BCursorBackendImpl> cursor, unsigned long count, IDBCallbacks* callbacks) | 
| 64     { | 64     { | 
| 65         return adoptPtr(new CursorAdvanceOperation(cursor, count, callbacks)); | 65         return adoptPtr(new CursorAdvanceOperation(cursor, count, callbacks)); | 
| 66     } | 66     } | 
| 67     virtual void perform(IDBTransactionBackendImpl*); | 67     virtual void perform(IDBTransactionBackendImpl*); | 
| 68 private: | 68 private: | 
| 69     CursorAdvanceOperation(PassRefPtr<IDBCursorBackendImpl> cursor, unsigned lon
     g count, PassRefPtr<IDBCallbacks> callbacks) | 69     CursorAdvanceOperation(PassRefPtr<IDBCursorBackendImpl> cursor, unsigned lon
     g count, IDBCallbacks* callbacks) | 
| 70         : m_cursor(cursor) | 70         : m_cursor(cursor) | 
| 71         , m_count(count) | 71         , m_count(count) | 
| 72         , m_callbacks(callbacks) | 72         , m_callbacks(callbacks) | 
| 73     { | 73     { | 
| 74     } | 74     } | 
| 75 | 75 | 
| 76     RefPtr<IDBCursorBackendImpl> m_cursor; | 76     RefPtr<IDBCursorBackendImpl> m_cursor; | 
| 77     unsigned long m_count; | 77     unsigned long m_count; | 
| 78     RefPtr<IDBCallbacks> m_callbacks; | 78     Persistent<IDBCallbacks> m_callbacks; | 
| 79 }; | 79 }; | 
| 80 | 80 | 
| 81 class IDBCursorBackendImpl::CursorPrefetchIterationOperation : public IDBTransac
     tionBackendImpl::Operation { | 81 class IDBCursorBackendImpl::CursorPrefetchIterationOperation : public IDBTransac
     tionBackendImpl::Operation { | 
| 82 public: | 82 public: | 
| 83     static PassOwnPtr<IDBTransactionBackendImpl::Operation> create(PassRefPtr<ID
     BCursorBackendImpl> cursor, int numberToFetch, PassRefPtr<IDBCallbacks> callback
     s) | 83     static PassOwnPtr<IDBTransactionBackendImpl::Operation> create(PassRefPtr<ID
     BCursorBackendImpl> cursor, int numberToFetch, IDBCallbacks* callbacks) | 
| 84     { | 84     { | 
| 85         return adoptPtr(new CursorPrefetchIterationOperation(cursor, numberToFet
     ch, callbacks)); | 85         return adoptPtr(new CursorPrefetchIterationOperation(cursor, numberToFet
     ch, callbacks)); | 
| 86     } | 86     } | 
| 87     virtual void perform(IDBTransactionBackendImpl*); | 87     virtual void perform(IDBTransactionBackendImpl*); | 
| 88 private: | 88 private: | 
| 89     CursorPrefetchIterationOperation(PassRefPtr<IDBCursorBackendImpl> cursor, in
     t numberToFetch, PassRefPtr<IDBCallbacks> callbacks) | 89     CursorPrefetchIterationOperation(PassRefPtr<IDBCursorBackendImpl> cursor, in
     t numberToFetch, IDBCallbacks* callbacks) | 
| 90         : m_cursor(cursor) | 90         : m_cursor(cursor) | 
| 91         , m_numberToFetch(numberToFetch) | 91         , m_numberToFetch(numberToFetch) | 
| 92         , m_callbacks(callbacks) | 92         , m_callbacks(callbacks) | 
| 93     { | 93     { | 
| 94     } | 94     } | 
| 95 | 95 | 
| 96     RefPtr<IDBCursorBackendImpl> m_cursor; | 96     RefPtr<IDBCursorBackendImpl> m_cursor; | 
| 97     int m_numberToFetch; | 97     int m_numberToFetch; | 
| 98     RefPtr<IDBCallbacks> m_callbacks; | 98     Persistent<IDBCallbacks> m_callbacks; | 
| 99 }; | 99 }; | 
| 100 | 100 | 
| 101 IDBCursorBackendImpl::IDBCursorBackendImpl(PassRefPtr<IDBBackingStore::Cursor> c
     ursor, IndexedDB::CursorType cursorType, IDBDatabaseBackendInterface::TaskType t
     askType, IDBTransactionBackendImpl* transaction, int64_t objectStoreId) | 101 IDBCursorBackendImpl::IDBCursorBackendImpl(PassRefPtr<IDBBackingStore::Cursor> c
     ursor, IndexedDB::CursorType cursorType, IDBDatabaseBackendInterface::TaskType t
     askType, IDBTransactionBackendImpl* transaction, int64_t objectStoreId) | 
| 102     : m_taskType(taskType) | 102     : m_taskType(taskType) | 
| 103     , m_cursorType(cursorType) | 103     , m_cursorType(cursorType) | 
| 104     , m_database(transaction->database()) | 104     , m_database(transaction->database()) | 
| 105     , m_transaction(transaction) | 105     , m_transaction(transaction) | 
| 106     , m_objectStoreId(objectStoreId) | 106     , m_objectStoreId(objectStoreId) | 
| 107     , m_cursor(cursor) | 107     , m_cursor(cursor) | 
| 108     , m_closed(false) | 108     , m_closed(false) | 
| 109 { | 109 { | 
| 110     m_transaction->registerOpenCursor(this); | 110     m_transaction->registerOpenCursor(this); | 
| 111 } | 111 } | 
| 112 | 112 | 
| 113 IDBCursorBackendImpl::~IDBCursorBackendImpl() | 113 IDBCursorBackendImpl::~IDBCursorBackendImpl() | 
| 114 { | 114 { | 
| 115     m_transaction->unregisterOpenCursor(this); | 115     m_transaction->unregisterOpenCursor(this); | 
| 116 } | 116 } | 
| 117 | 117 | 
| 118 | 118 | 
| 119 void IDBCursorBackendImpl::continueFunction(PassRefPtr<IDBKey> key, PassRefPtr<I
     DBCallbacks> prpCallbacks) | 119 void IDBCursorBackendImpl::continueFunction(PassRefPtr<IDBKey> key, IDBCallbacks
     * callbacks) | 
| 120 { | 120 { | 
| 121     IDB_TRACE("IDBCursorBackendImpl::continue"); | 121     IDB_TRACE("IDBCursorBackendImpl::continue"); | 
| 122     RefPtr<IDBCallbacks> callbacks = prpCallbacks; |  | 
| 123     m_transaction->scheduleTask(m_taskType, CursorIterationOperation::create(thi
     s, key, callbacks)); | 122     m_transaction->scheduleTask(m_taskType, CursorIterationOperation::create(thi
     s, key, callbacks)); | 
| 124 } | 123 } | 
| 125 | 124 | 
| 126 void IDBCursorBackendImpl::advance(unsigned long count, PassRefPtr<IDBCallbacks>
      prpCallbacks) | 125 void IDBCursorBackendImpl::advance(unsigned long count, IDBCallbacks* callbacks) | 
| 127 { | 126 { | 
| 128     IDB_TRACE("IDBCursorBackendImpl::advance"); | 127     IDB_TRACE("IDBCursorBackendImpl::advance"); | 
| 129     RefPtr<IDBCallbacks> callbacks = prpCallbacks; |  | 
| 130     m_transaction->scheduleTask(CursorAdvanceOperation::create(this, count, call
     backs)); | 128     m_transaction->scheduleTask(CursorAdvanceOperation::create(this, count, call
     backs)); | 
| 131 } | 129 } | 
| 132 | 130 | 
| 133 void IDBCursorBackendImpl::CursorAdvanceOperation::perform(IDBTransactionBackend
     Impl*) | 131 void IDBCursorBackendImpl::CursorAdvanceOperation::perform(IDBTransactionBackend
     Impl*) | 
| 134 { | 132 { | 
| 135     IDB_TRACE("CursorAdvanceOperation"); | 133     IDB_TRACE("CursorAdvanceOperation"); | 
| 136     if (!m_cursor->m_cursor || !m_cursor->m_cursor->advance(m_count)) { | 134     if (!m_cursor->m_cursor || !m_cursor->m_cursor->advance(m_count)) { | 
| 137         m_cursor->m_cursor = 0; | 135         m_cursor->m_cursor = 0; | 
| 138         m_callbacks->onSuccess(static_cast<SharedBuffer*>(0)); | 136         m_callbacks->onSuccess(static_cast<SharedBuffer*>(0)); | 
| 139         return; | 137         return; | 
| 140     } | 138     } | 
| 141 | 139 | 
| 142     m_callbacks->onSuccess(m_cursor->key(), m_cursor->primaryKey(), m_cursor->va
     lue()); | 140     m_callbacks->onSuccess(m_cursor->key(), m_cursor->primaryKey(), m_cursor->va
     lue()); | 
| 143 } | 141 } | 
| 144 | 142 | 
| 145 void IDBCursorBackendImpl::CursorIterationOperation::perform(IDBTransactionBacke
     ndImpl*) | 143 void IDBCursorBackendImpl::CursorIterationOperation::perform(IDBTransactionBacke
     ndImpl*) | 
| 146 { | 144 { | 
| 147     IDB_TRACE("CursorIterationOperation"); | 145     IDB_TRACE("CursorIterationOperation"); | 
| 148     if (!m_cursor->m_cursor || !m_cursor->m_cursor->continueFunction(m_key.get()
     )) { | 146     if (!m_cursor->m_cursor || !m_cursor->m_cursor->continueFunction(m_key.get()
     )) { | 
| 149         m_cursor->m_cursor = 0; | 147         m_cursor->m_cursor = 0; | 
| 150         m_callbacks->onSuccess(static_cast<SharedBuffer*>(0)); | 148         m_callbacks->onSuccess(static_cast<SharedBuffer*>(0)); | 
| 151         return; | 149         return; | 
| 152     } | 150     } | 
| 153 | 151 | 
| 154     m_callbacks->onSuccess(m_cursor->key(), m_cursor->primaryKey(), m_cursor->va
     lue()); | 152     m_callbacks->onSuccess(m_cursor->key(), m_cursor->primaryKey(), m_cursor->va
     lue()); | 
| 155 } | 153 } | 
| 156 | 154 | 
| 157 void IDBCursorBackendImpl::deleteFunction(PassRefPtr<IDBCallbacks> prpCallbacks) | 155 void IDBCursorBackendImpl::deleteFunction(IDBCallbacks* callbacks) | 
| 158 { | 156 { | 
| 159     IDB_TRACE("IDBCursorBackendImpl::delete"); | 157     IDB_TRACE("IDBCursorBackendImpl::delete"); | 
| 160     ASSERT(m_transaction->mode() != IndexedDB::TransactionReadOnly); | 158     ASSERT(m_transaction->mode() != IndexedDB::TransactionReadOnly); | 
| 161     RefPtr<IDBKeyRange> keyRange = IDBKeyRange::create(m_cursor->primaryKey()); | 159     RefPtr<IDBKeyRange> keyRange = IDBKeyRange::create(m_cursor->primaryKey()); | 
| 162     m_database->deleteRange(m_transaction->id(), m_objectStoreId, keyRange.relea
     se(), prpCallbacks); | 160     m_database->deleteRange(m_transaction->id(), m_objectStoreId, keyRange.relea
     se(), callbacks); | 
| 163 } | 161 } | 
| 164 | 162 | 
| 165 void IDBCursorBackendImpl::prefetchContinue(int numberToFetch, PassRefPtr<IDBCal
     lbacks> prpCallbacks) | 163 void IDBCursorBackendImpl::prefetchContinue(int numberToFetch, IDBCallbacks* cal
     lbacks) | 
| 166 { | 164 { | 
| 167     IDB_TRACE("IDBCursorBackendImpl::prefetchContinue"); | 165     IDB_TRACE("IDBCursorBackendImpl::prefetchContinue"); | 
| 168     RefPtr<IDBCallbacks> callbacks = prpCallbacks; |  | 
| 169     m_transaction->scheduleTask(m_taskType, CursorPrefetchIterationOperation::cr
     eate(this, numberToFetch, callbacks)); | 166     m_transaction->scheduleTask(m_taskType, CursorPrefetchIterationOperation::cr
     eate(this, numberToFetch, callbacks)); | 
| 170 } | 167 } | 
| 171 | 168 | 
| 172 void IDBCursorBackendImpl::CursorPrefetchIterationOperation::perform(IDBTransact
     ionBackendImpl*) | 169 void IDBCursorBackendImpl::CursorPrefetchIterationOperation::perform(IDBTransact
     ionBackendImpl*) | 
| 173 { | 170 { | 
| 174     IDB_TRACE("CursorPrefetchIterationOperation"); | 171     IDB_TRACE("CursorPrefetchIterationOperation"); | 
| 175 | 172 | 
| 176     Vector<RefPtr<IDBKey> > foundKeys; | 173     Vector<RefPtr<IDBKey> > foundKeys; | 
| 177     Vector<RefPtr<IDBKey> > foundPrimaryKeys; | 174     Vector<RefPtr<IDBKey> > foundPrimaryKeys; | 
| 178     Vector<RefPtr<SharedBuffer> > foundValues; | 175     Vector<RefPtr<SharedBuffer> > foundValues; | 
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 236 | 233 | 
| 237 void IDBCursorBackendImpl::close() | 234 void IDBCursorBackendImpl::close() | 
| 238 { | 235 { | 
| 239     IDB_TRACE("IDBCursorBackendImpl::close"); | 236     IDB_TRACE("IDBCursorBackendImpl::close"); | 
| 240     m_closed = true; | 237     m_closed = true; | 
| 241     m_cursor.clear(); | 238     m_cursor.clear(); | 
| 242     m_savedCursor.clear(); | 239     m_savedCursor.clear(); | 
| 243 } | 240 } | 
| 244 | 241 | 
| 245 } // namespace WebCore | 242 } // namespace WebCore | 
| OLD | NEW | 
|---|