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 |