OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/indexed_db/indexed_db_cursor.h" | 5 #include "content/browser/indexed_db/indexed_db_cursor.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "content/browser/indexed_db/indexed_db_callbacks.h" | 8 #include "content/browser/indexed_db/indexed_db_callbacks.h" |
9 #include "content/browser/indexed_db/indexed_db_database_error.h" | 9 #include "content/browser/indexed_db/indexed_db_database_error.h" |
10 #include "content/browser/indexed_db/indexed_db_tracing.h" | 10 #include "content/browser/indexed_db/indexed_db_tracing.h" |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 | 91 |
92 transaction_->ScheduleTask( | 92 transaction_->ScheduleTask( |
93 new CursorAdvanceOperation(this, count, callbacks)); | 93 new CursorAdvanceOperation(this, count, callbacks)); |
94 } | 94 } |
95 | 95 |
96 void IndexedDBCursor::CursorAdvanceOperation::Perform( | 96 void IndexedDBCursor::CursorAdvanceOperation::Perform( |
97 IndexedDBTransaction* /*transaction*/) { | 97 IndexedDBTransaction* /*transaction*/) { |
98 IDB_TRACE("CursorAdvanceOperation"); | 98 IDB_TRACE("CursorAdvanceOperation"); |
99 if (!cursor_->cursor_ || !cursor_->cursor_->Advance(count_)) { | 99 if (!cursor_->cursor_ || !cursor_->cursor_->Advance(count_)) { |
100 cursor_->cursor_.reset(); | 100 cursor_->cursor_.reset(); |
101 callbacks_->OnSuccess(static_cast<std::vector<char>*>(NULL)); | 101 callbacks_->OnSuccess(static_cast<std::string*>(NULL)); |
102 return; | 102 return; |
103 } | 103 } |
104 | 104 |
105 callbacks_->OnSuccess( | 105 callbacks_->OnSuccess( |
106 cursor_->key(), cursor_->primary_key(), cursor_->Value()); | 106 cursor_->key(), cursor_->primary_key(), cursor_->Value()); |
107 } | 107 } |
108 | 108 |
109 void IndexedDBCursor::CursorIterationOperation::Perform( | 109 void IndexedDBCursor::CursorIterationOperation::Perform( |
110 IndexedDBTransaction* /*transaction*/) { | 110 IndexedDBTransaction* /*transaction*/) { |
111 IDB_TRACE("CursorIterationOperation"); | 111 IDB_TRACE("CursorIterationOperation"); |
112 if (!cursor_->cursor_ || | 112 if (!cursor_->cursor_ || |
113 !cursor_->cursor_->ContinueFunction( | 113 !cursor_->cursor_->ContinueFunction( |
114 key_.get(), IndexedDBBackingStore::Cursor::SEEK)) { | 114 key_.get(), IndexedDBBackingStore::Cursor::SEEK)) { |
115 cursor_->cursor_.reset(); | 115 cursor_->cursor_.reset(); |
116 callbacks_->OnSuccess(static_cast<std::vector<char>*>(NULL)); | 116 callbacks_->OnSuccess(static_cast<std::string*>(NULL)); |
117 return; | 117 return; |
118 } | 118 } |
119 | 119 |
120 callbacks_->OnSuccess( | 120 callbacks_->OnSuccess( |
121 cursor_->key(), cursor_->primary_key(), cursor_->Value()); | 121 cursor_->key(), cursor_->primary_key(), cursor_->Value()); |
122 } | 122 } |
123 | 123 |
124 void IndexedDBCursor::PrefetchContinue( | 124 void IndexedDBCursor::PrefetchContinue( |
125 int number_to_fetch, | 125 int number_to_fetch, |
126 scoped_refptr<IndexedDBCallbacks> callbacks) { | 126 scoped_refptr<IndexedDBCallbacks> callbacks) { |
127 IDB_TRACE("IndexedDBCursor::PrefetchContinue"); | 127 IDB_TRACE("IndexedDBCursor::PrefetchContinue"); |
128 | 128 |
129 transaction_->ScheduleTask( | 129 transaction_->ScheduleTask( |
130 task_type_, | 130 task_type_, |
131 new CursorPrefetchIterationOperation(this, number_to_fetch, callbacks)); | 131 new CursorPrefetchIterationOperation(this, number_to_fetch, callbacks)); |
132 } | 132 } |
133 | 133 |
134 void IndexedDBCursor::CursorPrefetchIterationOperation::Perform( | 134 void IndexedDBCursor::CursorPrefetchIterationOperation::Perform( |
135 IndexedDBTransaction* /*transaction*/) { | 135 IndexedDBTransaction* /*transaction*/) { |
136 IDB_TRACE("CursorPrefetchIterationOperation"); | 136 IDB_TRACE("CursorPrefetchIterationOperation"); |
137 | 137 |
138 std::vector<IndexedDBKey> found_keys; | 138 std::vector<IndexedDBKey> found_keys; |
139 std::vector<IndexedDBKey> found_primary_keys; | 139 std::vector<IndexedDBKey> found_primary_keys; |
140 std::vector<std::vector<char> > found_values; | 140 std::vector<std::string> found_values; |
141 | 141 |
142 if (cursor_->cursor_) | 142 if (cursor_->cursor_) |
143 cursor_->saved_cursor_.reset(cursor_->cursor_->Clone()); | 143 cursor_->saved_cursor_.reset(cursor_->cursor_->Clone()); |
144 const size_t max_size_estimate = 10 * 1024 * 1024; | 144 const size_t max_size_estimate = 10 * 1024 * 1024; |
145 size_t size_estimate = 0; | 145 size_t size_estimate = 0; |
146 | 146 |
147 for (int i = 0; i < number_to_fetch_; ++i) { | 147 for (int i = 0; i < number_to_fetch_; ++i) { |
148 if (!cursor_->cursor_ || !cursor_->cursor_->ContinueFunction()) { | 148 if (!cursor_->cursor_ || !cursor_->cursor_->ContinueFunction()) { |
149 cursor_->cursor_.reset(); | 149 cursor_->cursor_.reset(); |
150 break; | 150 break; |
151 } | 151 } |
152 | 152 |
153 found_keys.push_back(cursor_->cursor_->key()); | 153 found_keys.push_back(cursor_->cursor_->key()); |
154 found_primary_keys.push_back(cursor_->cursor_->primary_key()); | 154 found_primary_keys.push_back(cursor_->cursor_->primary_key()); |
155 | 155 |
156 switch (cursor_->cursor_type_) { | 156 switch (cursor_->cursor_type_) { |
157 case indexed_db::CURSOR_KEY_ONLY: | 157 case indexed_db::CURSOR_KEY_ONLY: |
158 found_values.push_back(std::vector<char>()); | 158 found_values.push_back(std::string()); |
159 break; | 159 break; |
160 case indexed_db::CURSOR_KEY_AND_VALUE: { | 160 case indexed_db::CURSOR_KEY_AND_VALUE: { |
161 std::vector<char> value; | 161 std::string value; |
162 value.swap(*cursor_->cursor_->Value()); | 162 value.swap(*cursor_->cursor_->Value()); |
163 size_estimate += value.size(); | 163 size_estimate += value.size(); |
164 found_values.push_back(value); | 164 found_values.push_back(value); |
165 break; | 165 break; |
166 } | 166 } |
167 default: | 167 default: |
168 NOTREACHED(); | 168 NOTREACHED(); |
169 } | 169 } |
170 size_estimate += cursor_->cursor_->key().size_estimate(); | 170 size_estimate += cursor_->cursor_->key().size_estimate(); |
171 size_estimate += cursor_->cursor_->primary_key().size_estimate(); | 171 size_estimate += cursor_->cursor_->primary_key().size_estimate(); |
172 | 172 |
173 if (size_estimate > max_size_estimate) | 173 if (size_estimate > max_size_estimate) |
174 break; | 174 break; |
175 } | 175 } |
176 | 176 |
177 if (!found_keys.size()) { | 177 if (!found_keys.size()) { |
178 callbacks_->OnSuccess(static_cast<std::vector<char>*>(NULL)); | 178 callbacks_->OnSuccess(static_cast<std::string*>(NULL)); |
179 return; | 179 return; |
180 } | 180 } |
181 | 181 |
182 callbacks_->OnSuccessWithPrefetch( | 182 callbacks_->OnSuccessWithPrefetch( |
183 found_keys, found_primary_keys, found_values); | 183 found_keys, found_primary_keys, found_values); |
184 } | 184 } |
185 | 185 |
186 void IndexedDBCursor::PrefetchReset(int used_prefetches, int) { | 186 void IndexedDBCursor::PrefetchReset(int used_prefetches, int) { |
187 IDB_TRACE("IndexedDBCursor::PrefetchReset"); | 187 IDB_TRACE("IndexedDBCursor::PrefetchReset"); |
188 cursor_.swap(saved_cursor_); | 188 cursor_.swap(saved_cursor_); |
(...skipping 10 matching lines...) Expand all Loading... |
199 } | 199 } |
200 | 200 |
201 void IndexedDBCursor::Close() { | 201 void IndexedDBCursor::Close() { |
202 IDB_TRACE("IndexedDBCursor::Close"); | 202 IDB_TRACE("IndexedDBCursor::Close"); |
203 closed_ = true; | 203 closed_ = true; |
204 cursor_.reset(); | 204 cursor_.reset(); |
205 saved_cursor_.reset(); | 205 saved_cursor_.reset(); |
206 } | 206 } |
207 | 207 |
208 } // namespace content | 208 } // namespace content |
OLD | NEW |