| 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 |