Changeset 87508 in webkit
- Timestamp:
- May 27, 2011 7:02:26 AM (13 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r87506 r87508 1 2011-05-27 Hans Wennborg <hans@chromium.org> 2 3 Reviewed by Tony Gentilcore. 4 5 IndexedDB: Support mutating cursors on top of LevelDB 6 https://bugs.webkit.org/show_bug.cgi?id=61615 7 8 New test for adding new entries to an objecet store while running a 9 cursor over it. 10 11 * storage/indexeddb/mutating-cursor-expected.txt: Added. 12 * storage/indexeddb/mutating-cursor.html: Added. 13 1 14 2011-05-27 Csaba Osztrogonác <ossy@webkit.org> 2 15 -
trunk/Source/WebCore/ChangeLog
r87507 r87508 1 2011-05-27 Hans Wennborg <hans@chromium.org> 2 3 Reviewed by Tony Gentilcore. 4 5 IndexedDB: Support mutating cursors on top of LevelDB 6 https://bugs.webkit.org/show_bug.cgi?id=61615 7 8 We need to support the case where a new node is added to the tree in a 9 transaction after the TreeIterator has covered the whole tree. 10 11 Since this is done lazily, i.e. we set a flag that the tree might have 12 changed, and act upon it later, some members need to be mutable, 13 because we might need to re-seek the tree iterator in a const function. 14 15 Test: storage/indexeddb/mutating-cursor.html 16 storage/indexeddb/mozilla/cursor-mutation-objectstore-only.html (existing) 17 18 * platform/leveldb/LevelDBTransaction.cpp: 19 (WebCore::LevelDBTransaction::set): 20 (WebCore::LevelDBTransaction::TreeIterator::reset): 21 (WebCore::LevelDBTransaction::TreeIterator::~TreeIterator): 22 (WebCore::LevelDBTransaction::TreeIterator::TreeIterator): 23 (WebCore::LevelDBTransaction::TransactionIterator::TransactionIterator): 24 (WebCore::LevelDBTransaction::TransactionIterator::~TransactionIterator): 25 (WebCore::LevelDBTransaction::TransactionIterator::next): 26 (WebCore::LevelDBTransaction::TransactionIterator::prev): 27 (WebCore::LevelDBTransaction::TransactionIterator::key): 28 (WebCore::LevelDBTransaction::TransactionIterator::value): 29 (WebCore::LevelDBTransaction::TransactionIterator::treeChanged): 30 (WebCore::LevelDBTransaction::TransactionIterator::refreshTreeIterator): 31 (WebCore::LevelDBTransaction::registerIterator): 32 (WebCore::LevelDBTransaction::unregisterIterator): 33 (WebCore::LevelDBTransaction::notifyIteratorsOfTreeChange): 34 * platform/leveldb/LevelDBTransaction.h: 35 * storage/IDBFactoryBackendImpl.cpp: 36 (WebCore::IDBFactoryBackendImpl::open): 37 * storage/IDBLevelDBBackingStore.cpp: 38 (WebCore::IDBLevelDBBackingStore::open): 39 1 40 2011-05-27 Sujin Park <sujjin.park@gmail.com> 2 41 -
trunk/Source/WebCore/platform/leveldb/LevelDBTransaction.cpp
r87370 r87508 88 88 89 89 if (newNode) 90 resetIterators();90 notifyIteratorsOfTreeChange(); 91 91 return true; 92 92 } … … 223 223 void LevelDBTransaction::TreeIterator::reset() 224 224 { 225 // FIXME: Be lazy: set a flag and do the actual reset next time we use the iterator. 226 if (isValid()) { 227 m_iterator.start_iter(*m_tree, m_key, TreeType::EQUAL); 228 ASSERT(isValid()); 229 } 225 ASSERT(isValid()); 226 m_iterator.start_iter(*m_tree, m_key, TreeType::EQUAL); 227 ASSERT(isValid()); 230 228 } 231 229 232 230 LevelDBTransaction::TreeIterator::~TreeIterator() 233 231 { 234 m_transaction->unregisterIterator(this);235 232 } 236 233 … … 239 236 , m_transaction(transaction) 240 237 { 241 transaction->registerIterator(this);242 238 } 243 239 … … 254 250 , m_current(0) 255 251 , m_direction(kForward) 256 { 252 , m_treeChanged(false) 253 { 254 m_transaction->registerIterator(this); 255 } 256 257 LevelDBTransaction::TransactionIterator::~TransactionIterator() 258 { 259 m_transaction->unregisterIterator(this); 257 260 } 258 261 … … 285 288 { 286 289 ASSERT(isValid()); 290 if (m_treeChanged) 291 refreshTreeIterator(); 287 292 288 293 if (m_direction != kForward) { … … 308 313 { 309 314 ASSERT(isValid()); 315 if (m_treeChanged) 316 refreshTreeIterator(); 310 317 311 318 if (m_direction != kReverse) { … … 337 344 { 338 345 ASSERT(isValid()); 346 if (m_treeChanged) 347 refreshTreeIterator(); 339 348 return m_current->key(); 340 349 } … … 343 352 { 344 353 ASSERT(isValid()); 354 if (m_treeChanged) 355 refreshTreeIterator(); 345 356 return m_current->value(); 357 } 358 359 void LevelDBTransaction::TransactionIterator::treeChanged() 360 { 361 m_treeChanged = true; 362 } 363 364 void LevelDBTransaction::TransactionIterator::refreshTreeIterator() const 365 { 366 ASSERT(m_treeChanged); 367 368 if (m_treeIterator->isValid()) { 369 m_treeIterator->reset(); 370 return; 371 } 372 373 if (m_dbIterator->isValid()) { 374 ASSERT(!m_treeIterator->isValid()); 375 376 // There could be new nodes in the tree that we should iterate over. 377 378 if (m_direction == kForward) { 379 // Try to seek tree iterator to something greater than the db iterator. 380 m_treeIterator->seek(m_dbIterator->key()); 381 if (m_treeIterator->isValid() && !m_comparator->compare(m_treeIterator->key(), m_dbIterator->key())) 382 m_treeIterator->next(); // If equal, take another step so the tree iterator is strictly greater. 383 } else { 384 // If going backward, seek to a key less than the db iterator. 385 ASSERT(m_direction == kReverse); 386 m_treeIterator->seek(m_dbIterator->key()); 387 if (m_treeIterator->isValid()) 388 m_treeIterator->prev(); 389 } 390 } 391 392 m_treeChanged = false; 346 393 } 347 394 … … 403 450 } 404 451 405 void LevelDBTransaction::registerIterator(Tr eeIterator* iterator)406 { 407 ASSERT(!m_ treeIterators.contains(iterator));408 m_ treeIterators.add(iterator);409 } 410 411 void LevelDBTransaction::unregisterIterator(Tr eeIterator* iterator)412 { 413 ASSERT(m_ treeIterators.contains(iterator));414 m_ treeIterators.remove(iterator);415 } 416 417 void LevelDBTransaction:: resetIterators()418 { 419 for (HashSet<Tr eeIterator*>::iterator i = m_treeIterators.begin(); i != m_treeIterators.end(); ++i) {420 Tr eeIterator* treeIterator = *i;421 tr eeIterator->reset();452 void LevelDBTransaction::registerIterator(TransactionIterator* iterator) 453 { 454 ASSERT(!m_iterators.contains(iterator)); 455 m_iterators.add(iterator); 456 } 457 458 void LevelDBTransaction::unregisterIterator(TransactionIterator* iterator) 459 { 460 ASSERT(m_iterators.contains(iterator)); 461 m_iterators.remove(iterator); 462 } 463 464 void LevelDBTransaction::notifyIteratorsOfTreeChange() 465 { 466 for (HashSet<TransactionIterator*>::iterator i = m_iterators.begin(); i != m_iterators.end(); ++i) { 467 TransactionIterator* transactionIterator = *i; 468 transactionIterator->treeChanged(); 422 469 } 423 470 } -
trunk/Source/WebCore/platform/leveldb/LevelDBTransaction.h
r87370 r87508 122 122 class TransactionIterator : public LevelDBIterator { 123 123 public: 124 ~TransactionIterator() { };124 ~TransactionIterator(); 125 125 static PassOwnPtr<TransactionIterator> create(PassRefPtr<LevelDBTransaction>); 126 126 … … 132 132 virtual LevelDBSlice key() const; 133 133 virtual LevelDBSlice value() const; 134 void treeChanged(); 134 135 135 136 private: … … 138 139 void setCurrentIteratorToSmallestKey(); 139 140 void setCurrentIteratorToLargestKey(); 141 void refreshTreeIterator() const; 140 142 141 143 RefPtr<LevelDBTransaction> m_transaction; 142 144 const LevelDBComparator* m_comparator; 143 OwnPtr<TreeIterator> m_treeIterator;145 mutable OwnPtr<TreeIterator> m_treeIterator; 144 146 OwnPtr<LevelDBIterator> m_dbIterator; 145 147 LevelDBIterator* m_current; … … 150 152 }; 151 153 Direction m_direction; 154 mutable bool m_treeChanged; 152 155 }; 153 156 154 157 bool set(const LevelDBSlice& key, const Vector<char>& value, bool deleted); 155 158 void clearTree(); 156 void registerIterator(Tr eeIterator*);157 void unregisterIterator(Tr eeIterator*);158 void resetIterators();159 void registerIterator(TransactionIterator*); 160 void unregisterIterator(TransactionIterator*); 161 void notifyIteratorsOfTreeChange(); 159 162 160 163 LevelDBDatabase* m_db; … … 162 165 TreeType m_tree; 163 166 bool m_finished; 164 HashSet<Tr eeIterator*> m_treeIterators;167 HashSet<TransactionIterator*> m_iterators; 165 168 }; 166 169
Note: See TracChangeset
for help on using the changeset viewer.